当前位置: 首页 > news >正文

网站建设计划表php asp jsp 网站

网站建设计划表,php asp jsp 网站,毕业设计做网站好的想法,html5 mysql 网站开发前言这篇文章会重点分析一下SmartInitializingSingleton扩展点的功能 特性、实现方式 、工作原理。SmartInitializingSingleton扩展点内只有一个扩展方法#xff0c;且执行时机在Spring Bean的生命周期里比较靠后#xff0c;很重要#xff0c;但是也很简单。功能特性1、Smar…前言这篇文章会重点分析一下SmartInitializingSingleton扩展点的功能 特性、实现方式 、工作原理。SmartInitializingSingleton扩展点内只有一个扩展方法且执行时机在Spring Bean的生命周期里比较靠后很重要但是也很简单。功能特性1、SmartInitializingSingleton主要用于在Spring容器启动完成时进行扩展操作即afterSingletonsInstantiated()2、实现SmartInitializingSingleton接口的bean的作用域必须是单例afterSingletonsInstantiated()才会触发3、afterSingletonsInstantiated()触发执行时非懒加载的单例bean已经完成实现化、属性注入以及相关的初始化操作3、afterSingletonsInstantiated()的执行时机是在DefaultListableBeanFactory#preInstantiateSingletons()关于Spring bean有七种作用域默认singleton(单例)、prototype、request、session、globalSession、application、websocket1、singleton(单例)Spring容器只会创建一个bean对象2、prototype每次获取bean都会重新创建一个bean对象3、request对于每一个http请求在同一个请求内Spring容器只会创建一个bean对象若请求结束bean也随之销毁4、session在同一个http会话里Spring容器只会创建一个bean对象若传话结束也随之销毁5、globalSessionglobalSession作用域的效果与session作用域类似但是只适用于基于portlet的web应用程序中6、application在servlet程序中该作用域的bean将会作为ServletContext对象的属性被全局访问与singleton的区别就是singleton作用域的bean在Spring容器中只一application作用域的bean在ServletContex中唯一7、websocket为每个websocket对象创建一个实例。仅在Web相关的ApplicationContext中生效。实现方式 这里用一个示例验证SmartInitializingSingleton的功能特性并且通过debug分析其工作过程1、定义Dog类以setter注入方式进行属性注入同时Dog类实现SmartInitializingSingleton接口重写afterSingletonsInstantiated()并在方法内部打印日志如果在实际业务开发过程中用到了这个扩展点相关的扩展操作逻辑就是在这个方法内实现Slf4j public class Dog implements InitializingBean, DisposableBean, SmartInitializingSingleton {private String name wang cai;private Food food;public Dog() {log.info(----Dog的无参构造方法被执行);}Autowiredpublic void setFood(Food food) {this.food food;log.info(----dog的food属性被注入);}Overridepublic void afterPropertiesSet() throws Exception {log.info(----com.fanfu.entity.Dog.afterPropertiesSet触发执行);}public void myInitMethod() {log.info(----com.fanfu.entity.Dog.myInitMethod触发执行);}Overridepublic void destroy() throws Exception {log.info(----com.fanfu.entity.Dog.destroy触发执行);}Overridepublic void afterSingletonsInstantiated() {log.info(----com.fanfu.entity.Dog.afterSingletonsInstantiated触发执行);} }2、定义Food类作为Dog类的一个属性Slf4j public class Food {private String name 大骨头;public Food() {log.info(----Food的无参数构造方法被执行);} }3、使用Configuration配置类的方式注册Dog、Food到Spring容器里默认是单例对象Configuration public class SpringConfig {Bean(initMethod myInitMethod)public Dog dog(){Dog dog new Dog();return dog;}Beanpublic Food food(){Food food new Food();return food;} }4、单元测试用于验证结果 Testpublic void test5(){log.info(----单元测试执行开始);AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(com.fanfu);log.info(----单元测试执行完毕);}工作原理 如果我分享的关于Springboot扩展点系统的文章从头都一点一点自己debug看过的话一定对AbstractApplicationContext#refresh()不陌生与Spring容器启动相关的核心逻辑都在这个方法中。1、在AbstractApplicationContext#refresh()中会发现调用了finishBeanFactoryInitialization()从上面的注释可以看出这个方法昌要实例化所有非懒加载的单例bean2、进入到finishBeanFactoryInitialization()方法内做了一些beanFactory的准备工作后调用preInstantiateSingletons()开始非懒加载的单例bean实例化3、继续往下实际上是调用 了DefaultListableBeanFactory#preInstantiateSingletons()单独看这个方法逻辑相对简单分为两部分第一部分bean的实例化、属性注入、相关初始化操作第二部分找出所有实现了SmartInitializingSingleton接口的实现类遍历并执行afterSingletonsInstantiated()public void preInstantiateSingletons() throws BeansException {//----------start------------------实例化bean----------------------------------------if (logger.isTraceEnabled()) {logger.trace(Pre-instantiating singletons in this);}ListString beanNames new ArrayList(this.beanDefinitionNames);// Trigger initialization of all non-lazy singleton beans...for (String beanName : beanNames) {RootBeanDefinition bd getMergedLocalBeanDefinition(beanName);if (!bd.isAbstract() bd.isSingleton() !bd.isLazyInit()) {if (isFactoryBean(beanName)) {Object bean getBean(FACTORY_BEAN_PREFIX beanName);if (bean instanceof FactoryBean) {FactoryBean? factory (FactoryBean?) bean;boolean isEagerInit;if (System.getSecurityManager() ! null factory instanceof SmartFactoryBean) {isEagerInit AccessController.doPrivileged((PrivilegedActionBoolean) ((SmartFactoryBean?) factory)::isEagerInit,getAccessControlContext());}else {isEagerInit (factory instanceof SmartFactoryBean ((SmartFactoryBean?) factory).isEagerInit());}if (isEagerInit) {getBean(beanName);}}}else {getBean(beanName);}}}//----------end------------------实例化bean----------------------------------------//----------start------------------SmartInitializingSingleton#afterSingletonsInstantiated----------------------------------------for (String beanName : beanNames) {Object singletonInstance getSingleton(beanName);//判断单例bean是否实现了SmartInitializingSingleton接口if (singletonInstance instanceof SmartInitializingSingleton) {SmartInitializingSingleton smartSingleton (SmartInitializingSingleton) singletonInstance;if (System.getSecurityManager() ! null) {AccessController.doPrivileged((PrivilegedActionObject) () - {smartSingleton.afterSingletonsInstantiated();return null;}, getAccessControlContext());}else {//执行afterSingletonsInstantiated()smartSingleton.afterSingletonsInstantiated();}}}//----------start------------------SmartInitializingSingleton#afterSingletonsInstantiated---------------------------------------- }总结如果要在业务开发中使用SmartInitializingSingleton扩展点需要特别注意实现这个接口的bean应该是非懒加载的单例bean执行时机是在bean完成实例化、属性注入、相关初始化操作后否则无法触发执行。
http://www.hkea.cn/news/14434714/

相关文章:

  • 网站建设维护价格windows与wordpress
  • 可以自己做网站做宣传吗事业单位门户网站开发
  • 网站建设与维护新的体会好的免费博客网站
  • 做网站学cdr吗可以自己做网站这么做
  • 怎么查询网站是哪家公司做的常州金坛网站建设
  • 网站建设方案多少钱网站型建设模板
  • 新东方广州门户网站WordPress怎么安装不了
  • 网站制作可以卖多少钱wordpress垂直模板
  • 郑州服装网站建设广州注册公司的流程及费用
  • 德阳企业品牌网站建设运营网站开发工作
  • 公司网站制作公新网站建设脑图
  • 交三百能在网站上找兼职做的什么是网络营销的市场细分
  • 毕业设计代做网站都可信么wordpress社交图标
  • 云南省建设厅网站有了网站源码如何做网页
  • 梓潼 网站建设 有限公司怎么给自己的品牌做网站
  • 网站教程君临天下游戏网站开发者
  • 网页制作和网站建设的区别微小旅行社能否做网站
  • 南宁企业建站系统多语言外贸网站制作
  • 做旅游网站会遇到什么问题软件开发公司app
  • 网站页面布局图网页策划方案
  • 网站设计用什么软件网站如何做微信支付
  • 微信公众号商城网站开发陕西百威建设监理有限司网站
  • dw个人网站制作教程做图片的网站
  • 互联网招聘网站排行wordpress 电子杂志
  • 有没有专门做平铺素材的网站网站创建的基本流程
  • 浙江网站备案wordpress 页码显示
  • 电子商务网站建设收益网站备案信息注销
  • 做那个网站销售产品比较好好看的ui网站页面设计
  • 怎么自己做网站赚钱百度指数分析大数据
  • 安丘做网站嘉祥县建设局官方网站