准备Bean
public class MyBean implements BeanNameAware, ApplicationContextAware,
BeanFactoryAware, InitializingBean, DisposableBean {
@Override
public void setBeanName(String name) {
System.err.println("当前bean:" + this + ",beanName是" + name);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.err.println("当前bean:" + this + ",applicationContext是" + applicationContext);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.err.println("当前bean:" + this + ",beanFactory是" + beanFactory);
}
@Override
public void afterPropertiesSet() throws Exception {
System.err.println("当前bean:" + this + ",初始化");
}
@PostConstruct
public void init() {
System.err.println("当前bean:" + this + ",@PostConstruct初始化");
}
@Override
public void destroy() throws Exception {
System.err.println("当前bean:" + this + ",销毁");
}
@PreDestroy
public void b() {
System.err.println("当前bean:" + this + ",@PreDestroy销毁");
}
@Autowired
public void a(ApplicationContext applicationContext) {
System.err.println("当前bean:" + this + ",通过@Autowired获得的applicationContext是" + applicationContext);
}
}
测试
GenericApplicationContext applicationContext = new GenericApplicationContext();
applicationContext.registerBean("myBean", MyBean.class);
applicationContext.refresh();
applicationContext.close();
内置接口与注入的方式区别
:::info
Aware类接口主要是注入一些容器相关的信息
1. BeanFactoryAware 注入BeanFactory
2. BeanNameAware 注入Bean名字
3. ApplicationContextAware 注入ApplicationContext
@Autowired也可以注入这些对象 但是@Autowired生效需要BeanPostProcessor属于扩展功能,而实现这些接口属于内置功能并且在某些情况下@Autowired功能会失效
:::
@Configuration
public class MyConfig {
@Autowired
public void setApplicationContext(ApplicationContext applicationContext) {
System.out.println("MyConfig.setApplicationContext:" + applicationContext);
}
@PostConstruct
public void init() {
System.out.println("init");
}
@Bean
public BeanFactoryPostProcessor postProcessor1() {
return beanFactory -> {
System.out.println("MyConfig.postProcessor1");
};
}
}
GenericApplicationContext applicationContext = new GenericApplicationContext();
applicationContext.registerBean("myBean", MyBean.class);
/**
* 在MyConfig中添加BeanFactoryProcessor导致@Autowired @Resource and @PostConstruct 失效
*/
applicationContext.registerBean("myConfig", MyConfig.class);
applicationContext.registerBean(ConfigurationClassPostProcessor.class);
applicationContext.registerBean(AutowiredAnnotationBeanPostProcessor.class);
applicationContext.registerBean(CommonAnnotationBeanPostProcessor.class);
applicationContext.refresh();
applicationContext.close();