- 什么是IOC
IOC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。传统的java开发,我们需要一个组件时,需要我们自己去new Object(),但是IOC思想是将创建对象的过程交给了容器,我们无需关心对象如何创建,只要在我们使用时直接去容器中取就可以。控制反转即:创建对象的权利反转了,传统的主动创建,现在变成了第三方创建我们来使用。
- 什么是DI
DI—Dependency Injection,即“依赖注入”:将IOC容器中创建好的对象,注入到需要使用的地方。
- DI和IOC的关系
“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。
- DI依赖注入的几种方式
- xml配置文件注入
1)设值注入(setter注入)
①配置文件中设置<property>属性
<?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">
<!--setter方法注入(设置植入)-->
<bean id="mainTest" class="com.base.java.test.MainTest">
<property name="demo" ref="test"></property>
</bean>
<bean id="test" class="com.base.java.test.TestDemo"></bean>
</beans>
②在类中创建setter方法
public class MainTest {
private TestDemo demo;
private String name;
//setter方法注入
public void setDemo(TestDemo demo) {
this.demo = demo;
}
public void getTest(){
System.out.println("注入成功" + name);
demo.doSomeThing();
}
}
说明:spring会使用类中的set方法对属性进行,setDemo与配置文件名称demo(去掉set)要相同否则会报错。
2)构造注入
①配置文件
<?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">
<!--构造器注入-->
<bean id="mainTest" class="com.base.java.test.MainTest">
<!--第一种方式-->
<constructor-arg index = "0" ref="test"></constructor-arg>
<constructor-arg index = "1" value="张三"></constructor-arg>
<!--第二种方式-->
<constructor-arg name="demo" ref="test"></constructor-arg>
<constructor-arg name = "name" value="张三"></constructor-arg>
</bean>
<bean id="test" class="com.base.java.test.TestDemo"></bean>
</beans>
②类中创建构造方法
package com.base.java.test;
/**
* set注入和构造器注入
*/
public class MainTest {
private TestDemo demo;
private String name;
//构造器方法注入
public MainTest(TestDemo demo,String name){
this.demo = demo;
this.name = name;
}
public void getTest(){
System.out.println("注入成功" + name);
demo.doSomeThing();
}
}
3)自动装配
说明:bean自动装配有四种方式:
- no:不做任何操作。
- byname:根据属性名称自动装配,要求属性名称与IOC容器内名称一致(需要set方法配合)。
- byType:根据属性type属性进行匹配(与配置文件id名称无关),如果存在多个该类型bean,抛出异常。如果找不到类型,什么事情都不做(需要set方法配合)。
- Constructor:与bytype类似,不同之处,他应用构造参数,如果没有找到与构造参数类型一致的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"
default-autowire="byName">
<bean id="test" class="com.base.java.test.MainTest"></bean>
<bean id="demo" class="com.base.java.test.TestDemo"></bean>
</beans>
2.注解注入
1)@Autowired
这个注解是spring自带的注解,默认按类型进行注入,注入时如果类型有多个则报错,Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰
2)@Resource
@Resource是Java自己的注解,@Resource有两个属性是比较重要的,分是name和type;Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。