05-Spring内置接口

准备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();
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

层巅余落日

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值