【问题标题】:Spring - Adding @Bean to String without name attributeSpring - 将@Bean添加到没有名称属性的字符串
【发布时间】:2019-10-29 05:50:24
【问题描述】:

reasons用于在String上添加@Bean

您必须为 bean 命名,然后在自动装配引用该名称时使用 @Qualifier 注释。

但是在下面的代码中,没有name属性

@Configuration
@PropertySource(value = { "classpath:my.properties" })
public class MyEnvironment {

    @Value("${MY_NAME}")            String MY_NAME;
    @Value("${MY_NAME2}")           String MY_NAME2;

    @Bean
    public String getMyName() {
        return MY_NAME;
    }
    @Bean
    public String getMyName2() {
        return MY_NAME2;
    }
}

使用方法调用如下:

myEnvironment.getMyName();

在这种情况下,@Bean 不是多余的/不相关的吗?这个约定也会引起问题吗?还是有什么隐藏的好处?

【问题讨论】:

    标签: java spring spring-bean


    【解决方案1】:

    考虑到 Spring 的意图是注入依赖,@Bean 在这种情况下肯定是多余的。

    由于您的大多数类仅使用(或者您可能会说 - 依赖)配置对象 myEnvironment。因此,将MyEnvironment 类作为一个单独的单元注入到依赖它的那些类而不是单个String 对象中更有意义。

    不过,这取决于您如何设计类及其依赖项。例如。您也可以直接在这些类上使用@Value 将这两个字符串值注入到需要它的类中,而根本不需要MyEnvironment 类。

    【讨论】:

    • 我同意,但从理论上讲,如果所有这些属性都有@Bean 注释会发生什么?会引起问题吗?
    • 如果你有一些声明 @Autowired 的类没有指定 @Qualifier ,我相信 Spring 可能会抛出异常。
    • 是的,这里提到了。 stackoverflow.com/questions/32245003/…
    • 但是我们有这样的类,它有多个属性,注释为@Bean,Spring 不会抛出异常
    • 对不起,我有点错过了你的观点。声明多个属性注释为@Bean 很好,只要没有人试图@Autowired 他们。就像spring有自己的默认机制来命名这些bean,所以它不会冲突。仅当您尝试获取这些 bean 时才会导致问题。请结帐:docs.spring.io/spring/docs/current/javadoc-api/org/…stackoverflow.com/questions/48871789/…
    猜你喜欢
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2023-01-11
    • 2012-07-23
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    相关资源
    最近更新 更多