1.调用构造器构造对象:
默认使用无参构造方法,若声明有参构造方法,则自动注入参数,调用有参构造方法(如果有多个有参构造方法,则会抛出无默认构造方法异常),如果参数在spring容器中无bean对象,即无法注入,则会抛出异常。若有多个有参构造方法,可使用@Autowired注解来标记默认使用的构造方法,同时根据protol注解的value来判断是否为单例,只有为单列时才会调用构造方法构造对象
2.注入属性:
spring会先扫描切入点(即被autowire等注解标注的属性),然后根据字段类型,扫描容器中所有的bean,找出符合该类型的所有bean,然后根据beanName找到对应的bean返回注入(详细过程后续介绍)
3.指定属性赋值
spring会判断当前bean对象是否实现了xxAware接口,若实现了该接口,则会进行相应属性的赋值,如BeanNameAware就会对BeanName属性进行赋值,本质是将生成bean对象过程中spring所生成出来的一系列对象返回给调用者
4.初始化前:
在初始化bean之前会先扫描该类中是否存在被@PostConstuct等注解标注的方法,如果有,则执行该方法,同时也会扫描是否有实现BeanPostProcessor接口的类,并将扫描到的类放入数组中,然后遍历每个对象,同时将生成好的bean遍历传入该对象的beforeinital方法中,执行初始化前置方法。
5.初始化:
初始化时会判断该类是否实现inialnaziBean接口,如果实现了该接口,则执行实现的方法(afterPropertiesSet())。当然spring在配置文件中也提供了init-method标签,用来指定初始化方法,也是在该步骤进行调用
6.初始化后:
遍历BeanPostProcessor接口实现对象,执行其afterinitialnize方法,用户可进行自定义,同时这也是spring实现aop的重要方式,一般会在此方法中,生成一个代理对象(jdk原生动态代理),故可以得知,最终放入容器中的为代理对象
7.初始化完成:
将初始化完成后的bean对象放入容器中等待调用
7.销毁
当spring容器被销毁时,容器中的bean也会被销毁,默认调用对象的destroy方法