如何确保Spring Beans的装载顺序?

时间:2016-09-18 01:25:38

标签: java spring servlets

我有一个第三方jar,它提供了我项目中使用的servlet过滤器。在servlet过滤器中有一个静态块初始化静态对象。

我正在做的是使用反射来检索静态对象并对其进行修改。

配置如下:

<filter>
  <filter-name>thirdPartyFilter</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
  <filter-name>thirdPartyFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

其中thirdPartyFilter在xml中定义

<bean id="thirdPartyFilter" class="com.abc.ThirdPartyFilter" />

简单的

中的ThirdPartyFilter
class ThirdPartyFilter implements Filter{
    private static BB bb = new BB();
    static{
         bb.setText("bb");
    }
    doFilter(){...}
}

我已经有一个名为ThirdPartyFilterModifier的类,其中有一个工厂bean使用反射来操作在thirdPartyFilter中初始化的对象BB。但是修饰符的定义是使用注释。

@configuration
class ThirdPartyFilterModifier{
   @Bean
   public BB reviseBB(){
      // using reflection to retrieve bb and revise it.
      return bb;
   }
}

在应用程序启动时检查控制台日志,我可以清楚地看到ThirdPartyFilter中的静态块首先打印出来,然后是ThirdPartyFilterModifier的工厂bean。

我承认这是我期望的结果。但是这件事让我感到困惑,因为我没有做任何事情来确保在thirdPartyFilterModifier之前加载thirdPartyFilter。

任何人都可以指出我是否在xml和annotation配置中做正确的事情?

//修订 我刚刚尝试将注释转换为xml

<bean id="thirdPartyFilterModifier" class="com.mycom.ThirdPartyFilterModifier" factory-method="reviseBB" />

并将此定义置于&amp;之前在第三方过滤器之后。得到了相同的排序结果:首先是thirdPartyFilter,然后是thirdPartyFilterModifier。

1 个答案:

答案 0 :(得分:0)

如果您只想确保Spring管理的任何两个bean之间的创建顺序,您可以使用depends-on

在XML中:

<bean id="beanOne" class="ExampleBean" depends-on="manager">
  <property name="manager" ref="manager" />
</bean>

在注释中:

@DependsOn

通常:通过反射修改第三方过滤器听起来不是一个好主意。如果可能,您应该尝试寻找替代解决方案。即使您完成此工作,您也将被锁定该依赖项版本,无法安全地更新到更新版本。也许值得发布另一个SO问题来寻找更清洁的解决方案。