SpringBean 的初始化方法

  • 原文链接 https://www.yuque.com/zhoutao123/springboot/itg4ef/markdown

  • 更多文章欢迎访问 https://www.zhoutao123.com



Bean的初始化和销毁方法


初始化和销毁方法,单实例的Bean会在容器创建的时候被自动调用。但是需要注意的时候,如果是多实例的配置Bean,则会在获取该实例的时候被调用。

InitMethod & destoryMethod

在注入Bean的时候,可以指定Bean的 initdestroy 方法,这两个方法要求是 公有的的无参构造方法

  • init 方法将会在对象创建完成,成员变量赋值完成之后被创建
  • destroy方法将会在context被关闭的时候被调用。

public class Car {
     

  public Car() {
     
    System.out.println("Car.Car");
  }

  public void init() {
     
    System.out.println("Car.init");
  }

  public void destroy() {
     
    System.out.println("Car.destroy");
  }
}  


  // 注入Bean到IOC
  @Bean(initMethod = "init",destroyMethod = "destroy")
  public Car car(){
     
    return new Car();
  }


创建Spring上下文,可以看到控制台输出

public class AnnotationConfigClassPath {
     
  AnnotationConfigApplicationContext context;
  
  @Before
  public void init() {
     
    context = new AnnotationConfigApplicationContext(MainConfig.class);
  }

  @Test
  public void initComplete() {
     
    System.out.println("容器创建完成");
  }
}

控制台输出日志如下:

Car.Car
Car.init
容器创建完成
Car.destroy

InitializingBean & DisposableBean 接口

 除了通过在 `@Bean` 注解上添加初始化方法和销毁方法之外,也可以通过让Bean的class实现 `org.springframework.beans.factory.InitializingBean` 接口,然后实现其接口方法`afterPropertiesSet `来获得在对象创建被复制完成之后调用初始化的方法的能力,其被调用的方法为 `afterPropertiesSet()` ;通过实现 `org.springframework.beans.factory.DisposableBean` 接口,实现 `destroy` 方法来实现容器的销毁方法。
public class Car  implements InitializingBean, DisposableBean {
     

  public Car() {
     
    System.out.println("Car.Car");
  }
  
  public void destroy() {
     
    System.out.println("Car.destroy");
  }

  @Override
  public void afterPropertiesSet() throws Exception {
     
    System.out.println("Car.afterPropertiesSet");
  }
}

PostConstruct & PreDestroy 注解

这两个注解属于JSR250 规范的注解,Spring这里对这两个注解提供了支持,可以在Bean中指定无参的方法添加 @PostConstruct 或者 @PreDestory 注解来实现Bean的创建和销毁的生命周期方法。

public class Car {
     

  public Car() {
     
    System.out.println("Car.Car");
  }

  @PostConstruct
  public void postConstruct() {
     
    System.out.println("Car.postConstruct");
  }

  @PreDestroy
  public void preDestroy() throws Exception {
     
    System.out.println("Car.preDestroy");
  }
}

BeanPostProcessor 接口

从字面意思上来说,这个接口是Spring提供的Bean的_后置处理器_, 用于Bean的声明周期方法,此接口提供了两个方法。分别是在Bean创建完成之前,以及Bean的初始化回调方法之前或者之后调用(初始化回调方法值得是上文的多种初始化方法) ,其方法名分别为 postProcessBeforeInitialization(Object bean,String beanName) 以及 postProcessBeforeInitialization(Object bean, String beanName) ,其中的bean值得是当前class创建的bean实例,而beanName值得是当前bean在Spring容器的名称。


下面的代码是实现一个自定义的BeanPostProcessor , 需要注意的是,这个自定义的后置处理器需要被作为组件被扫描到Spring的容器中,否则不会生效,可以通过添加注解 @ComponentScan 注解方法实现

@Configurable
@ComponentScan("com.zhoutao123.spring")
public class MainConfig {
     }
@Component
public class CustomerBeanPostProcessor implements BeanPostProcessor {
     

  @Override
  public Object postProcessBeforeInitialization(Object bean, String beanName)
      throws BeansException {
     
    System.out.println("Car.postProcessBeforeInitialization");
    return bean;
  }

  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
     
    System.out.println("Car.postProcessAfterInitialization");
    return bean;
  }
}

你可能感兴趣的:(SpringBoot,&,SpringCloud)