gpt4 book ai didi

java - 如何将Spring bean注入(inject)到Apache Commons Pooling类流中反射生成的类中

转载 作者:太空宇宙 更新时间:2023-11-04 06:14:37 25 4
gpt4 key购买 nike

我使用 Spring MVC 3.2.4 和 Apache Commons Pooling 2.3 来管理 SOAP 服务的连接。我正在使用的功能之一是 GenericObjectPool 类中的“空闲对象驱逐”线程功能:

http://commons.apache.org/proper/commons-pool/api-2.3/org/apache/commons/pool2/impl/GenericObjectPool.html

通过此功能,我可以指定用于测试连接对象逐出的类的名称:

http://commons.apache.org/proper/commons-pool/api-2.3/org/apache/commons/pool2/impl/BaseObjectPoolConfig.html#setEvictionPolicyClassName(java.lang.String)

在检查 GenericObjectPool 类的 Commons Pooling 实现时,使用反射实例化驱逐类并执行。所有将 Spring bean 注入(inject)此类的尝试都失败了,包括使用常用技术,例如在生成的类上使用 @EnableLoadTimeWeaving 和 @Configurable 进行加载时编织。

是否可以将 Spring bean 注入(inject)到通过反射内部生成且不受 Spring 容器管理的类中?

编辑:

这是实例化驱逐器类的方法:

 ...

public final void setEvictionPolicyClassName(
String evictionPolicyClassName) {
try {
Class<?> clazz = Class.forName(evictionPolicyClassName);
Object policy = clazz.newInstance();
if (policy instanceof EvictionPolicy<?>) {
@SuppressWarnings("unchecked") // safe, because we just checked the class
EvictionPolicy<T> evicPolicy = (EvictionPolicy<T>) policy;
this.evictionPolicy = evicPolicy;
}
} catch (ClassNotFoundException e) {

...

这是在线程内按设定的时间间隔执行的 run 方法:

  ...

@Override
public void run() {
ClassLoader savedClassLoader =
Thread.currentThread().getContextClassLoader();
try {
// Set the class loader for the factory
Thread.currentThread().setContextClassLoader(
factoryClassLoader);

// Evict from the pool
try {
evict();
} catch(Exception e) {

...

以下是 EvictionPolicy 类的实现示例:

  class SampleEvictionPolicy implements EvictionPolicy<SabreConnection> {

// This is what I would like to add:
// @Autowired
// private desiredBeans desiredBeans

public SampleEvictionPolicy() { }

@Override
boolean evict(EvictionConfig evictionConfig, PooledObject<SabreConnection> tPooledObject, int i) {
// Do some stuff
}

最佳答案

如果我理解正确的话,那么你在使用 spring bean 来“桥接”非 spring 类时遇到问题。如果我理解正确,那么该检查的实例化和执行超出了您的控制范围(请参阅此处的 final 方法)。所以我的建议很简单(虽然不太好):

  1. 通过一些静态方法/字段(〜单例模式)提供您需要的 Spring bean,并在 Spring 初始化期间设置它。
  2. 创建普通(非 spring)类,该类将通过此静态方法获取此 bean 并调用所需的检查。
  3. 向 apache commons 注册此类。

关于java - 如何将Spring bean注入(inject)到Apache Commons Pooling类流中反射生成的类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28259602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com