【问题标题】:Do I have to drop @Component when wanting to set bean parameters via JavaConfig? Is there another way?想通过 JavaConfig 设置 bean 参数时是否必须删除 @Component?还有其他方法吗?
【发布时间】:2013-11-22 04:52:26
【问题描述】:

我有一个带有 @Component 注释的 Spring bean。但我想设置/指定 bean 参数。据我所知,如果我想坚持使用注释,我唯一的选择是在实例化 bean 时使用 @Configuration 类来指定参数。但是,在这种情况下,我必须删除 @Component,因为要由 @Configuration 类来声明 bean。

本质上,使用@Configuration 和@Component 似乎是互斥的。同样,在 XML 中声明 bean 并使用 @Component 进行注释也是互斥的。

我发现在两个可能的地方声明有点混乱:类本身(如果使用@Component 注释并且不需要任何特殊初始化)和在 JavaConfig 类中。只有我这样看吗?或者有没有办法在仍然使用@Comonent 注解的同时指定参数?

【问题讨论】:

    标签: java spring dependency-injection spring-ioc


    【解决方案1】:

    看起来@Component 在您按类型连接时会胜过@Bean,但看起来这在任何地方都没有记录,因此您可能不想依赖它。

    https://jira.springsource.org/browse/SPR-10795?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel

    如果你真的想要完整的注解,并且没有 @Configuration 或 XML 配置,那么你可以自动装配一个包含你需要的所有设置的配置对象。在我看来,如果这个类接受简单的配置参数而不知道它们来自哪里,那么它会更干净,所以我会使用@Configuration 类。

    【讨论】:

    • 我已经遇到的问题是离开@Component 注释,同时为同一个bean 定义@Configuration,Spring 似乎在其上下文中对同一个bean 有两个定义。当我尝试注入 bean 时,我不需要获取正确的 bean 实例(使用参数集)。我花了一段时间才明白为什么我有两个不同的 bean 实例,一个是属性初始化的,一个是没有任何初始化的。一旦我删除了@Component,我只会得到一个实例。
    • 我在示例项目中验证了您所说的内容,然后更新了我的答案。谢谢,我在这里学到了一些东西。
    • 问题依然存在。似乎没有一种“干净”的方式来做到这一点。在我看来,使用自动装配的配置对象根本不干净。因此,在项目的整个生命周期中,您最终会使用“@Component”创建一些 bean,或者使用“@Bean”创建其他 bean——基本上没有什么一致的。我希望有人能找到一种更清洁的方法。
    • 如果配置值可以通过 Spring 的表达式语言 (SPEL) 表示,您可以在“@Component”类中的设置器上方使用“@Value”注释。 .property 文件中定义的属性将以这种方式可用。如果设置正确,我相信您也可以使用 -D 标志进行编译以设置这些变量。 docs.spring.io/spring/docs/3.0.x/reference/expressions.html
    • 这几乎也是我想出的唯一选择,但也不是很兴奋。我认为有一种方法可以在没有 SpEL 的情况下指定默认参数,但这可能是我最好的选择。
    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 2023-02-20
    • 1970-01-01
    • 2012-06-24
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多