热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Spring常用的三种注入方式

Spring常用的三种注入方式:1、构造方法,采用反射的方式,通过构造方法来完成注入;2、setter,也是采用反射的方式,不过是通过setter来完成注入;3、基于注解,常用的有“@Autowried”和“@Resource”。

Spring 常用的三种注入方式

1、构造方法,采用反射的方式,通过构造方法来完成注入。

先简单了解一下测试项目的结构,用maven构建的,四个包:

  • entity:存储实体,里面只有一个User类

  • dao:数据访问,一个接口,两个实现类

  • service:服务层,一个接口,一个实现类,实现类依赖于IUserDao

  • test:测试包

在spring的配置文件中注册UserService,将UserDaoJdbc通过constructor-arg标签注入到UserService的某个有参数的构造方法


  


如果只有一个有参数的构造方法并且参数类型与注入的bean的类型匹配,那就会注入到该构造方法中。

public class UserService implements IUserService {
  private IUserDao userDao;
  
  public UserService(IUserDao userDao) {
    this.userDao = userDao;
  }
  
  public void loginUser() {
    userDao.loginUser();
  }
}
@Test
public void testDI() {
  ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
  // 获取bean对象
  UserService userService = ac.getBean(UserService.class, "userService");
  // 模拟用户登录
  userService.loginUser();
}

测试打印结果:jdbc-登录成功

注:模拟用户登录的loginUser方法其实只是打印了一条输出语句,jdbc实现的类输出的是:jdbc-登录成功,mybatis实现的类输出的是:mybatis-登录成功。

2、setter,也是采用反射的方式,不过是通过setter来完成注入。

配置文件如下:


  
  
  
  


注:上面这两种写法都可以,spring会将name值的每个单词首字母转换成大写,然后再在前面拼接上"set"构成一个方法名,然后去对应的类中查找该方法,通过反射调用,实现注入。

切记:name属性值与类中的成员变量名以及set方法的参数名都无关,只与对应的set方法名有关,下面的这种写法是可以运行成功的

public class UserService implements IUserService {
  private IUserDao userDao1;
  
  public void setUserDao(IUserDao userDao1) {
    this.userDao1 = userDao1;
  }
  
  public void loginUser() {
    userDao1.loginUser();
  }
}

还有一点需要注意:如果通过set方法注入属性,那么spring会通过默认的空参构造方法来实例化对象,所以如果在类中写了一个带有参数的构造方法,一定要把空参数的构造方法写上,否则spring没有办法实例化对象,导致报错。

3、基于注解,常用的有“@Autowried”和“@Resource”。

示例代码

// candidateBeans 为上一步通过类型匹配到的多个bean,该 Map 中至少有两个元素。
protected String determineAutowireCandidate(Map candidateBeans, DependencyDescriptor descriptor) {
    //  requiredType 为匹配到的接口的类型
   Class requiredType = descriptor.getDependencyType();
   // 1. 先找 Bean 上有@Primary 注解的,有则直接返回
   String primaryCandidate = this.determinePrimaryCandidate(candidateBeans, requiredType);
   if (primaryCandidate != null) {
       return primaryCandidate;
   } else {
       // 2.再找 Bean 上有 @Order,@PriorityOrder 注解的,有则返回
       String priorityCandidate = this.determineHighestPriorityCandidate(candidateBeans, requiredType);
       if (priorityCandidate != null) {
           return priorityCandidate;
       } else {
           Iterator var6 = candidateBeans.entrySet().iterator();
           String candidateBeanName;
           Object beanInstance;
           do {
               if (!var6.hasNext()) {
                   return null;
               }
               // 3. 再找 bean 的名称匹配的
               Entry entry = (Entry)var6.next();
               candidateBeanName = (String)entry.getKey();
               beanInstance = entry.getValue();
           } while(!this.resolvableDependencies.values().contains(beanInstance) && !this.matchesBeanName(candidateBeanName, descriptor.getDependencyName()));
           return candidateBeanName;
       }
   }
}

推荐教程:《Java教程》

以上就是Spring 常用的三种注入方式的详细内容,更多请关注其它相关文章!


推荐阅读
  • Java EE CDI:解决依赖关系冲突的实例
    在本教程中,我们将探讨如何在Java EE的CDI(上下文和依赖注入)框架中有效解决依赖关系的冲突问题。通过学习如何使用限定符,您将能够为应用程序的不同客户端提供多种接口实现,并确保每个客户端都能正确调用其所需的实现。 ... [详细]
  • 本文详细介绍了如何使用 PHP 编程语言输出 99 乘法表,包括使用不同的循环结构如 do-while、for 循环等方法,并提供了具体的代码示例。 ... [详细]
  • 本文探讨了使用Filter作为控制器的优势,以及Servlet与Filter之间的主要差异。同时,详细解析了Servlet的工作流程及其生命周期,以及ServletConfig与ServletContext的区别与应用场景。 ... [详细]
  • Android中解析XML文件的实践指南
    本文详细介绍了在Android应用开发中解析XML文件的方法,包括从本地文件和网络资源获取XML文件的不同途径,以及使用DOM、SAX和PULL三种解析方式的具体实现。 ... [详细]
  • ServletContext接口在Java Web开发中扮演着重要角色,它提供了一种方式来获取关于整个Web应用程序的信息。通过ServletContext,开发者可以访问初始化参数、共享数据以及应用资源。 ... [详细]
  • Flowable 6.6.0 表单引擎在Web应用中的集成与使用
    本文档提供了Flowable 6.6.0版本中表单引擎在Web应用程序中的配置和使用指南,包括表单引擎的初始化、配置以及在Web环境下的具体实现方法。 ... [详细]
  • 本文提供了详细的步骤,指导如何在Ubuntu系统中配置ASOP源码的编译环境,特别强调了使用国内镜像加速下载过程的方法。若遇到文章加载问题或图片失效,建议访问原文链接获取最新信息。 ... [详细]
  • 本文探讨了在渗透测试中信息收集阶段使用的几种端口扫描技术,包括nmap、masscan、socket、telnet及nc等工具的应用与比较。 ... [详细]
  • 本文提供了详细的步骤,介绍如何将基于Maven的Java EE项目从Eclipse IDE部署到JBoss应用服务器上。适合初学者和中级开发者参考。 ... [详细]
  • 近期,谷歌公司的一名安全工程师Eduardo Vela在jQuery Mobile框架中发现了一项可能引发跨站脚本攻击(XSS)的安全漏洞。此漏洞使得使用jQuery Mobile的所有网站面临潜在的安全威胁。 ... [详细]
  • 本文详细介绍了 Java 中 freemarker.ext.dom.NodeModel 类的 removeComments 方法,并提供了多个实际使用的代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文详细介绍了 Java 中 javax.portlet.PortletURL.write() 方法的功能与使用场景,并提供了多个实际代码示例以供参考。 ... [详细]
  • 使用Jenkins构建Java项目实践指南
    本指南详细介绍了如何使用Jenkins构建Java项目,包括环境搭建、工具配置以及项目构建的具体步骤。 ... [详细]
  • MyBatis 开发技巧:延迟加载与查询缓存详解
    本文详细探讨了 MyBatis 中的延迟加载和查询缓存机制,旨在帮助开发者更好地理解和利用这些特性来优化数据库访问性能。 ... [详细]
  • 本项目展示了如何利用Java技术构建一个高效的考勤数据管理系统,特别适用于处理大量数据的情况,如企业员工考勤记录等。项目包括完整的源代码和详细的文档说明,适合用于毕业设计或实际工作场景。 ... [详细]
author-avatar
缘来是你-心定
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有