SpringBoot中InitializingBean接口和ApplicationContextAware接口

本文介绍了SpringBoot中InitializingBean和ApplicationContextAware两个接口的用途。InitializingBean的afterPropertiesSet方法在Bean属性设置完成后被调用,而ApplicationContextAware则在Spring容器启动后,将ApplicationContext注入到实现类中。文章通过示例详细阐述了这两个接口的使用方法和场景。
摘要由CSDN通过智能技术生成

1. InitializingBean

  • 这个接口 InitailizingBean中只有一个方法,就是afterPropertiesSet。该方法是指Spring容器在启动后主动调用该接口的方法。
  • 如果一个Bean实现了InitializingBean,则该方法会在容器实例化该Bean,初始化Bean的属性完毕之后,再调用afterPropertiesSet方法。
  • afterPropertiesSet通过方法名称即可知道含义:在bean的属性设置完毕后调用该方法。

接口InitializingBean接口源码如下:

public interface InitializingBean {
   

    /**
     * 当Bean的属性被设置完毕后,由BeanFactory调用该方法。
     * 该方法允许bean的实例去执行一些初始化动作,当所有的bean属性完成设置之后执行。   
     */
    void afterPropertiesSet() throws Exception;
}

2. ApplicationContextWare

  • 名称带Aware,就可以知道这个接口由Spring容器主动通知调用。Spring容器在通知该接口的实现类时,会将上下文ApplicationContext注入进来。
  • 接口中就一个方法:
    void setApplicationContext(ApplicationContext applicationContext) throws BeansException
  • 即容器启动后,将ApplicationContext 注入到该方法中。

接口ApplicationContextWare源码如下:

public interface ApplicationContextAware extends Aware {
   
    void setApplicationContext(ApplicationContext var1) throws BeansException;
}

3. 例子

  • 3.1 枚举类FamilyEnum
package com.example.demo.blogTest;

public enum FamilyEnum {
   
    FATHER(45, "father"),
    MOTHER(42, "mother"),
    SON(18, "son");

    private Integer age;
    private String name;
    FamilyEnum(Integer age, String name) {
   
        this.age = age;
        this.name = name;
    }

    public Integer getAge() {
   
        return age;
    }

    public String getName() {
   
        return name;
    }
}
  • 3.2 自定义注入类FamilyHolder
package com.example.demo.blogTest
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot,你可以通过实现`FactoryBean`、`ApplicationContextAware`和`InitializingBean`接口来自定义Bean的创建和初始化过程。 首先,让我们看看如何实现`FactoryBean`接口: ```java import org.springframework.beans.factory.FactoryBean; public class MyFactoryBean implements FactoryBean<MyBean> { @Override public MyBean getObject() throws Exception { // 创建并返回自定义的Bean对象 return new MyBean(); } @Override public Class<?> getObjectType() { return MyBean.class; } @Override public boolean isSingleton() { return true; // 返回true表示该Bean是单例的 } } ``` 在上面的示例,`MyFactoryBean`类实现了`FactoryBean`接口,并重写了`getObject()`、`getObjectType()`和`isSingleton()`方法。通过实现这些方法,你可以定义自己的逻辑来创建和配置Bean。 接下来,让我们看看如何实现`ApplicationContextAware`接口: ```java import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationContext; public class MyApplicationContextAware implements ApplicationContextAware { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } // 可以在这里使用applicationContext访问其他Bean或执行其他操作 } ``` 在上面的示例,`MyApplicationContextAware`类实现了`ApplicationContextAware`接口,并重写了`setApplicationContext()`方法。通过重写该方法,你可以在Bean初始化时获得`ApplicationContext`对象,并在需要时使用它。 最后,让我们看看如何实现`InitializingBean`接口: ```java import org.springframework.beans.factory.InitializingBean; public class MyInitializingBean implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { // 在这里执行Bean的初始化逻辑 } } ``` 在上面的示例,`MyInitializingBean`类实现了`InitializingBean`接口,并重写了`afterPropertiesSet()`方法。在该方法,你可以实现自定义的Bean初始化逻辑。 请注意,以上示例的类都是自定义的类,你需要将它们注册为Spring Bean,可以使用`@Component`注解或在配置类进行配置。例如,在配置类添加如下代码: ```java @Configuration public class AppConfig { @Bean public MyFactoryBean myFactoryBean() { return new MyFactoryBean(); } @Bean public MyApplicationContextAware myApplicationContextAware() { return new MyApplicationContextAware(); } @Bean public MyInitializingBean myInitializingBean() { return new MyInitializingBean(); } } ``` 通过以上配置,你可以将自定义的FactoryBean、ApplicationContextAware和InitializingBean注册为Spring Bean,并在应用使用它们。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值