通常情况下,我们总是使用Spring容器完全托管的bean组件,实例的创建和属性注入都由框架自动完成,开发人员可以将注意力集中到业务逻辑上。但在有些情况下,bean在容器外部创建,对于这种生命周期不完全受容器控制的bean,其中的@Autowired/@Value注解缺省是不生效的,换句话讲,对于这种bean,容器不会对它们进行自动注入。这种情况下,如果需要对这些bean进行这些属性的注入,就需要使用其他的方法。SpringBeanAutowiringSupport就是框架提供的一个这样的工具类,用于手工触发一个bean的依赖注入。
SpringBeanAutowiringSupport提供了两个静态工具方法 :
-
public static void processInjectionBasedOnCurrentContext(Object target)
该方法会使用ContextLoader.getCurrentWebApplicationContext()获取当前Web应用上下文,然后对目标bean target触发依赖注入。 -
public static void processInjectionBasedOnServletContext(Object target, ServletContext servletContext)
该方法会使用指定的servletContext,获取它对应的Web应用上下文,然后对目标bean target触发依赖注入。
以上两个工具方法基于所获取到的Web应用上下文对目标对象执行依赖注入的逻辑都是一样的,如下所示 :
// WebApplicationContext cc 是所获取得到的Web应用上下文
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
bpp.setBeanFactory(cc.getAutowireCapableBeanFactory());
bpp.processInjection(target);
关于
AutowiredAnnotationBeanPostProcessor及其方法processInjection如何工作,可以参考这篇文章。
通常容器完全托管组件,实例创建和属性注入由框架自动完成。但容器外创建的组件,注解缺省不生效,容器不会自动注入。此时需用其他方法,框架提供工具类可手工触发依赖注入,还介绍了两个静态工具方法及注入逻辑。
102

被折叠的 条评论
为什么被折叠?



