Spring篇

第二章、Spring IoC简介

一、基本概念

控制反转是一个比较抽象的概念,是Spring框架的核心,用来消减计算机程序的耦合问题。

依赖注入是IoC的另外一种说法,只是从不同的角度描述相同的概念。

二、控制反转和依赖注入

  • 控制反转:当Spring框架出现后,对象的实例(汽车)不再由调用者(我)来创建,而是由Spring容器(汽车店)来创建。Spring容器负责控制程序之间的关系(汽车店控制我和汽车零件的关系),而不是由调用者的程序代码直接控制。这样,控制权由调用者转移到Spring容器,控制权发生了反转,这就是Spring的控制反转。
  • 依赖注入:从Spring容器角度上看,Spring容器负责将被依赖对象赋值给调用者的成员变量,相当于为调用者注入它所依赖的实例,这就是Spring的依赖注入。

【附】:依赖注入采用的Java 的反射机制

三、代码操作

1、布局

2、构造方法注入

2.1、接口

  • 在包dao中添加接口TestDao
package dao;

public interface TestDao {
public void sayHello();
}
  • 在包server中添加接口TestDIService
package server;

public interface TestDIService {
public void sayHello();
}

2.2、接口实现类

  • 在包dao中添加接口实现类TestDaoImpl
package dao;

/**
* 接口实现类
* lin
* 2018/11/22
*/
public class TestDaoImpl implements TestDao {
@Override
public void sayHello() {
System.out.println("TestDiDaoSay:“Spring,Make persistent efforts!”");
}
}
  • 在包server中添加接实现类TestDIServiceImpl
package server;

import dao.TestDao;

public class TestDIServiceImpl implements TestDIService {
private TestDao testDao;
//构造方法,用于实现依赖注入接口对象testDiDao
public TestDIServiceImpl(TestDao testDao){
super();
this.testDao=testDao;
} @Override
public void sayHello() {
//调用testDIDao中的sayHello方法
testDao.sayHello();
System.out.println("TestDIService构造方法注入say:Study Hard!");
}
}

2.3、配置文件

添加配置文件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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--将指定类TextDaoImpl配置给Spring,让Spring创建其实例-->
<bean id="test" class="dao.TestDaoImpl"/>
<!--使用构造方法注入-->
<bean id="testDIService" class="server.TestDIServiceImpl">
<!--将myTestDIDao注入到TestDIServiceImpl类的属性testDIDao-->
<constructor-arg index="0" ref="test"/>
<!--constructor-arg:用于定义类的构造方法的参数-->
<!--index:定义参数的位置-->
<!--ref:某一个实例的引用-->
</bean>
</beans>

2.4、测试类

在包test添加测试类TestDI

package test;

import dao.TestDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import server.TestDIService; public class Test {
public static void main(String[] args) {
//初始化Spring容器ApplicationContest,加载配置文件
ApplicationContext appCon=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取test实例
TestDIService testDIService=(TestDIService)appCon.getBean("testDIService");
testDIService.sayHello();
}
}

3、使用属性setter方法注入

3.1、接口实现类

在包server中添加TestDIServiceImpl_setter类

package server;

import dao.TestDao;
import dao.TestDaoImpl; public class TestDIServiceImpl_setter implements TestDIService {
private TestDao testDao;
//添加testDIDao属性的setter方法,用于实现依赖注入o
public void setTestDIDao(TestDao testDIDao) {
this.testDao=testDIDao;
} @Override
public void sayHello() {
//调用testDIDao中的sayHello方法
testDao.sayHello();
System.out.println("setter方法注入say:Study Hard!");
}
}

3.2、配置文件

在原有的配置文件applicationContext.xml中添加bean属性

<bean id="testDIServicel" class="server.TestDIServiceImpl_setter">
<!--调用TestDIServiceImpl_setter中的setter方法,将myTestDIDao注入到TestDIServiceImpl_setter类的testDIDao上-->
<property name="testDIDao" ref="test"/>
</bean>

总:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--将指定类TextDaoImpl配置给Spring,让Spring创建其实例-->
<bean id="test" class="dao.TestDaoImpl"/>
<!--使用构造方法注入-->
<bean id="testDIService" class="server.TestDIServiceImpl">
<!--将myTestDIDao注入到TestDIServiceImpl类的属性testDIDao-->
<constructor-arg index="" ref="test"/>
<!--constructor-arg:用于定义类的构造方法的参数-->
<!--index:定义参数的位置-->
<!--ref:某一个实例的引用-->
</bean>
<!--使用setter方法注入-->
<bean id="testDIServicel" class="server.TestDIServiceImpl_setter">
<!--调用TestDIServiceImpl_setter中的setter方法,将myTestDIDao注入到TestDIServiceImpl_setter类的testDIDao上-->
<property name="testDIDao" ref="test"/>
</bean>
</beans>

3.3、测试类

在test中插入代码

//通过容器获取testDIService实例,测试setter方法注入
TestDIService testDIService1=(TestDIService)appCon.getBean("testDIServicel");
testDIService1.sayHello();

package test;

import dao.TestDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import server.TestDIService; public class Test {
public static void main(String[] args) {
//初始化Spring容器ApplicationContest,加载配置文件
ApplicationContext appCon=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取test实例
TestDIService testDIService=(TestDIService)appCon.getBean("testDIService");
testDIService.sayHello();
//通过容器获取testDIService实例,测试setter方法注入
TestDIService testDIService1=(TestDIService)appCon.getBean("testDIServicel");
testDIService1.sayHello();
}
}

最新文章

  1. 富文本编辑器防止xss注入javascript版
  2. C#如何分割多个空格分隔的字符串?
  3. Working with HTTP
  4. 你应当如何学习C++(以及编程)(转载)
  5. 纵观minecraft 游戏作者的世界观
  6. 【BZOJ 2005】[Noi2010]能量采集
  7. java 对list中对象按属性排序
  8. 【转】Compile、Make和Build的区别
  9. 创建.NET Core项目
  10. 邪恶改装:TPYBoard制作廉价WIFI干扰器
  11. 学习笔记—XML
  12. zabbix Server 4.0 部署及之内置item使用案例
  13. Web高级 HTTP报文
  14. 洛谷P2470 [SCOI2007]压缩(区间dp)
  15. query
  16. 【Python深入】Python中继承object和不继承object的区别
  17. javascript 体验定时器
  18. flask-WTForms组件
  19. Cocos2d-x学习笔记(五)调度
  20. BZOJ2671 Calc 【莫比乌斯反演】

热门文章

  1. P3784 [SDOI2017]遗忘的集合
  2. 《剑指offer》总结一
  3. Two Melodies CodeForces - 813D (DP,技巧)
  4. 『Numpy』np.ravel()和np.flatten()
  5. php多线程代码
  6. Cassandra内部架构
  7. [洛谷 P1972] HH的项链(SDOI2009)
  8. C++ leetcode::Reverse Integer
  9. MySql语句中Union和join的用法
  10. SpringBoot主程序类,主入口类