我是Spring框架中的新手,我对使用 @Autowired 注释和界面声明有一些疑问。
参考这个例子:
http://viralpatel.net/blogs/spring3-mvc-hibernate-maven-tutorial-eclipse-example/
我知道@Autowired注释可用于自动链接属性上的bean。
在上一个例子中,我有以下情况:
我有一个 ContactDAO 界面,它的实现类名为 ContactDAOImpl
接下来在 ContactServiceImpl 类中,使用 @Autowired 注释了此变量:
@Autowired
private ContactDAO contactDAO;
我的第一个疑问与 ContactDAO 是界面这一事实有关,那我接线的是什么?具体类型: ContactDAOImpl ?如果是的话,Spring框架是否可以做到这一点?
第二个疑问与 spring-servlet.xml 配置文件中没有针对 ContactDAO orf ContactAOImpl <的bean定义有关/ strong>上课...为什么?是因为 ContactDAOImpl 类是使用 @Repository 注释进行注释的吗?
由于
安德烈
答案 0 :(得分:5)
我的第一个疑问与ContactDAO是一个界面有关 那我接线的是什么?具体类型:ContactDAOImpl?如果是,是的 做它的Spring框架?
只要只有一个匹配的实现,Spring就会自动为您提供接口的实现。还有一种方法可以将@Qualifier
与@Autowired
一起使用并命名实现,从而将多个候选项中的单个实现与自动装配相匹配。
第二个疑问与spring-servlet.xml中的事实有关 配置文件没有针对ContactDAO的bean定义 orf ContactAOImpl类......为什么?是因为ContactDAOImpl类是 使用@Repository注释进行注释?
如果您在配置实现中使用注释(@Component
,@Repository
,@Service
,@Controller
),则无需显式定义bean在xml中(虽然你也可以这样做)。
编辑:this我的老答案可能会更多地说明在春天使用注释。
答案 1 :(得分:2)
您的两个问题的答案是肯定的,是的。
实际上,您可能没有在服务中自动装配ContactDAOImpl的实例,而是一个代理实例,它会释放到ContactDAOImpl的实例。代理通常会处理事务,转换异常等等。
@Repository
注释是一种声明Spring bean的替代(更简单)方法。它只有在Spring xml文件中有一个元素告诉它发现带注释的bean时才有效。
答案 2 :(得分:2)
Spring将自动扫描所有类并查找所有带注释的类并注册它们,这在spring配置中会告诉它这样做:
<context:component-scan base-package="my.base.package" />
因此,您无需在配置文件中声明@Repository
。
在问题的第一部分,这是IOC pattern的解除;您的Service类只知道DAO的接口,这意味着它不依赖于实现。
在扫描过程中,Spring会找到所有带注释的类,当你要求@Autowired
时,它会尝试找到你已经注释的类,这个类是你要求自动装配的接口的实现者。
查看Annotation Configuration上的Spring文档。