Spring(Aware 接口、初始化与销毁)

Aware 接口提供了一种【内置】 的注入手段,例如

    • BeanNameAware 注入 bean 的名字
    • BeanFactoryAware 注入 BeanFactory 容器
    • ApplicationContextAware 注入 ApplicationContext 容器
    • EmbeddedValueResolverAware 注入 ${} 解析器

InitializingBean 接口提供了一种【内置】的初始化手段

对比

    • 内置的注入和初始化不受扩展功能的影响,总会被执行
    • 而扩展功能受某些情况影响可能会失效
    • 因此 Spring 框架内部的类常用内置注入和初始化

Aware系列接口的共性

  1. 都以“Aware”结尾
  2. 都是Aware接口的子接口,即都继承了Aware接口
  3. 接口内均定义了一个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 个初始化方法,那么它们的执行顺序是

  1. @PostConstruct 标注的初始化方法

  2. InitializingBean 接口的初始化方法

  3. @Bean(initMethod) 指定的初始化方法

 

 销毁也有三种

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值