gpt4 book ai didi

java - Spring Bean 注解名称属性的用途是什么?

转载 作者:行者123 更新时间:2023-12-02 03:01:11 27 4
gpt4 key购买 nike

我刚刚学习 spring,使用 name 属性作为字符串的注释配置让我感到非常奇怪。

@Bean(name = "com.my.injected.Service")
public InjectedService injectedService() {
return injectedService;
}

这个名字是不是和Spring Bean类似XML configuration id and class attributes

<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>

为什么这不简单

@Bean(clazz = com.my.injected.Service.class)
public InjectedService injectedService() {
return injectedService;
}

相反?

在这两种情况下,您都完全限定了路径,并且实际使用该类可以让您的 IDE 更轻松地告诉您何时搞砸了。我知道 XML 配置是第一位的,自然它总是通过字符串查找内容,所以这只是一个保留?使用字符串有一些优点还是使用 .class 有一些优点或主要缺点?

问题最初是基于错误的前提。我对其进行了编辑,以阐明这个前提是什么,并让新来的人不那么困惑。希望我这样做时给出的答案仍然完全适用;如果没有,请道歉。

最佳答案

@Bean注解的目的是提供一个spring bean。要提供的 bean 类型将与您在返回方法中定义的类/接口(interface)的类型相同。因此,不要在方法中声明返回具体类,而是返回顶部(抽象)类/接口(interface)。

想象一下这种情况:

public interface MyEntityDao {
MyEntity get(String id);
}

@Repository
public class MyEntityDaoDatabaseImpl implements MyEntityDao {
@Override
public MyEntity get(String id) {
/* implementation that goes to database every time */
}
}

@Repository
public class MyEntityDaoCacheImpl implements MyEntityDao {
@Override
public MyEntity get(String id) {
/* implementation that looks the data
up in cache, never in database */
}
}

@Configuration
public class MyAppConfiguration {
@Bean
public MyEntityDaoDatabaseImpl method1() {
return new MyEntityDaoDatabaseImpl();
}
@Bean
public MyEntityDaoCacheImpl method2() {
return new MyEntityDaoCacheImpl();
}
}

@Service
public class MyEntityService {
@Autowired //what to inject here?
MyEntityDao dao;
}

在上述情况下,建议的接口(interface)有两种实现。除了名称之外,框架如何能够理解要使用哪个实现?

@Service
public class MyEntityService {
@Autowired
@Qualifier("properBeanNameToInject")
MyEntityDao dao;
}

关于java - Spring Bean 注解名称属性的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30107801/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com