spring

作者: C_99f1 | 来源:发表于2021-07-28 16:51 被阅读0次

bean

   @Component 是一种通用的注解,可以让spring容器自动注册
   @Repository, @Service, and @Controller 是更特殊化的 @Component 注解
   如@Repository  支持事务异常处理
   @RestController annotation from Spring MVC is composed of @Controller and 
   @ResponseBody.

    @Resource  -    根据字段name来注入
    @SpringBootTest     用junit-test 启动springBoot

初始化和销毁

实现InitializingBean  ,中重写afterPropertiesSet()  该bean对象会在初始化的时候被调用,   
DisposableBean 在对象被销毁的时候 回调 destroy()  方法.



preInstantiateSingletons()       会初始化所有的bean对象    从
Class-      DefaultListableBeanFactory         -            beanDefinitionNames 中拿到定义

beanUtil-instantiateClass


初始化bean 依赖    AbstractAutowireCapableBeanFactory-populateBean

refreshContext(context)-    invokeBeanFactoryPostProcessors(beanFactory);    初始

化 registerBeanDefinition  


isCandidateComponent  通过有没有注解来判断  是否加入candidate


    //spring 注入依赖
    ReflectionUtils.makeAccessible(field);
                field.set(bean, value);



大致描述一下 beanDefinition -

目前简单得讲最原始得一种 解析DefaultListableBeanFactory->beanDefinition
在refreshContext(context)- invokeBeanFactoryPostProcessors(beanFactory) 来填充beanDefinitionMap
通过springBoot得启动类 如SpringApplication.run(DemoSourceApplication.class, args);
拿到DemoSourceApplication.class, 得basepath. 通过JAVA Recoure 类 资源来解析下面所有得jar class文件, 装载进入一个集合, 在通过循环这个集合 解析是否 是否有注解 是否满足isCandidateComponent ,满足就加入 ,目前位置就会有所有需要初始化类得bean-definition

大致得初始化流程-

入口-

// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);

this.beanDefinitionNames 拿到所有得bean定义
通过AbstractBeanFactory->getbean 去实例化生成bean对象

这里实例化bean对象是通过原始java.lang 反射包去生成对象,
同时最重要的一点也是
如果对象中存在依赖,也是spring对象,

class A{
@Autoware
   B  b;
 }

 class B{
  @AutoWare
    C c;
}

class C{}

这时候spring得初始化顺序是 先初始化A , 在初始化 B 在初始化C
递归装载, 然后把C赋值给B , 在把B赋值给A
通过


ReflectionUtils.makeAccessible(field);
                field.set(bean, value);

初始化所有的 web-path

在requestMappingHandlerMapping 这个对象实例化的时候调用initializeBean-> invokeInitMethods ->.afterPropertiesSet()

初始化时关键一步 -

   // Create bean instance.
               if (mbd.isSingleton()) {
                   sharedInstance = getSingleton(beanName, () -> {
                       try {
                           return createBean(beanName, mbd, args);
                       }
                       catch (BeansException ex) {
                           // Explicitly remove instance from singleton cache: It might have been put there
                           // eagerly by the creation process, to allow for circular reference resolution.
                           // Also remove any beans that received a temporary reference to the bean.
                           destroySingleton(beanName);
                           throw ex;
                       }
                   });
                   bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
               }


在getObjectForBeanInstance  方法中如果这个初始化对象实现了FactoryBean
那么这个实列  会调用sharedInstance 中getObject () 方法 返回正在的实例
   

相关文章

网友评论

      本文标题:spring

      本文链接:https://www.haomeiwen.com/subject/kfcgyltx.html