Aware 接口提供了一种【内置】 的注入手段,例如
-
- BeanNameAware 注入 bean 的名字
- BeanFactoryAware 注入 BeanFactory 容器
- ApplicationContextAware 注入 ApplicationContext 容器
- EmbeddedValueResolverAware 注入 ${} 解析器
InitializingBean 接口提供了一种【内置】的初始化手段
对比
-
- 内置的注入和初始化不受扩展功能的影响,总会被执行
- 而扩展功能受某些情况影响可能会失效
- 因此 Spring 框架内部的类常用内置注入和初始化
Aware系列接口的共性
- 都以“Aware”结尾
- 都是Aware接口的子接口,即都继承了Aware接口
- 接口内均定义了一个set方法
Aware系列接口,主要用于辅助Spring bean访问Spring容器
实际上这样用
@Test
public void test1() {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = ac.getBean(User.class);
System.out.println("beanFactory:"+user.getBeanFactory());
System.out.println("beanName:"+user.getBeanName());
System.out.println("applicationContext:"+user.getAc());
System.out.println("classLoader:"+user.getClassLoader());
System.out.println(user);
}
容器的初始化操作流程
就是说有的时候@Autowired注解会失效 其实还有很多都会失效
失效的原因是Config类提前加载了,没有注册bean后加载器,自然@Autowired失效
因为有BeanFactoryPostProcessor的配置类 必须提前创建 Java 配置类这样才能调用BeanFactoryPostProcessor 但是这样的话 相当于这个类直接跳过bean生命周期,直接用最原始的方法初始化,这个类本身配置的一些在初始化之前需要用@autowired依赖注入的一些东西就没法实现了。
解决方法:
-
用内置依赖注入和初始化取代扩展依赖注入和初始化
-
用静态工厂方法代替实例工厂方法,避免工厂对象提前被创建
静态方法,类不用创建也能用
(132条消息) Spring Bean的生命周期(强烈推荐)_spring检测相关aware接口是在beanpostprocessor之前吗_lxin_ooo的博客-CSDN博客
Spring 提供了多种初始化手段,除了课堂上讲的 @PostConstruct,@Bean(initMethod) 之外,还可以实现 InitializingBean 接口来进行初始化,如果同一个 bean 用了以上手段声明了 3 个初始化方法,那么它们的执行顺序是
-
@PostConstruct 标注的初始化方法
-
InitializingBean 接口的初始化方法
-
@Bean(initMethod) 指定的初始化方法
销毁也有三种