public class AwareBean implements BeanFactoryAware, BeanNameAware, ApplicationContextAware, InitializingBean {
private String beanName;
private ApplicationContext applicationContext;
private BeanFactory beanFactory;
@Override
public void setBeanName(String beanName) {
System.out.println("--Enter AwareBean.setBeanName(), beanName = " + beanName + "\n");
this.beanName = beanName;
}}
<bean id="awareBean" class="com.flynn.AwareBean">
<property name="beanName" value="awareBean2"/>
</bean>
上面setBeanName会执行2次 。先是setter注入然后是构造器注入。
--Enter AwareBean.setBeanName(), beanName = awareBean2
--Enter AwareBean.setBeanName(), beanName = awareBean
<bean id="awareBean" class="com.flynn.AwareBean">
</bean>
构造器注入 ,只执行一次。
经过试验得知,Spring注入Bean,实例化一个Bean的时候,顺序如下:
1. 这个class的构造函数被执行;
2.Setter被执行;
3.如果这个class实现了InitializingBean(即implements InitializingBean)则,接下来执行public void afterPropertiesSet() throws Exception() 中的内容。