大体分为实例化(Instantiation)和初始化(initialization)
实例化:是对象创建的过程。比如使用构造方法new对象,为对象在内存中分配空间。
初始化:是为对象中的属性赋值的过程
通过xml或者注解获得beanDifination,存入map
BeanPostProcessor接口
可以通过其中的after和before方法对bean对象进行操作
spring中有非常多类或接口继承实现了这个BeanPostProcessor接口。
前置处理器作用: 未知!
一般都是用后置处理器。
实例化
实例化前:
可以在这个before方法中返回某个自定义对象。此时还没有创建对象,在构造方法前执行。
实例化:
如果在上面的before方法中自定义了返回的对象,略过这步操作。
没有的话就针对BeanDifinition中定义的内容生成对象。
如果此类有多个构造参数,会默认调用无参构造器创建对象,没有无参就报错。
否则可以用Autowired手动选择构造器。
多个Autowired的话最多只能有一个required = true(默认就是true),不然也会报错。
多个false的话,spring会自动选择构造器。
自动选择的逻辑是,先找参数最多的,看看ioc中是否有足够的能够满足这个构造方法每个参数的bean(先根据Type匹配,再根据名字匹配); 否则再找参数个数第二的。。。
如果有多个多参构造器都满足要求,谁写前面用谁。
实例化后:
同样是after方法操作对象。
属性填充
初始化
前:
实现接口
InstantiationAwareBeanPostProcessor
初始化中:
方式一:
@PostConstruction 方法注解,在属性填充后先执行带有这个属性的方法。
方式二:
实现这个接口