Java 关于在Spring框架中使用**@Autowired**注释和接口声明的一些疑问

Java 关于在Spring框架中使用**@Autowired**注释和接口声明的一些疑问,java,spring,spring-mvc,annotations,autowired,Java,Spring,Spring Mvc,Annotations,Autowired,我是Spring框架的新手,我对使用@Autowired注释和接口声明有一些疑问 关于这个例子: 我知道@Autowired注释可以用来自动链接属性上的bean 在上一个示例中,我遇到了以下情况: 我有一个ContactDAO接口,它的实现类名为ContactDAOImpl 接下来在类ContactServiceImpl中有一个使用@Autowired注释的变量: @Autowired private ContactDAO contactDAO; 我的第一个疑问与以下事实有关:Contact

我是Spring框架的新手,我对使用@Autowired注释和接口声明有一些疑问

关于这个例子:

我知道@Autowired注释可以用来自动链接属性上的bean

在上一个示例中,我遇到了以下情况:

我有一个ContactDAO接口,它的实现类名为ContactDAOImpl

接下来在类ContactServiceImpl中有一个使用@Autowired注释的变量:

@Autowired
private ContactDAO contactDAO;
我的第一个疑问与以下事实有关:ContactDAO是一个接口,那么我在布线什么呢?具体类型:ContactDAOImpl?如果是的话,Spring框架是否能够做到这一点

第二个疑问与以下事实有关:springservlet.xml配置文件中没有对ContactDAOorfContactAOImpl类的bean定义……为什么?这是因为使用@Repository注释对类进行了注释吗

谢谢


安德里亚

你的两个问题的答案是肯定的,肯定的

事实上,服务中可能没有自动连接的ContactDAOImpl实例,而是代理实例,代理实例将其委托给ContactDAOImpl实例。代理通常会处理事务、转换异常等

@Repository
注释是声明Springbean的另一种(更简单)方法。只有当SpringXML文件中有一个元素告诉它发现带注释的bean时,它才起作用

我的第一个疑问与ContactDAO是一个接口这一事实有关 那么,我在做什么?具体类型:ContactDAOImpl?如果是,是吗 是Spring框架做的吗

只要只有一个匹配的实现,Spring就会为您自动连接接口的实现。还有一种方法可以通过将
@Qualifier
@Autowired
一起使用并命名实现,将多个候选实现中的单个实现与您的自动布线相匹配

第二个疑问与以下事实有关:在spring-servlet.xml中 配置文件没有ContactDAO的bean定义 orf ContactaImpl类…为什么?是因为ContactDAOImpl类是 是否使用@Repository注释进行注释

如果在实现中使用注释(
@Component
@Repository
@Service
@Controller
)进行配置,则不需要在xml中显式定义bean(尽管您也可以这样做)


编辑:我的旧答案可能会对在Spring中使用注释有更多的帮助。

Spring将自动扫描所有类,找到所有注释的类并注册它们,Spring配置中的这个将告诉它这样做:

<context:component-scan base-package="my.base.package" />

因此,您不需要在配置文件中声明
@存储库

关于你问题的第一部分,这是问题的开始;您的服务类只知道DAO的接口,这意味着它不依赖于实现。

在扫描过程中,Spring将找到所有带注释的类,当您请求一个
@Autowired
时,它将尝试找到一个您已注释的类,该类是您请求自动连接的接口的植入者


请查看上的Spring文档。

谢谢……还有一个问题(可能很愚蠢)……如果我遇到与前一个类似的情况,在ContactServiceImpl类中有一个自动连接的ContactDao变量,但我有两个不同的ContactDao接口实现,会发生什么?choesen逐个Spring是什么实现?Spring将选择带注释的实现(带有存储库或另一个Spring组件注释)。如果两者都已注释,则将得到一个异常,并且必须使用限定符注释指定要自动关联的异常。这是记录在案的: