在开源软件中常常使用relativePath解决依赖顺序问题
beanFactory applicationContext区别
beanFactory一个基本ioc容器, applicationContext在其基础上提供了更多的功能
applicaitonContext 继承beanFatory, 但是applicaiotnContext是通过组合了一个beanFactory(DefaultListableBeanFactory) 的方式使用beanFactory的基础功能的
ApplicationContext组装了一个BeanFactory的实现,并且增加了AOP等功能特性
BeanFactory 是 Bean 容器,它不提供企业特性,比如 AOP、事务以及 事件等,这些都被 ApplicationContext 支持。
ApplicationContext 才区分 XML 和注解,BeanFactory 通常只管理 BeanDefinition 和其 Bean 实例。
Spring Boot 2.0 深度实践之核心技术篇-慕课网实战 springmvc springboot 资料
Spring中Bean的初始化方式有哪些?
● 构造器方式初始化
● 静态工厂方法初始化 ○ 比如XML中bean标签的factory-method属性指定静态工厂方法
● 工厂方法方式初始化 ○ 比如定义一个UserFactory类和内部的一个createUser()非静态方法;然后在XML中定义一个bean标签并指定其属性factory-bean和factory-method分别为前工厂的对应类和方法名。
● FactoryBean方式初始化 ○ 定义一个UserFactoryBean并实现FactoryBean接口并实现其getObject()方法和getObjectType()方法。然后直接再XML中定义bean标签其class属性就是UserFactoryBean全限定名称即可。
● JDK的ServiceLoader方式初始化(SPI) ○ 在classpath的META-INF/servives下创建一个文件,名称是某接口的全限定名称,文件无后缀。文件中直接写上接口实现类的全限定名。然后使用ServiceLoader相关的api即可实现接口实现类的实例化。
● ServiceLoaderFactoryBean获取ServiceLoader方式初始化,类似上一个。
● AutowireCapableBeanFactory的createBean(Class<?> class)方法初始化 ○ 注意class参数不能是接口或者抽象类,否则不能初始化
BeanFactoryPostProcessor和BeanPostProcessor
注意:BeanFactoryPostProcessor是在spring容器加载了bean的定义文件之后,在bean实例化之前执行的。接口方法的入参是ConfigurrableListableBeanFactory,使用该参数,可以获取到相关bean的定义信息,例子:
注意:BeanPostProcessor是在spring容器加载了bean的定义文件并且实例化bean之后执行的。BeanPostProcessor的执行顺序是在BeanFactoryPostProcessor之后。
Spring的BeanFactoryPostProcessor和BeanPostProcessor_江南好风景的博客-CSDN博客_beanpostprocessor和beanfactory
bean的生命周期
BeanDefinition的创建方式
1.通过xml或者properties资源来创建
2.通过@bean, @Configuration,@Component 等注解定义
3.通过api直接创建BeanDefinition(BeanDefinitionBuilder等api)
SpringApplicationContext 应用上下文生命周期