当前位置: 首页 > 知识库问答 >
问题:

如何将Springbean注入到ApacheCommons池类流中反射生成的类中

壤驷华辉
2023-03-14

我使用的是SpringMVC3.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类的共享池实现后,将使用反射实例化并执行逐出类。所有尝试将Spring bean注入到这个类的尝试都失败了,包括使用常见的技术,如在生成的类上使用@EnableLoadTimeWeave和@Configurable加载时编织。

是否可以将Springbean注入到由反射在内部生成的类中,而不是由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) {

     ...

下面是ReceivingPolicy类的实现示例:

  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
}

共有1个答案

闻人树
2023-03-14

如果我理解正确的话,那么您在用Springbean“桥接”非spring类时会遇到问题。如果我理解正确,那么该检查的实例化和执行将不受您的控制(请参见此处的final方法)。所以我的建议很简单(虽然不是很好):

  1. 通过一些静态方法/字段(~单例模式)使您需要的Springbean可用,并在Spring初始化期间设置它。
  2. 创建普通(非Spring)类,通过这个静态方法获取这个bean并调用所需的检查。
  3. 用apache公共资源注册这个类。
 类似资料:
  • 我有下面的映射器类,我想在其中使用。我正在尝试构造函数注入,但不起作用,并且正在打印。 mapStruct实现类 如果我使用使用字段注入,这样它就可以正常工作。这意味着Spring不支持类的构造函数注入。是因为类不能直接实例化,需要子类来实例化吗? 有没有什么方法可以在实现类中创建一个构造函数,如下所示: 这样,构造函数注入应该可以工作。

  • 问题内容: 我正在使用一个已定义的拦截器,我想从拦截器中通过DAO层进行db调用,所以我如何将Spring bean注入到struts拦截器中。是否可以将spring bean注入到struts拦截器中,任何人都可以提出任何想法在此。 问题答案: 编辑 由于不需要将拦截器声明为Spring bean,因此删除了不必要的部分。感谢@AleksandrM对其进行测试。 就像使用Actions一样,(如

  • 我正在编写单元测试,有一个非常复杂的设置。 依赖bean设置一些侦听器,并将它们传递给自动连线服务。 我想测试侦听器是否存在,但不调用它们,因此我想传递'null'而不是自动连线服务。(特别是:我没有二传手…) 请注意,SUT确实间接依赖于返回侦听器的类。 因为这是一个来自大设置的非常小的示例,所以我不想在这里使用mock,因为我只想测试侦听器的存在性而不是行为。 嘲笑20或30个这样的服务会大大

  • 我需要在生成的mapper实现中注入一个spring服务类,以便通过 这是否适用于Mapstruct-1.0?

  • 我有几个EJB3。x无状态会话bean,未定义接口。我需要将这些bean注入到Springbean中,但我无法这样做。 无接口EJB: 我的豆子: 还有我的豆子。xml 在初始化Spring容器时,我得到以下错误: 异常本身非常清楚——spring容器期望MyBean有一个本地接口视图作为其业务接口;但是,我没有(也不能介绍)。 非常感谢您的帮助!

  • 问题内容: 我在应用程序中使用spring,并且能够将类路径中某些文件的某些属性注入到我的应用程序中,并且一切正常。即 现在我可以在春季环境中使用。在我的主要班级中: 它也可以正常工作,我的问题是,如何在春季环境属性中插入属性文件位置,而不是一开始就没有,我想使我的应用程序可配置。如果我从中执行我的应用程序,或者我假设在应用程序上下文中该值应为或 问题答案: 有时我也遇到类似的问题。我的要求是属性