我有一个第三方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" />
简单的
中的ThirdPartyFilterclass 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。
答案 0 :(得分:0)
如果您只想确保Spring管理的任何两个bean之间的创建顺序,您可以使用depends-on
。
在XML中:
<bean id="beanOne" class="ExampleBean" depends-on="manager">
<property name="manager" ref="manager" />
</bean>
在注释中:
@DependsOn
通常:通过反射修改第三方过滤器听起来不是一个好主意。如果可能,您应该尝试寻找替代解决方案。即使您完成此工作,您也将被锁定该依赖项版本,无法安全地更新到更新版本。也许值得发布另一个SO问题来寻找更清洁的解决方案。