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

news/2024/11/24 9:32:51/

四、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 {@Overridepublic void show() {System.out.println("我是DAO方法");}
}

Service层

public interface IDemoService {public void show();
}public class DemoService implements IDemoService {private IDemoDAO demoDAO=new DemoDAO();@Overridepublic 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;}@Overridepublic 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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://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 {@Overridepublic void show() {System.out.println("我是DAO方法");}
}

Service层

@Service
public class DemoService implements IDemoService {//@Autowired//@Qualifier("demoDAO")@Resourceprivate IDemoDAO demoDAO;/*public void setDemoDAO(IDemoDAO demoDAO) {this.demoDAO = demoDAO;}*/@Overridepublic 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 项目中),但二者却有着不同:

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

http://www.ppmy.cn/news/696145.html

相关文章

电信天翼网关接不上服务器无信号咋小,电信天翼网关,自带无线路由功能,但是信号很差,怎样设置新的路由无...

电脑已经连接这个光猫了&#xff0c;没有另外连接路由器的情况下可以在电脑pc登录光WiFi&#xff0c;和其他路由器默认地址一样输入192.168.1.1然后回车输入密码登录光猫的路由器功能。 然后在登录这个光猫路由器功能里有WiFi功能&#xff01;不想要这个光猫WiFi就关了这个WiFi…

关于天翼网关端口不能映射,以及修改网关连接模式的方法

昨天联系电信更换千兆光猫&#xff0c;换了个天翼网关&#xff0c;这个天翼网关是自己主动拨号&#xff0c;导致路由器端口不能转发&#xff08;虽然天翼网关可以设置端口转发&#xff0c;但是是个摆设&#xff0c;设置后端口也是无法转发的&#xff09; 既然这样&#xff0c;…

【学习笔记】网关 路由

资料来源&#xff1a; 交换机和路由器有什么区别&#xff1f;网关和路由又是什么意思&#xff1f;简单说网络2-交换机与路由器_哔哩哔哩_bilibili简单说网络2-交换机与路由器。每个家庭都有路由器&#xff0c;用于家庭网络设备连接互联网&#xff0c;但是我们经常听到的交换机…

ns3路由选择

编写一个程序&#xff0c;实现下图中的网络拓扑&#xff0c;支持PC0与Tablet PC1之间的互连 源代码 #include "ns3/core-module.h" #include "ns3/network-module.h" #include "ns3/internet-module.h" #include "ns3/csma-module.h"…

电信天翼路由器 连接另外一个路由器

家里用的路由器是天翼路由器&#xff0c;不能桥接&#xff0c;要想将无线网范围扩大&#xff0c;只能将另外一个路由器有线连接lan口完成。具体如下&#xff1a; 路由器下面再接一个无线路由器&#xff0c;2种方法&#xff1a;一、作为下级无线交换机使用1、必须更改你的无线路…

中山大学路由器如何通过h3c认证上网(极路由设置方法)

我在前一阵子因为Linux系统难以用yah3c上网的关系&#xff0c;所以花了钱狠心地买了个极路由。本文所提及的安装方法是在极路由的基础下进行安装的&#xff0c;若需要刷系统等&#xff0c;请自行寻找方法刷系统 1. 确认自己交了网费和netID已经激活用网线可以正常上网 2. 按照…

freeswitch添加一个gateway网关

当我们需要与第三方sip对接&#xff0c;或者使用E1进行网关外呼时就需要注册一个gateway来操作。我们需要拨打对方就需要我们的服务器注册对方的网关&#xff0c;如果对方拨打我们就让对方服务器注册我们的网关 地址在 freeswitch/conf/sip_profiles 中的 vim internal.xml &…

手把手教学电信天翼校园接入无线路由器(Windows Server版)

电信天翼校园安装无线路由器 前言设计思路配置步骤① 所需设备、环境② 给Windows Server配置NAT服务③ 给Windows Server配置DHCP服务&#xff08;选配&#xff09;④ 配置无线路由器⑤ Windows Server PC电脑认证天翼校园客户端⑥ 笔记本电脑连路由器的WIFI测试 结束语 前言 …