当前位置:   article > 正文

Spring Boot 中操作 Bean 的生命周期

Spring Boot 中操作 Bean 的生命周期
1.InitializingBean和DisposableBean

InitializingBean接口提供了afterPropertiesSet方法,用于在bean的属性设置好之后调用;

DisposableBean接口提供了destroy方法,用于在bean销毁之后调用;

  1. public class TestComponent implements InitializingBean, DisposableBean {
  2. @Override
  3. public void destroy() throws Exception {
  4. // 清理代码
  5. System.out.println("Bean is destroyed");
  6. }
  7. @Override
  8. public void afterPropertiesSet() throws Exception {
  9. // 初始化代码
  10. System.out.println("Bean is initialized");
  11. }
  12. }
2.PostConstruct和PreDestroy

PostConstruct用于依赖注入完成之后执行初始化方法;

PreDestroy用于在Bean销毁之前执行清理方法

  1. @PostConstruct
  2. public void init(){
  3. System.out.println("Bean is init");
  4. }
  5. @PreDestroy
  6. public void clean(){
  7. System.out.println("PreDestroy!");
  8. }
3.Bean 定义的 initMethod 和 destroyMethod

通过@Bean注解的两个属性,指定在Bean初始化和销毁的时候执行指定的方法;

  1. @Configuration
  2. public class TestConfig {
  3. @Bean(initMethod = "init", destroyMethod = "cleanup")
  4. public MyBean myBean() {
  5. return new MyBean();
  6. }
  7. public static class MyBean {
  8. public void init() {
  9. System.out.println("myBean init");
  10. }
  11. public void cleanup() {
  12. System.out.println("myBean cleanup");
  13. }
  14. }
  15. }
4.BeanPostProcessor接口

用于在bean初始化之前和初始化之后进行某种操作;主要有两个接口

postProcessBeforeInitialization:bean初始化之前执行某种操作

postProcessAfterInitialization:bean初始化之后执行某种操作

  1. @Component
  2. public class MyBeanPostProcessor implements BeanPostProcessor {
  3. @Override
  4. public Object postProcessBeforeInitialization(Object bean, String beanName) {
  5. System.out.println("postProcessBeforeInitialization:"+beanName);
  6. return bean;
  7. }
  8. @Override
  9. public Object postProcessAfterInitialization(Object bean, String beanName) {
  10. System.out.println("postProcessAfterInitialization:"+beanName);
  11. return bean;
  12. }
  13. }

注意:系统中的所有bean初始化都会调这两个方法;慎重使用

5.ApplicationContextAware和BeanNameAware
ApplicationContextAware提供setApplicationContext,可以获取spring的上下文
BeanNameAware提供setBeanName,可以获取当前bean的名称;
  1. @Component
  2. public class MyAwareBean implements ApplicationContextAware, BeanNameAware {
  3. private String beanName;
  4. private static ApplicationContext mApplicationContext;
  5. @Override
  6. public void setBeanName(String name) {
  7. this.beanName = name;
  8. // 记录 Bean 名称
  9. log.info("Bean name set to {}", name);
  10. }
  11. @Override
  12. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  13. mApplicationContext = applicationContext;
  14. }
  15. }
6.FactoryBean

接口定义如下

  1. public interface FactoryBean<T> {
  2. String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
  3. @Nullable
  4. T getObject() throws Exception;
  5. @Nullable
  6. Class<?> getObjectType();
  7. default boolean isSingleton() {
  8. return true;
  9. }
  10. }

作用是生成其他bean,示例:

  1. @Component
  2. public class MyFactoryBean implements FactoryBean<MyFactoryBean.MyCustomBean> {
  3. @Override
  4. public MyCustomBean getObject() throws Exception {
  5. return new MyCustomBean();
  6. }
  7. @Override
  8. public Class<?> getObjectType() {
  9. return MyCustomBean.class;
  10. }
  11. public class MyCustomBean {
  12. // 自定义 Bean 的逻辑
  13. private String a1 = "test";
  14. public String getA1() {
  15. return a1;
  16. }
  17. }
  18. }
7.EnvironmentAware, ResourceLoaderAware

EnvironmentAware提供了setEnvironment,实现了对Environment的操作;

ResourceLoaderAware提供了setResourceLoader,实现了对资源的操作;

  1. @Component
  2. public class MyEnvironmentAwareBean implements EnvironmentAware, ResourceLoaderAware {
  3. private Environment environment;
  4. private ResourceLoader resourceLoader;
  5. @Override
  6. public void setEnvironment(Environment environment) {
  7. this.environment = environment;
  8. }
  9. @Override
  10. public void setResourceLoader(ResourceLoader resourceLoader) {
  11. this.resourceLoader = resourceLoader;
  12. }
  13. }
8.BeanFactoryAware

可以获取到BeanFactory,然后操作spring中的bean

  1. import org.springframework.beans.factory.BeanFactory;
  2. import org.springframework.beans.factory.BeanFactoryAware;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. public class MyBeanFactoryAware implements BeanFactoryAware {
  6. private BeanFactory beanFactory;
  7. @Override
  8. public void setBeanFactory(BeanFactory beanFactory) {
  9. this.beanFactory = beanFactory;
  10. }
  11. }
9.profile

设置在某个环境时激活某个bean

  1. @Configuration
  2. public class MyConfiguration {
  3. @Bean
  4. @Profile("dev")
  5. public MyBean devMyBean() {
  6. System.out.println("MyBean dev");
  7. return new MyBean();
  8. }
  9. @Bean
  10. @Profile("prod")
  11. public MyBean prodMyBean() {
  12. System.out.println("MyBean prod");
  13. return new MyBean();
  14. }
  15. public static class MyBean {
  16. // Bean 实现
  17. }
  18. }
10.@Lazy、@DependsOn、@Order、@Conditional

Lazy用于延迟加载,当bean被注入的时候才进行加载;

DependsOn声明bean之间的依赖顺序,一个bean的加载依赖另外一个bean,确保一个bean先初始化之后,再加载另外一个bean;通常用来管理bean之间初始化顺序和依赖管理;

order用于bean初始化的顺序;

Conditional基于特定的条件才会创建bean;

  1. import org.springframework.context.annotation.*;
  2. import org.springframework.core.env.Environment;
  3. import org.springframework.core.type.AnnotatedTypeMetadata;
  4. @Configuration
  5. public class MyConfiguration {
  6. @Bean
  7. @Conditional({MyCondition.class})
  8. public MyBean myConditionalBean() {
  9. return new MyBean();
  10. }
  11. public static class MyBean {
  12. // Bean 实现
  13. }
  14. public static class MyCondition implements Condition {
  15. @Override
  16. public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
  17. Environment env = context.getEnvironment();
  18. // 定义条件逻辑
  19. return env.containsProperty("my.custom.condition");
  20. }
  21. }
  22. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/53876?site
推荐阅读
相关标签
  

闽ICP备14008679号