Spring第二讲:SpringIoC控制反转、依赖注入

这篇具有很好参考价值的文章主要介绍了Spring第二讲:SpringIoC控制反转、依赖注入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

四、Spring IoC

4、1什么是IoC

在传统的 Java 应用中,一个类想要调用另一个类中的属性或方法,通常会先在其代码中通过 new 的方式将后者的对象创建出来,然后才能实现属性或方法的调用。但在 Spring 应用中,Java 对象创建的控制权是掌握在 IoC 容器手里,开发者通过XML或注解的配置将Java对象的管理权交给IoC容器,对象的创建由Spring完成。当开发者需要用到对象时,可以直接从Spring中获取对象,不需要再自行创建。

IoC 带来的最大改变不是代码层面的,而是从思想层面上发生了“主从换位”的改变。原本开发者是主动的一方,它想要使用什么资源就会自己创建。但在 Spring 应用中,IoC 容器掌握着主动权,开发者则变成了被动的一方,等待 IoC 容器创建对象后使用。

在应用开发中,并不是所有对象都交给Spring创建,开发者经常将功能类的对象交给Spring去创建,这些类的对象创建后只需要调用功能,实现功能即可,但实体对象,因为每次创建存储的数据或代表的内容都不尽相同,所以实体类的对象还是使用常规方式(new)来实现对象创建。

4、2Spring加载Bean

DAO层

public interface IDemoDAO {
  public void show();
}

public class DemoDAO implements IDemoDAO {
  @Override
  public void show() {
    System.out.println("我是DAO方法");
  }
}

Service层

public interface IDemoService {
  public void show();
}

public class DemoService implements IDemoService {

  private IDemoDAO demoDAO=new DemoDAO();

  @Override
  public void show() {
    demoDAO.show();
  }
}

在applicationContext.xml中添加Bean配置

<!--bean标签声明要创建的类,id为唯一标识,class为类的全路径-->
<bean id="demoDAO" class="com.demo.DAO.Impl.DemoDAO"></bean>
<bean id="demoService" class="com.demo.service.Impl.DemoService"></bean>

获取IoC创建的对象

//创建ApplicationContext,通过实例化ClassPathXmlApplicationContext获取配置文件
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");
//getBeanDefinitionNames获取配置文件中所有加载的Bean
String[] str=applicationContext.getBeanDefinitionNames();
for (String s : str) {
  System.out.println(s);
}
//getBean通过Bean的id属性获取对象
IDemoService demoService1= (IDemoService) applicationContext.getBean("demoService");
demoService1.show();

4、3Spring注入对象

通过案例可以看到Spring通过配置,为我们创建了对象,但是目前我们遇到了问题,问题就是,我们在实现过程中,Service要引用DAO的对象进行功能实现,我们的DAO虽然交给了Spring去创建,但我们依旧需要手动创建,也就是说我们要想实现功能,在Service中就要依赖于DAO的对象实现功能,这样的形式,我们也可以交给Spring帮我们解决,这就是SpringIoC中重要的功能—依赖注入(DI)

在applicationContext.xml中进行修改

<bean id="demoDAO" class="com.demo.DAO.Impl.DemoDAO"></bean>
<bean id="demoService" class="com.demo.service.Impl.DemoService">
  <!--property标签实现依赖注入,name属性为调用类对象属性的set方法,ref属性为指向配置中的对象-->
  <property name="demoDAO" ref="demoDAO"/>
</bean>

Service类修改

public class DemoService implements IDemoService {
  
  private IDemoDAO demoDAO;

  public void setDemoDAO(IDemoDAO demoDAO) {
    this.demoDAO = demoDAO;
  }

  @Override
  public void show() {
    demoDAO.show();
  }
}

4、4使用注解实现IoC

通过配置文件实现SpringIoC,可以很好的分离代码和配置,有较高的解耦性,但操作较为繁杂,所以Spring又提供了以注解形式对IoC进行配置的方式,虽然解耦性降低,但代码实现较为轻便。

IoC核心注解:

  • @Component 组件,通用的注解方式
  • @Service 在业务逻辑层使用(service层)
  • @Repository 在数据访问层使用(DAO层)
  • @Controller 在控制层使用,控制器的声明(Controller)
  • @Autowired:用来实现依赖注入,Autowired会通过对象类型进行注入,如在一个类中出现相同数据类型对象需要注入时,需要配合@Qualifier(对象名)进行组合注解进行注入
  • @Resource:用来实现依赖注入,Resource会先根据名称查找要注入的对象,在根据对象类型查找注入对象,根据名称查找时,可以通过Resource的name属性查找

applicationContext.xml文件配置

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context.xsd">
  <!--使用context:component-scan标签对包进行扫描,base-package属性为要扫描的包,扫描时会讲包下面的所有注解进行扫描-->
  <context:component-scan base-package="com.demo"/>
</beans>

DAO层

@Repository
public class DemoDAO implements IDemoDAO {
  @Override
  public void show() {
    System.out.println("我是DAO方法");
  }
}

Service层

@Service
public class DemoService implements IDemoService {

  //@Autowired
  //@Qualifier("demoDAO")
  @Resource
  private IDemoDAO demoDAO;

  /*
  public void setDemoDAO(IDemoDAO demoDAO) {
    this.demoDAO = demoDAO;
  }
  */

  @Override
  public void show() {
    demoDAO.show();
  }
}

获取IoC对象

//创建ApplicationContext,通过实例化ClassPathXmlApplicationContext获取配置文件
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");
//getBeanDefinitionNames获取配置文件中所有加载的Bean
String[] str=applicationContext.getBeanDefinitionNames();
for (String s : str) {
  System.out.println(s);
}
//getBean通过Bean的id属性获取对象
IDemoService demoService1= (IDemoService) applicationContext.getBean("demoService");
demoService1.show();

4、5Resource注解和Autowired注解的区别

@Autowired 和 @Resource 都是用来实现依赖注入的注解(在 Spring/Spring Boot 项目中),但二者却有着不同:文章来源地址https://www.toymoban.com/news/detail-537773.html

  • 来源不同:@Autowired 来自 Spring 框架,而 @Resource 来自于Java
  • 依赖查找的顺序不同:@Autowired 先根据类型再根据名称查询,而 @Resource 先根据名称再根据类型查询
  • 支持的参数不同:@Autowired 只支持设置 1 个参数,而 @Resource 支持设置 7 个参数
  • 依赖注入的用法支持不同:@Autowired 既支持构造方法注入,又支持属性注入和 Setter 注入,而 @Resource 只支持属性注入和 Setter 注入

到了这里,关于Spring第二讲:SpringIoC控制反转、依赖注入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入理解 Spring IoC 和 DI:掌握控制反转和依赖注入的精髓

    在本文中,我们将介绍 IoC (控制反转)和 DI (依赖注入)的概念,以及如何在 Spring 框架中实现它们。 控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中使用它。 与传统编程相比,传统编程中我

    2024年02月04日
    浏览(58)
  • Spring5学习随笔-IOC(反转控制)、DI(依赖注入)和创建复杂对象

    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】 控制:对于成员变量赋值的控制权 反转控制:把对于成员变量赋值的控制权,从代码中反转(转移)到Spring工厂和配置文件中。 好处:解耦合

    2024年02月05日
    浏览(42)
  • Spring入门&控制反转(或依赖注入)&AOP的关键概念& 多配置文件&与web集成

    目录 1. 什么是spring,它能够做什么? 2. 什么是控制反转(或依赖注入) 3. AOP的关键概念 4. 示例 4.1 创建工程 4.2 pom文件 4.3 spring配置文件 4.4 示例代码 4.4.1 示例1 4.4.2 示例2 (abstract,parent示例) 4.4.3 使用有参数构造方法创建javaBean 4.4.4 init-method:指定bean的初始化方法 4.4.5 复杂属

    2024年02月09日
    浏览(46)
  • Java Spring IoC&DI :探索Java Spring中控制反转和依赖注入的威力,增强灵活性和可维护性

    💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:Java Spring IoCDI :探索Java Spring中控制反转和依赖注入的威力,增强灵活性和可维护性 🎉欢迎大家点赞👍评论📝收藏⭐文章 我们一下要学习的内容都是为了实现⾼内聚低耦合来进行的 软件设计原则:⾼内聚低耦合. ⾼内聚指

    2024年04月15日
    浏览(48)
  • Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC

    Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的 反射机制 。简单来说, 反射机制指的是程序在运行时能够获取自身

    2024年02月09日
    浏览(62)
  • .NET使用依赖注入,控制反转

    .NET 支持依赖项注入 (DI) 软件设计模式,这是一种在类及其依赖项之间实现 控制 (IoC) 的反转 的技术 避免有状态的、静态类和成员。 通过将应用设计为改用单一实例服务,避免创建全局状态。 避免在服务中直接实例化依赖类。 直接实例化会将代码耦合到特定实现。 不在服务

    2023年04月16日
    浏览(45)
  • PHP依赖注入 与 控制反转详解

      依赖注入 是一种设计模式,用于解耦组件之间的依赖关系。 它的主要思想是通过 将依赖的对象传递给调用方 ,而 不是由调用方自己创建或管理依赖的对象 。这种方式使得组件的依赖关系更加灵活,易于维护和测试。 控制反转 是一个更广泛的概念,它与依赖注入紧密相

    2024年02月06日
    浏览(35)
  • 深入理解WPF中的依赖注入和控制反转

    在WPF开发中, 依赖注入(Dependency Injection)和控制反转(Inversion of Control)是程序解耦的关键,在当今软件工程中占有举足轻重的地位,两者之间有着密不可分的联系 。今天就以一个简单的小例子,简述如何在WPF中实现依赖注入和控制反转,仅供学习分享使用,如有不足之处

    2024年02月06日
    浏览(53)
  • 6.3Java EE——控制反转与依赖注入

    一、控制反转的概念 传统面向对象程序设计原则         控制反转(Inversion of Control,缩写为IoC)是面向对象编程中的一个设计原则,用来降低程序代码之间的耦合度。在传统面向对象编程中,获取对象的方式是用new主动创建一个对象,也就是说应用程序掌握着对

    2024年02月16日
    浏览(35)
  • CommunityToolkit.Mvvm8.1 IOC依赖注入控制反转(5)

      本系列文章导航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址) 希望提到的知识对您有所提示,同时欢迎交流和指正 作者:aierong 出处:https://www.cnblogs.com/aierong     CommunityToolkit.Mvvm包不提供ioc功能,但是官方建议使用:Microsoft.Extensions.DependencyInject

    2023年04月14日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包