本着好记性不如烂笔头的原则,准备将每天学的东西整理一下。
此章记录下springbean的生命周期。
spring会基于spring上下文(Application Content)和Factory创建 默认为单例的bean。
下图是spring-bean的生命周期图解。
总的来说,spring-bean提供了两种创建方式,1是xml 2是注解
- xml创建主要依赖于ClassPathXmlApplicationContext类去创建。然后通过context.getBean(class)来获取bean实例对象。
- 而注解是依赖于AnnotationConfigApplicationContext类去创建,通过扫描路径,获取到类之后,判断类上是否有@Component、@config、@Service等注解,此处是用class原生的方法 Class.getAnnotatedInterfaces()判断的,然后调用BeanDefinitionParser提供的解析类去解析注解,Spring对配置类处理过程:org.springframework.context.annotation.ConfigurationClassPostProcessor#processConfigBeanDefinitions。其顶层接口是BeanDefinitionParser,BeanDefinitionParser中会有一个parse方法,返回解析好的BeanDefinition对象。
beanDefinition中存储着bean的所有配置信息,然后spring容器会根据beanDefinition去创建出具体的对象。
bean的生命周期大致可以分为 实例化==> 属性赋值==> 初始化 ==> 最后被销毁。
这边还是要看下refresh源码
二.spring生命周期之NoUniqueBeanDefinitionException报错解决
1 . primary设置为true,默认是false
2. autowire-candidate 设置为false 这边默认为true
详解:当有多个类型一样的bean的时候 恰好这个时候你用的@Autowire(byType)去实现注入的时候,spring无法判断你要注入的是哪一个bean因此会抛出异常。这边可以给其中一个bean配置primary,这样当spring发现有众多bean的时候 会去找primary为true的bean作为注入类。或者将其他bean的autowire-candidate的属性设置为false。因为spring查找的时候 是根据autowire-candidate为true且类型相同 2个条件去判断所需要注入的bean对象的。这边可以看下BeanDefinitionParserDelegate类。