【问题标题】:Spring multiple @Configuration component scanning ambiguitySpring多个@Configuration组件扫描歧义
【发布时间】:2016-04-28 11:12:09
【问题描述】:

我注意到在处理多个 @Configuration 文件时组件扫描和 bean 创建不明确。

假设我有方法级别的安全配置,它需要扫描包含需要 AOP 代理的类的包。这些类依赖于其他类,同时也是其他类的依赖。

一切正常,直到我在不同的配置(如根配置)中扫描相同的包。然后像循环依赖bean in creation这样的异常开始出现。似乎根配置也​​尝试实例化相同的对象,但当然不能这样做,因为在某些时候无法在此配置路径中应用 AOP 代理并且无法满足依赖关系。

如果我最终能准确地扫描到什么,一切都会正常工作,但我很惊讶 Spring 无法自动编排 bean 创建顺序。真的是这样还​​是有什么可疑的地方?

【问题讨论】:

    标签: spring dependency-injection configuration inversion-of-control autowired


    【解决方案1】:

    这不是可疑的。 bean 存储在 AppContext 中。 spring 的设计是这样的:你可以在同一个上下文中拥有同一个类的两个实例!如果通过配置两次配置 MyService,应该自动装配哪个实例? 看这个例子:

    @Autowired
    private final MyService myService = null;
    

    由于您的扫描工作了两次,因此您有两个可能的候选人用于注入,并且 spring 无法自动装配并给出异常(在这种情况下 spring 寻找 @Primary-Annotation,但因为你扫描两次你有两次@Primary - 所以在这种情况下它可能没有帮助)。

    有效的方法是让客户像这样选择正确的服务:

    @Autowired
    private final MyService[] myServices = null;
    

    这行得通,你有数组中的所有实例。

    另一种选择是在同一个应用程序中拥有两个不同的 AppContext。

    【讨论】:

    • 完全错过了这个基本概念。我正在开发网络应用程序,因此不适合拥有多个上下文。从数组中选择违反了框架透明度。我想我唯一的选择是更加隔离的包装,但这有点违反直觉,因为安全是一个跨领域的问题。单个逻辑包中可能有多个 ccc -> 同一包中的各个组件应由不同的配置实例化。在根配置中扫描这些组件会更有意义。我期待着一些关于管理多个配置层次结构的最佳实践。
    • 安全嗯?扫描一个包也会加载 3rd-party-library bean,扫描会放弃具体的控制,最好的做法可能是不扫描。
    • 我可以在配置文件transactional中创建bean吗?据我所知,@EnableTransactionManagement 启用的后处理器将代理@Services,并使用@Transactional 进行注释。将@Bean 定义为@Transactional 是否足够?
    • 请加入 Springframework (Java) 聊天。我会在那里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    相关资源
    最近更新 更多