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

防止Spring干预CDI注释,即使是工厂创建的实例

邹丰羽
2023-03-14

我有一个遗留产品的JAR,它包含Spring(4.3.8)托管类。我需要将它与CDI(JavaEE 7)集成。

我有一个来自遗留JAR的接口,由cdibean实现。CDIBean从CDIBeanManager请求,并从工厂方法返回。工厂方法在SpringXML中注册并按预期工作。

当遗留JAR的Spring bean依赖于实现的接口时,就会出现问题。Spring than注入CDI实现实例,并扫描类it以查找已知的注释,命名为@Inject。然后,它尝试解决依赖项,这不起作用,因为依赖项对Spring不可用。

我已经调整了上下文:属性占位符排除,但这不会改变什么。

那么,我怎样才能告诉Spring停止尝试在我的工厂生产的bean实例中注入一些东西呢?

共有2个答案

华凌
2023-03-14

这有点容易。autowiredAnnotationBeanPostProcator已经是一个bean,因此您可以在Spring开始使用ServletContextListener扫描以排除@Inject注释之前对其进行配置。至少从Spring4.1开始,AutowiredAnnotationBeanPost处理器有一个方法setAutowiredAnnotationTypes,例如:

@WebListener
public class ApplicationConfigListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        ApplicationContext appCtx = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
        Set<Class<? extends Annotation>> autowiredAnnotationTypes = new LinkedHashSet<Class<? extends Annotation>>();
        AutowiredAnnotationBeanPostProcessor bean = appCtx.getBean(AutowiredAnnotationBeanPostProcessor.class);
        autowiredAnnotationTypes.add(Autowired.class);
        autowiredAnnotationTypes.add(Value.class);
        bean.setAutowiredAnnotationTypes(autowiredAnnotationTypes);
    }
}

你也可以使用Springbeanautowringinterceptor。这里解释了这一点。

龙涵蓄
2023-03-14

我终于能够解决这个问题了。我必须删除遗留JAR中的所有CDI注释(通过用Spring对应项替换它们),这样Spring将不再工作。

然后,我将以下XML块添加到applicationContext中。我的CDI战争的xml:

<context:component-scan annotation-config="false" base-package="com.example">
</context:component-scan>
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor">
    <property name="autowiredAnnotationTypes">
        <set>
            <value>org.springframework.beans.factory.annotation.Autowired</value>
            <value>org.springframework.beans.factory.annotation.Value</value>
        </set>
    </property>
</bean>
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />
<bean class="org.springframework.beans.factory.annotation.CustomAutowireConfigurer">
    <property name="customQualifierTypes">
        <set>
            <value>org.springframework.beans.factory.annotation.Qualifier</value>
        </set>
    </property>
</bean>

基本上,从Spring中删除了对@Inject等的支持,并将其留在了它所属的地方: CDI。

 类似资料:
  • 问题内容: 我想知道如何用Spring 3注释实现简单的工厂模式。我在文档中看到,您可以创建调用工厂类并运行工厂方法的bean。我想知道是否可以仅使用注释。 我有一个当前正在调用的控制器 MyService是具有一个称为checkStatus()的方法的接口。 我的工厂班级看起来像这样: MyServiceOne类如下所示: 当我运行此代码时,locationService变量始终为null。我相

  • 问题内容: 在使用CDI时,我可以使用注释创建一个生产者方法,以调用该方法来选择由注释注入实现接口的bean 。 现在,我正在使用Spring,但没有找到任何类似的东西。使用批注时,我需要使用什么来获得与CDI中批注相同的结果? 问题答案: 您正在寻找: @Bean是方法级别的注释,是XML 元素的直接类似物。批注支持所提供的大多数属性,例如:初始化方法,销毁方法,自动装配,延迟初始化,依赖项检查

  • 假设有一个类A,它的构造函数是这样的: 还有AFactory: 所以要创建一个A的实例,我显然需要做这样的事情: 但是,假设我有其他类:例如,B类、C类和D类具有类型为A的成员(带有字段注入,但也可以是ctor): 我希望将 A 的相同实例注入到这些类中。但仍然可以选择将 A 的另一个实例注入其他类(假设 E 类和 F 类)。 正确的做法是什么?我就是想不出一个干净的方法来做到这一点。

  • 组织。springframework。交易CannotCreateTransactionException:无法打开事务的Hibernate会话;嵌套的异常是java。lang.NoClassDefFoundError:org/hibernate/engine/transaction/spi/TransactionContext 我的POM文件 ============ SessionFactor

  • 问题内容: 我有一个控制器,它应该创建版本的Dependend实例(当前未实现)。 工厂看起来像这样: 未设置创建的实例字段(@Autowired注解)。我该怎么做,FactoryBean是正确实现的接口吗? 我希望使用不涉及xml配置的解决方案。 组件本身: 问题答案: 如果创建对象,Spring不会执行自动装配。这里有一些选择 将bean定义为作用域-这将使工厂冗余(适用于仅在工厂中实例化的情

  • 问题内容: 我正在尝试做一些Java注释魔术。我必须说,我仍在追赶注释技巧,并且某些事情对我来说还不太清楚。 所以…我有一些带注释的类,方法和字段。我有一个方法,它使用反射对类进行一些检查并将一些值注入到类中。这一切都很好。 但是,我现在面临的情况是我需要一个注释实例(可以这么说)。所以…批注与常规接口不同,您不能对类进行匿名实现。我知道了。我在这里浏览了有关类似问题的一些帖子,但似乎无法找到所需