聊聊@Autowired注解注入,写接口名字还是实现类的名字

 更新时间:2021年11月18日 10:38:01   作者:Thinkingcao  
这篇文章主要介绍了聊聊@Autowired注解注入,写接口名字还是实现类的名字,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

用@Autowired注解注入,写接口名字还是实现类的名字

来自某程序员一个问答问题

1. 有一点没明白,为什么注解@repository注解的是接口UserDAO的实现类UserDAOImpl,而在UserServiceImpl中使用@Autowired注解注入属性private UserDAO userDAO自动装配,为什么最后得到的是UserDAOImpl的实例。

-----上面是某位同学的提问,我也有这样的疑问----

2. @Service注解服务层的时候,在unitest中,是从ApplicationContext.getBean("实现类名字,首字母小写") 这样获取的。

也就是说,在容器中初始化的Bean应该按照实现类名字规则。 这一点如果是用xml配置是不存在这样的问题,因为xml可以指定id, id 是接口,class指向实现类。

3. 来自网友的回答:这个其实是创建了实现类的对象但引用了接口类型,即"InjectionDao injectionDao = new InjectionDaoImpl()", 这个其实是Java多态性(向上转型)的一种应用。在实现类处加@Repository注解,意思就是new InjectionDaoImpl(), 而在InjectionServiceImpl中定义属性InjectionDAO injectionDAO就是将new出来的这个InjectionDaoImpl对象向上转型为InjectionDao类型。

Spring中Autowired注入接口的几个问题

1.Spring怎么知道注入哪个实现?

As long as there is only a single implementation of the interface and that implementation is annotated with @Component with Spring's component scan enabled, Spring framework can find out the (interface, implementation) pair.

If component scan is not enabled, then you have to define the bean explicitly in your application-config.xml (or equivalent spring configuration file).

如果Spring配置了component scan,并且要注入的接口只有一个实现的话,那么spring框架可以自动将interface于实现组装起来。如果没有配置component scan,那么你必须在application-config.xml(或等同的配置文件)定义这个bean。

可以理解为 在 application-service.xml 配置文件中声明了 component-scan

<context:component-scan base-package="com.system.service.impl"/>

在 com.system.service 下有一个接口类,在 com.system.service.impl 下有一个接口对应的实现类,且该实现类用 @Service 注解进行了标注。

在使用该接口类的时候,可以按照如下方式:

@Autowired
private UserloginService userloginService;

以此来进行自动装配。

2.需要@Qualifier和@Resource注解吗?

Once you have more than one implementation, then you need to qualify each of them and during auto-wiring, you would need to use the @Qualifier annotation to inject the right implementation, along with @Autowired annotation.

If you are using @Resource (J2EE semantics), then you should specify the bean name using the name attribute of this annotation.

一旦一个接口有多个实现,那么就需要每个特殊化识别并且在自动装载过程中使用@Qualifier和@Autowired一起使用来标明。如果是使用@Resource注解,那么你应该使用resource中属性名称来标注@Autowired.

3.为什么@Autowired使用在interface上而不是实现类上?

Firstly, it is always a good practice to code to interfaces in general.

Secondly, in case of spring, you can inject any implementation at runtime.

A typical use case is to inject mock implementation during testing stage.

首先,一般使用接口是很常用并且有益的变成技术。

其次,在spring中,你可以在运行过程中注入各种实现。一个很经典的情况就是在测试阶段,注入模拟的实现类。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringSecurity中@PermitAll与@PreAuthorize的实现

    SpringSecurity中@PermitAll与@PreAuthorize的实现

    @PermitAll和@PreAuthorize都是处理安全性的强大工具,本文主要介绍了SpringSecurity中@PermitAll与@PreAuthorize的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • springboot实现文件上传步骤解析

    springboot实现文件上传步骤解析

    这篇文章主要介绍了springboot实现文件上传步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • SpringMVC+Mybatis实现的Mysql分页数据查询的示例

    SpringMVC+Mybatis实现的Mysql分页数据查询的示例

    本篇文章主要介绍了SpringMVC+Mybatis实现的Mysql分页数据查询的示例,具有一定的参考价值,有兴趣的可以了解一下
    2017-08-08
  • SpringBoot多配置切换的配置方法

    SpringBoot多配置切换的配置方法

    这篇文章主要介绍了SpringBoot多配置切换的配置方法及spring boot设置端口和上下文路径的方法,需要的朋友可以参考下
    2018-04-04
  • Java中使用Filter过滤器的方法

    Java中使用Filter过滤器的方法

    Filter过滤器是javaWeb层面的,它跟Servlet类似,每次前端请求,首先进入的是过滤器,我们必须实现Filter接口,重写三个方法,才能使用Filter过滤器,需要的朋友可以参考下
    2021-06-06
  • JAVA利用递归删除文件代码实例

    JAVA利用递归删除文件代码实例

    这篇文章主要介绍了JAVA利用递归删除文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • IDEA中配置多个版本的JDK的实现示例

    IDEA中配置多个版本的JDK的实现示例

    IDEA可以配置多个JDK,根据需要使用不同版本的,本文就来介绍一下IDEA中配置多个版本的JDK的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 解决mybatis #{}无法自动添加引号的错误

    解决mybatis #{}无法自动添加引号的错误

    这篇文章主要介绍了解决mybatis #{}无法自动添加引号的错误,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 解析idea内嵌浏览器翻译

    解析idea内嵌浏览器翻译

    这篇文章主要介绍了解析idea内嵌浏览器翻译的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • java对象序列化与反序列化的默认格式和json格式使用示例

    java对象序列化与反序列化的默认格式和json格式使用示例

    这篇文章主要介绍了java对象序列化与反序列化的默认格式和json格式使用示例,需要的朋友可以参考下
    2014-02-02

最新评论