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

网站数据库多大合适建设工程施工合同范文

网站数据库多大合适,建设工程施工合同范文,雅虎网站收录提交入口,深圳外贸网站建设哪家好Bean的生命周期就是指#xff1a;在Spring中#xff0c;一个Bean是如何生成的#xff0c;如何销毁的 Bean生命周期流程图 1、生成BeanDefinition Spring启动的时候会进行扫描#xff0c;会先调用org.springframework.context.annotation.ClassPathScanningCandidateCompo…Bean的生命周期就是指在Spring中一个Bean是如何生成的如何销毁的 Bean生命周期流程图 1、生成BeanDefinition Spring启动的时候会进行扫描会先调用org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#scanCandidateComponents(String basePackage) 扫描某个包路径并得到BeanDefinition的Set集合。 首先通过ResourcePatternResolver获得指定包路径下的所有.class文件Spring源码中将此文件包装成了Resource对象遍历每个Resource对象利用MetadataReaderFactory解析Resource对象得到MetadataReader在Spring源码中MetadataReaderFactory具体的实现类为CachingMetadataReaderFactoryMetadataReader的具体实现类为SimpleMetadataReader利用MetadataReader进行excludeFilters和includeFilters以及条件注解Conditional的筛选条件注解并不能理解某个类上是否存在Conditional注解如果存在则调用注解中所指定的类的match方法进行匹配匹配成功则通过筛选匹配失败则pass掉。筛选通过后基于metadataReader生成ScannedGenericBeanDefinition再基于metadataReader判断是不是对应的类是不是接口或抽象类如果筛选通过那么就表示扫描到了一个Bean将ScannedGenericBeanDefinition加入结果集 MetadataReader表示类的元数据读取器主要包含了一个AnnotationMetadata 2、合并BeanDefinition 通过扫描得到所有BeanDefinition之后就可以根据BeanDefinition创建Bean对象了。但是在Spring中支持父子BeanDefinition父子BeanDefinition实际用的比较少使用是这样的 这么定义的情况下child是单例Bean bean idparent classcom.wang.service.Parent scopeprototype/ bean idchild classcom.wang.service.Child/但是这么定义的情况下child就是原型Bean了。因为child的父BeanDefinition是parent所以会继承parent上所定义的scope属性。 bean idparent classcom.wang.service.Parent scopeprototype/ bean idchild classcom.wang.service.Child parentparent/而在根据child来生成Bean对象之前需要进行BeanDefinition的合并得到完整的child的BeanDefinition。 3、加载类 BeanDefinition合并之后就可以去创建Bean对象了。创建Bean就必须实例化对象而实例化就必须先加载当前BeanDefinition所对应的class在AbstractAutowireCapableBeanFactory类的createBean()方法中一开始就会调用。 if (mbd.hasBeanClass()) {return mbd.getBeanClass(); } if (System.getSecurityManager() ! null) {return AccessController.doPrivileged((PrivilegedExceptionActionClass?) () -doResolveBeanClass(mbd, typesToMatch), getAccessControlContext());} else {return doResolveBeanClass(mbd, typesToMatch); }如果beanClass属性的类型是Class那么就直接返回如果不是则会根据类名进行加载doResolveBeanClass方法所做的事情 4、实例化前 BeanDefinition对应的类成功加载后就可以实例化对象了。但是实例化对象之前Spring提供了一个扩展点允许用户来控制是否在某个或某些Bean实例化之前做一些启动动作。这个扩展点叫InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()。比如 Component public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor {Overridepublic Object postProcessBeforeInstantiation(Class? beanClass, String beanName) throws BeansException {if (userService.equals(beanName)) {System.out.println(实例化前);}return null;} }值得注意的是postProcessBeforeInstantiation()是有返回值的如果这么实现 userService这个Bean在实例化前会直接返回一个由我们所定义的UserService对象。如果是这样表示不需要Spring来实例化了并且后续的Spring依赖注入也不会进行了会跳过一些步骤直接执行初始化后这一步。 Component public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor {Overridepublic Object postProcessBeforeInstantiation(Class? beanClass, String beanName) throws BeansException {if (userService.equals(beanName)) {System.out.println(实例化前);return new UserService();}return null;} }5、实例化 在这个步骤中就会根据BeanDefinition去创建一个对象了。 5.1 Supplier创建对象 首先判断BeanDefinition中是否设置了Supplier如果设置了则调用Supplier的get()得到对象。 得直接使用BeanDefinition对象来设置Supplier比如 AbstractBeanDefinition beanDefinition BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition(); beanDefinition.setInstanceSupplier(new SupplierObject() {Overridepublic Object get() {return new UserService();} }); context.registerBeanDefinition(userService, beanDefinition);5.2 工厂方法创建对象 如果没有设置Supplier则检查BeanDefinition中是否设置了factoryMethod bean iduserService classcom.wang.service.UserService factory-methodcreateUserService /对应的UserService类为 public class UserService {public static UserService createUserService() {System.out.println(执行createUserService());UserService userService new UserService();return userService;}public void test() {System.out.println(test);}}5.3 推断构造方法 前面有讲到 Spring源码二Spring底层架构核心概念解析 额外的在推断构造方法逻辑中除开会去选择构造方法以及查找入参对象意外会还判断是否在对应的类中是否存在使用Lookup注解了方法。如果存在则把该方法封装为LookupOverride对象并添加到BeanDefinition中。 在实例化时如果判断出来当前BeanDefinition中没有LookupOverride那就直接用构造方法反射得到一个实例对象。如果存在LookupOverride对象也就是类中存在Lookup注解了的方法那就会生成一个代理对象。 6、BeanDefinition的后置处理 Bean对象实例化出来之后接下来就应该给对象的属性赋值了。在真正给属性赋值之前Spring又提供了一个扩展点MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()可以对此时的BeanDefinition进行加工比如 Component public class MyMergedBeanDefinitionPostProcessor implements MergedBeanDefinitionPostProcessor {Overridepublic void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class? beanType, String beanName) {if (userService.equals(beanName)) {beanDefinition.getPropertyValues().add(orderService, new OrderService());}} }7、实例化后 在处理完BeanDefinition后Spring又设计了一个扩展点InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()比如 Component public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {Overridepublic boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {if (userService.equals(beanName)) {UserService userService (UserService) bean;userService.test();}return true;} }8.、自动注入 Spring的自动注入 9、处理属性 这个步骤中就会处理Autowired、Resource、Value等注解也是通过InstantiationAwareBeanPostProcessor.postProcessProperties()扩展点来实现的我们可以实现一个自己的自动注入功能比如 Component public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {Overridepublic PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {if (userService.equals(beanName)) {for (Field field : bean.getClass().getFields()) {if (field.isAnnotationPresent(ZhouyuInject.class)) {field.setAccessible(true);try {field.set(bean, 123);} catch (IllegalAccessException e) {e.printStackTrace();}}}}return pvs;} }10、执行Aware 完成了属性赋值之后Spring会执行一些回调包括 BeanNameAware回传beanName给bean对象。BeanClassLoaderAware回传classLoader给bean对象。BeanFactoryAware回传beanFactory给对象。 11、初始化前 Spring提供的一个扩展点BeanPostProcessor.postProcessBeforeInitialization() Component public class MyBeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (userService.equals(beanName)) {System.out.println(初始化前);}return bean;} }利用初始化前可以对进行了依赖注入的Bean进行处理 12、初始化 查看当前Bean对象是否实现了InitializingBean接口如果实现了就调用其afterPropertiesSet()方法执行BeanDefinition中指定的初始化方法 13、初始化后 Spring提供的一个扩展点BeanPostProcessor.postProcessAfterInitialization() 可以在这个步骤中对Bean最终进行处理Spring中的AOP就是基于初始化后实现的初始化后返回的对象才是最终的Bean对象。 Component public class ZhouyuBeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (userService.equals(beanName)) {System.out.println(初始化后);}return bean;} }14、Bean销毁 Bean销毁是发送在Spring容器关闭过程中的。 可以直接在方法上加上 PreDestroy 注解或者实现DisposableBean 接口 只有单例bean 才会执行destroy方法原型bean不会。原型bean每次调用getBean时候, 返回的都是新对象 Component public class User implements DisposableBean {Overridepublic void destroy() throws Exception {System.out.println(xxxx);} } 总结一下主要无非四个阶段 实例化Instantiation 属性赋值Populate 初始化Initialization 销毁Destruction
http://www.hkea.cn/news/14268663/

相关文章:

  • wordpress移动到回收站时发生错误网站英文域名是什么
  • 做网站前产品经理要了解什么天津房地产集团网站建设
  • 2018网站内容和备案不同类型网站栏目设置区别
  • 长春网站制作允许吗钉钉小程序开发平台
  • 公司的网站设计方案哈尔滨网站建设推广方案
  • 桂阳做网站的软件定制开发外包人社网站和微信平台建设方案
  • 深圳有做网站的公司有哪些做网站商城需要多少钱
  • 帮他人做视频网站违法吗php网站哪些
  • 府谷网站建设网站建设与制作设计公司
  • 怎样做自己的微商网站多少钱一斤怎么算
  • ueeshop外贸建站公司espcms易思企业网站
  • 做局域网网站河南省新闻联播
  • 有做教育行业的招聘网站吗现在的公司都有自己的网站吗
  • wordpress 文章版权济南外贸seo
  • 上海创意网站建设新网站 seo
  • 跨境建站服务公司制作报价网站
  • 一般什么行业做网站的多英文网站建设的请示怎么写
  • 为学校网站建设阿里巴巴开网店的详细步骤
  • 外网室内设计网站别人做的网站不能用怎么办
  • 怎样给自己的店做网站网络营销推广的主要形式
  • 一般网站维护要多久nginx进wordpress不能进目录
  • 福州火车站最新消息磁力猫搜索引擎入口官网
  • 广州专业网站改版免费的在线学习网站
  • 国外网站空间租用费用中山网站建设金科
  • 郑州建站的怎么在百度自己创网站
  • 济南做网站企业什么建站公司好
  • 个人网站开发主要问题宁波自助建站公司
  • 十大行情软件网站下载wordpress网站源码
  • 网站广告投放收费标准网站规划建设与管理维护答案
  • 网站的页面由什么组成部门网站建设管理典型经验材料