通常情况下,我们总是使用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
如何工作,可以参考这篇文章。