一、什么是IOC(Inversion of Control----------控制反转)?
IOC不是一种技术,而是一种编程思想(记住它是一种编程思想、编程思想、编程思想)。那IOC为什么叫控制反转呢?控制什么?谁控制了谁?为什么要反转?这里要分成两个部分去解释——
1.什么是控制?
讲到控制,要理解控制什么?谁控制了谁?-------在传统的Java开发中,我们创建对象总少不了去new一个,意味着这是由程序控制创建对象;而引入spring后,spring有一个专门的ioc容器来控制创建对象。控制什么?控制对象的创建和管理等等;谁控制了谁?spring ioc容器控制了对象
2.什么是反转?
原本对象是由程序自己创建管理的,现在引入spring ioc容器后,对象由ioc容器去创建管理,程序编程被动接收由ioc容器创建的对象。这里的反转主要指创建对象的权限发生转移
总结一下:控制是指谁控制谁?反转则是权限的转移
二、什么是DI(Dependency Injection---依赖注入)
1.依赖注入是控制反转的一个别名,从另一个角度解释控制反转。被注入的对象(程序)依赖于IoC容器创建的对象
2.什么是依赖?--------主要指程序依赖于ioc容器
3.什么是注入?--------ioc容器将程序依赖的对象注入到程序中
4.依赖注入分为两种
1)构造注入
第一步:创建一个类
//创建一个User类
public class User {
public String userName;
public String id;
//构造注入必须要用到有参构造方法
public User(String userName, String id) {
super();
this.userName = userName;
this.id = id;
}
public String getUserName() {
return userName;
}
public String getId() {
return id;
}
}
第二步:创建applicationContext-core.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 构造注入 -->
<bean id="user" class="com.spring.user.entity.User">
<constructor-arg name="userName" value="张三"/>
<constructor-arg name="id" value="20190327"/>
</bean>
</beans>
第三步:编写测试类
public class TestUser extends TestCase {
//通过配置文件名获取配置上下文对象context,通过context对象来获取ioc容器构造注入产生的user对象
//使用该对象,需要导入spring-context的jar包
private ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-core.xml");
@Test
public void test01() {
User user = null;//不用new一个对象,我们在下面用构造注入获取ioc容器创建的User对象
user = (User) context.getBean("user");//此处通过你在applicationContext-core.xml文件中配置是的ID获取相应对象
System.out.println("userName:"+user.getUserName()+" id:"+user.getId());
}
}
最后一步:运行测试类,你会发现user对象的内容确实是ioc容器构造注入中配置的内容
2)setter注入
第一步:同样创建一个类
package com.spring.user.entity;
public class User {
public String userName;
public String id;
//setter注入需要用到set方法和无参构造方法
public User() {
super();
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setId(String id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public String getId() {
return id;
}
}
第二步:编写配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- setter注入 -->
<bean id="user" class="com.spring.user.entity.User">
<property name="userName" value="李四"/>
<property name="id" value="20190328"/>
</bean>
</beans>
第三步:编写测试类
public class TestUser extends TestCase {
//通过配置文件名获取配置上下文对象context,通过context对象来获取ioc容器构造注入产生的user对象
//使用该对象,需要导入spring-context的jar包
private ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-core.xml");
@Test
public void test02() {
User user = null;//不用new一个对象,我们在下面用构造注入获取ioc容器创建的User对象
user = (User) context.getBean("user");//此处通过你在applicationContext-core.xml文件中配置是的ID获取相应对象
System.out.println("userName:"+user.getUserName()+" id:"+user.getId());
}
}
第四步:运行测试类,你会发现user对象的内容确实是ioc容器中setter构造配置的内容
学习spring,你少不了看看文档的,这里有Spring框架中文文档5.1.3.RELEASE以及原汁原味的官方英文文档spring-framework-reference--------------------https://download.csdn.net/download/cholg/11065678