通过 ApplicationContextAware 获取所有 Spring 托管的 Bean

2016-12-22 16:24:59   最后更新: 2016-12-22 16:24:59   访问数量:989




今天的开发中,遇到一个问题:

我需要创建某个 jar 包中的一个类对应的 bean,而在实例化这个类的过程中,必须传入我的一个 Service 作为参数,于是我如下创建 bean:

@Bean public ServiceFactoryBean techlogServiceFactory() { ServiceFactoryBean factoryBean = new ServiceFactoryBean(); factoryBean.setHandler(new TechlogService()); return factoryBean; }

 

 

这样创建虽然是 OK 的,但是问题在于,这样创建的结果将造成传入的 TechlogService 对象不是 Spring 生成的 Bean,因此 TechlogService 中的 @Resource、@Autowire 注解的成员都将无法被注入而成为了 null,这个问题怎么解决呢?

 

Spring 提供了 ApplicationContextAware 接口,在此前的日志中,我们介绍过 Bean 启动流程,曾经提到过这个接口:

Spring Bean

这个接口提供了 setApplicationContext 方法,可以将 Spring 的应用上下文注入到实现了这个接口的类中,通过这个上下文,我们可以获取到 Spring 的全部配置,因此我们可以让我们的配置类实现这个接口,从而获取应用上下文即可拿到 Spring 生成的所有 Bean,从而获取到由 Spring 托管的 Bean

@Configuration public class RootConfig implements ApplicationContextAware { private static BeanFactory beanFactory; @Bean public ServiceFactoryBean techlogServiceFactory() { ServiceFactoryBean factoryBean = new ServiceFactoryBean(); factoryBean.setHandler(beanFactory.getBean("techlogService", TechlogService.class)); return factoryBean; } @Override public void setApplicationContext(ApplicationContext applicationContext) { beanFactory = applicationContext; } }

 

这样就实现了 techlogServiceFactory 的创建,并且 techlogService 是由 Spring 托管从而完成全部注入的

 






技术帖      龙潭书斋      遗留问题      java      context      framework      已解决      spring      ioc      bean      applicationaware      beanfactory     


1#moneyache: (回复)2017-01-04 17:25:38

试试

京ICP备15018585号