spring 监听bean 加载

package com.until;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

/**
 * 测试类   打印出加载的bean
 * @author Administrator
 *
 */
public class SpringBeanInitProcesser implements BeanPostProcessor {

 public Object postProcessAfterInitialization(Object bean, String beanName)
   throws BeansException {
  // TODO Auto-generated method stub
  //System.out.println("Bean '" + beanName + "' created : " + bean.toString());
  return bean;
 }

 public Object postProcessBeforeInitialization(Object bean, String beanName)
   throws BeansException {
  // TODO Auto-generated method stub
  System.out.println("Bean '" + beanName + "' created : " + bean.toString());
  return bean;
 }


}

### SpringBean加载顺序控制方法 在 Spring 应用程序中,有时需要显式地指定某些 Bean 的初始化顺序。以下是几种常见的方式来实现这一目标: #### 方法一:使用 `@DependsOn` 注解 `@DependsOn` 是一种简单而有效的方法,用于强制一个 Bean 在另一个 Bean 初始化之前被创建。此注解可以用来解决复杂依赖关系中的问题。 ```java @Component @DependsOn("goodsManager") // 确保 goodsManager 首先被加载 public class AnotherComponent { public void doSomething() { GoodsManager.getInstance().listAllGoods(); } } @Component public class GoodsManager { private static final GoodsManager instance = new GoodsManager(); public static GoodsManager getInstance() { return instance; } @PostConstruct public void init() { System.out.println("Initializing Goods Manager..."); loadGoodsFromDatabase(); // 模拟从数据库加载商品 } private void loadGoodsFromDatabase() { // 数据库操作逻辑... } } ``` 这种方法适用于那些不直接注入到其他 Bean 中但仍需按特定顺序初始化的组件[^1]。 --- #### 方法二:使用 `@Order` 或实现 `Ordered` 接口 尽管 `@Order` 和 `Ordered` 不直接影响 Bean 的 **加载顺序**,但它确实会影响基于回调机制的操作(如事件监听器或拦截器)。因此,在某些情况下可以通过这种方式间接影响行为顺序。 需要注意的是,`@Order` 只能决定相同类型的多个 Bean 执行时的优先级,而非它们的实际加载时间。 ```java @Component @Order(1) // 定义较高的优先级 public class FirstService implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("First Service Initialized"); } } @Component @Order(2) public class SecondService implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("Second Service Initialized"); } } ``` 上述代码片段展示了两个服务按照定义好的顺序依次执行其生命周期方法[^2]。 --- #### 方法三:自定义 SmartLifecycle 实现 对于更高级的需求,比如希望某个 Bean 能够参与应用上下文启动过程并主动触发一些动作,则可考虑让该类继承 `SmartLifecycle` 并重写相应函数。 ```java @Component public class CustomLifecycle implements SmartLifecycle { private boolean isRunning; @Override public void start() { if (!isRunning){ initializeResources(); this.isRunning=true; } } @Override public void stop(){ releaseResources(); this.isRunning=false; } @Override public boolean isAutoStartup() {return true;} private void initializeResources(){ System.out.println("Custom Lifecycle Started."); } private void releaseResources(){ System.out.println("Custom Lifecycle Stopped."); } } ``` 这里展示了一个典型的例子——通过覆盖 `start()` 函数来自定义业务逻辑,并利用框架自动调用这些钩子完成资源分配与释放工作流[^3]。 --- ### 总结 以上介绍了三种主要方式来调整 Spring Bean加载次序。实际开发过程中应根据具体需求选择合适的技术手段加以运用。无论是采用简单的 `@DependsOn` 还是更为灵活的 `SmartLifecycle` 设计模式,都能很好地满足不同层次上的定制化诉求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值