Spring入门(二)
Spring IOC&DI
控制反转(inversion of control):控制什么?什么反转?
我们都知道,传统的程序中,如果A类需要使用B类对象,会在程序中直接创建B类对象实例,此时创建对象的控制权在A类手上;但现在出现了一个IOC/DI容器,由IOC/DI容器代替A类执行实例化B类的权利,所谓控制权由A类转向IOC容器,即控制反转。
依赖注入(Dependency Injection):什么是依赖,谁依赖谁,什么是注入,谁注入,注入哪里?
依赖就是依靠依附(鱼依赖水),对象依赖IOC/DI容器,注入:IOC/DI容器将某个对象的资源注入到所需要该对象资源的对象中;从IOC/DI容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,相当于为调用者注入他所依赖的实例。
总结:控制反转是原则,依赖注入是实现,控制反转的从程序角度出发描述概念,依赖注入从Spring容器角度出发描述概念。
Spring IOC实现
BeanFactory:提供完整的Ioc服务支持,是一个管理Bean的工厂,负责初始化各种bean,有多个实现类,例如:XmlBeanFactory(该类根据XML配置文件中的定义来装配Bean)
ApplicationContext:是BeanFactory的子接口,除了支持BeanFactory的功能外,还支持国际化,资源访问等内容
创建ApplicationContext接口实例的方法有三种
- ClassPathXmlApplicationContext(相对路径)
- FileSystemXmlApplicationContext(绝对路径)
- 通过Web服务器实例化ApplicationContext(web.xml文件中) 此种方式自己还未理解什么意思
依赖注入类型
使用构造方法注入
Dao&DaoImpl
public interface TestDIDao {
void sayhello();
}
import com.dao.TestDIDao;
public class TestDIDaoImpl implements TestDIDao{
@Override
public void sayhello() {
System.out.println("Hello World!");
}
}
Service&ServiceImpl
public interface TestDIService {
public void sayHello();
}
public class TestDIServiceImpl implements TestDIService {
public TestDIDao testDIDao;
//构造方法,用于实现依赖注入接口对象testDIDao
public TestDIServiceImpl(TestDIDao testDIDao) {
super();
this.testDIDao = testDIDao;
}
@Override
public void sayHello() {
//调用testDIDao中的sayHello方法
testDIDao.sayhello();
System.out.println("TestDIService依赖注入调用TestDIDao中的方法....");
}
}
Xml
<!-- 将指定的类TestDaoImpl配置给Spring,让Spring创建该实例 -->
<bean id="testDIDao" class="com.dao.impl.TestDIDaoImpl" />
<!-- 使用构造方法注入 -->
<bean id="testDIService" class="com.service.impl.TestDIServiceImpl">
<!--将myTestDADao注入到TestDIServiceImpl类的属性testDIDao上-->
<constructor-arg index="0" ref="testDIDao"></constructor-arg>
</bean>
Test
//测试用构造器方式注入
//初始化spring容器ApplicationContext,加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取testDIService实例,测试构造方法注入
TestDIService testDIService = (TestDIService) context.getBean("testDIService");
testDIService.sayHello();
使用属性注入
Dao&DaoImpl
public interface TestDIDao {
void sayhello();
}
import com.dao.TestDIDao;
public class TestDIDaoImpl implements TestDIDao{
@Override
public void sayhello() {
System.out.println("Hello World!");
}
}
Service&ServiceImpl
public interface TestDIService {
public void sayHello();
}
public class TestDIServiceImpl implements TestDIService {
public TestDIDao testDIDao;
//使用setter方法实现注入
public void setTestDIDao(TestDIDao testDIDao) {
this.testDIDao = testDIDao;
}
@Override
public void sayHello() {
//调用testDIDao中的sayHello方法
testDIDao.sayhello();
System.out.println("TestDIService依赖注入调用TestDIDao中的方法....");
}
}
XML
<!-- 将指定的类TestDaoImpl配置给Spring,让Spring创建该实例 -->
<bean id="testDIDao" class="com.dao.impl.TestDIDaoImpl" />
<!-- 使用属性方法注入 -->
<bean id="testDIService" class="com.service.impl.TestDIServiceImpl">
<!-- 调用TestDIServiceImpl类的setter方法,将myTestDADao注入到TestDIServiceImpl类的属性testDIDao上 -->
<property name="testDIDao" ref="testDIDao"></property>
</bean>
Test
//测试用属性方式注入
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
TestDIService testDIService = (TestDIService)context.getBean("testDIService");
testDIService.sayHello();
参考博文:
https://blog.csdn.net/doris_crazy/article/details/18353197
https://www.cnblogs.com/zanpen2000/p/7810884.html
https://www.cnblogs.com/leoo2sk/archive/2009/06/17/di-and-ioc.html
同样在自学Spring的小伙伴,如果看到我的博客,希望留下你的联系方式,我们一起加油!!!
Spring入门(二)的更多相关文章
- Spring入门(二):自动化装配bean
Spring从两个角度来实现自动化装配: 组件扫描(component scanning):Spring会自动发现应用上下文中需要创建的bean. 自动装配(autowiring):Spring会自动 ...
- Spring入门二:整合mybatis
一.SM思路分析 1.引入核心依赖及相关依赖: spring(略).mybatis.mysql.mybatis-spring(减少自己实现FactoryBean接口).druid <depen ...
- spring入门(二) 使用注解代替xml配置
1.导包(略) 2.applicationContext.xml如下: <?xml version="1.0" encoding="UTF-8"?> ...
- Spring入门详细教程(二)
前言 本篇紧接着spring入门详细教程(一),建议阅读本篇前,先阅读第一篇.链接如下: Spring入门详细教程(一) https://www.cnblogs.com/jichi/p/1016553 ...
- Spring Boot入门(二):获取配置文件值
本篇博客主要讲解下在Spring Boot中如何获取配置文件的值. 1. 使用yaml配置文件 Spring Boot默认生成的配置文件为application.properties,不过它也支持ya ...
- Spring(二)--Spring入门案例
Spring入门案例 1.需要的实体类 2.需要的接口和实现类 3.需要的service和实现类 /** * service层的作用 * 在不改变dao层代码的前提下,增加业务逻辑操作 */ publ ...
- spring 入门篇
spring 入门篇 相对于Hibernate(冬眠),Spring(春天),具有更多的诗意与希望的感觉,是为了解决传统J2EE开发效率过低.开发商之间不统一.没有真正实现“写一次到处 ...
- spring入门详细教程(五)
前言 本篇紧接着spring入门详细教程(三),建议阅读本篇前,先阅读第一篇,第二篇以及第三篇.链接如下: Spring入门详细教程(一) https://www.cnblogs.com/jichi/ ...
- Spring入门详细教程(四)
前言 本篇紧接着spring入门详细教程(三),建议阅读本篇前,先阅读第一篇,第二篇以及第三篇.链接如下: Spring入门详细教程(一) https://www.cnblogs.com/jichi/ ...
- Spring入门详细教程(三)
前言 本篇紧接着spring入门详细教程(二),建议阅读本篇前,先阅读第一篇和第二篇.链接如下: Spring入门详细教程(一) https://www.cnblogs.com/jichi/p/101 ...
随机推荐
- LVM-扩容目录
LVM LVM是一种源自Unix环境,在Linux上广泛应用的逻辑虚拟盘存储方案.借助LVM,可以在保证各个Linux目录分区稳定,又可以实现各目录存储资源灵活分配. 本文主要系统介绍Linux环境下 ...
- virtualbox ubuntu 磁盘大小扩容
前言 虚拟机软件: virtuabox 虚拟机运行的系统: Ubuntu 18.04.3 desktop 如果需要扩容的虚拟机在运行中,请将需要扩容的虚拟机进行关机 方法 先设置虚拟机的虚拟硬盘的大小 ...
- Kafka速览
一.基本结构 三台机器组成的Kafka集群,每台机器启动一个Kafka进程,即Broker 向broker发送消息的客户端是Producer,拉取消息的客户端是Consumer Producer和Co ...
- SpringBoot - @ControllerAdvice 处理异常
在Spring 3.2中,新增了@ControllerAdvice.@RestControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@Mode ...
- Magento站点优化方案
Magento 是一个开源电子商务系统,尤其以扩展性高著称,但是很高的扩展性往往是牺牲了速度为代价的,虽然现在magento为速度提升做了很多工作,但是还是没能达到人们对速度的要求.既然如此还是很自然 ...
- Vue学习笔记【7】——Vue指令之v-model和双向数据绑定
v-model是唯一可以实现双向数据绑定的vue指令 单向数据绑定:修改内存中的数据,页面上同步更改.v-bind <!-- v-bind 只能实现数据的单向绑定,从 M 自动绑定到 V, 无法 ...
- Linux下安装PHP的curl扩展
先安装依赖包: yum install curl curl-devel 找到PHP的安装包,cd 进入安装包 cd php-5.6.25/ext/curl phpize 如果报找不到phpize就补全 ...
- P1064 金明的预算方案 (分组背包稍稍变形)
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”. ...
- NX二次开发-自定义添加右键菜单RegisterConfigureContextMenuCallback
首先声明这个知识我以前不知道,是夏天的时候看到别人在唐工的QQ群里问的,唐工说西门子官方有这个例子.那个时候我因为在忙其他事情,也就没去研究那个右键菜单到底是怎么做的.关于自定义添加右键菜单Regis ...
- Tomcat服务器配置参考
Coyote HTTP/1.1 Connector 概述 Coyote HTTP/1.1 Connector元素是一个支持HTTP/1.1协议的Connector组件.它使Catalina除了能够执行 ...