IOC DI
IOC
IOC—Inversion of Control,即控制反转,这不是一项技术,而是一种设计思想。在java开发中,ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接开控制。
Dl
DI—Dependency Injection,即依赖注入,组件之间依赖关系由容器运行决定,形象的说,即由容器动态的将某个依赖关系注入到组件中。
DI好处:
- 动态替换Bean依赖对象,程序更灵活。
- 更好实践优先使用对象组合,而不是类继承。
- 采用对象组合,Bean的功能可能由几个依赖Bean的功能组合而成。
- 增加Bean可复用性
- 降低Bean之间的耦合性
- 代码结构更清晰
DI的三种注入类型
-
构造器注入
使用构造器注入通过配置构造器参数实现,构造器参数就是依赖。
传统实例化方式:
Tao t=new Tao(18,"钟文涛");
通过容器构造器依赖注入实例化
<bean name="tao" class="....Tao"> <constructor-arg name="name" value="钟文涛" /> <constructor-arg name="age" value="18" /> </bean>
-
setter注入
setter注入,是通过在通过构造器实例好bean后,通过调用bean类的setter方法进入注入依赖。
传统setter方法
Tao t=new Tao(); t.setName("钟文涛"); t.setAge(18);
通过容器setter注入
<bean> <property name="name" value="钟文涛" /> <property name="age" value="18" /> </bean>
setter注入注意点:
- 该类必须要有公共的无参构造器
- 属性为private访问级别,不建议public
- 属性必要时通过一组setter和getter方法来访问
- setter方法,以set开头,后跟首字母大写的属性名,如setAge,简单属性一般只有一个方法参数,方法返回值通常为void
- getter方法,一般属性以get开头,对于Boolean类型一般以is开头,后跟着首字母大写的属性名,如getAge,isOk
DI注入类型
-
注入常量
<property name="message" value="Hello World!"/> 或 <property name="index"> <value>1</value> </property>
-
注入List集合类型
<bean> <property name="hobby"> <list value-type="数据类型,不写默认为String" merge="default 不写默认为true 用于父子bean 是否合并还是覆盖"> <value>1</value> <value>2</value> </list> </property> </bean> list集合配置引用类型 <bean> <property name="hobby"> <list> <ref bean="tao"/> <ref bean="tao2"/> </list> </property> </bean>
-
注入Set集合类型
<!--需要使用<set>标签来配置注入,其配置参数及含义和<lsit>标签完全一样--> <bean> <property name="hobby"> <set> <value>1</value> <value>2</value> </set> </property> </bean>
-
注入数组类型
<!--一维数组--> <bean> <propert name="ywsz"> <array value-type="" merge="" 跟list一样> <value>1</value> <value>2</value> <value>3</value> </array> </propert> </bean> <!--二维数组--> <bean> <propert name="ewsz"> <array> <array value-type="" merge="" 跟list一样> <value>1</value> <value>2</value> <value>3</value> </array> <array value-type="" merge="" 跟list一样> <value>4</value> <value>5</value> <value>6</value> </array> </array> </propert> </bean>
-
注入Map类型
<bean> <property name="map"> <map key-type="key数据类型" value-type="value数据类型"> <entry key="1" value="钟文涛"/> </map> </property> </bean>
-
注入Properties
Spring能注入java.util.Properties类型数据,需要使用
标签来配置注入,键和值类型必须是String,不能变,子标签 值 来指定键值对。<bean> <property name="properties"> <props value-type="int">虽然这里指定了int类型,但是不起作用,因为它键和值就是String <prop key="a">aaaa</prop> <prop key="b">bbbb</prop> </props> </property> </bean>
引用其他Bean
-
构造器注入方式
<bean name="bean1" class="...." /> <bean name="bean2" class="...."> <constructor-arg index="0" ref="bean1"/> </bean> 或 <bean name="bean1" class="...." /> <bean name="bean2" class="...."> <constructor-arg index="0"> <ref bean="bean1"/> </constructor-arg> </bean>
-
setter注入方式
<bean name="bean1" class="...." /> <bean name="bean2" class="...."> <property name="setter" ref="bean1"/> </bean> 或 <bean name="bean1" class="...." /> <bean name="bean2" class="...."> <property name="setter"> <ref bean="bean1"/> </property> </bean>
-
处理null值
<bean> <property name="message"><null/></property> </bean>
-
使用p命名空间简化setter注入
<?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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean name="dept" class="com.trkj.pojo.Dept" p:dname="111"/> </beans>
零配置注入依赖
-
@Autowired
在零配置中,通过使用@Autowired来实现引用依赖注入
在自动扫描模式下自动装配
@Component("名字"),如果没有指定名字,会将类名首字母小写,然后当成名字。 public class Studen{ @Autowired(required默认为true,可以设置为false,代表必须给值) private int id; private String name; }
-
@Qualifier
-
@Autowired按优先类型自动装配(byType方式进行匹配)
-
当Spring容器中存在多个匹配类型(父子类)时,则建议使用@Qualifier按名称进行装配(byName方式进行匹配),使用@Qualifier,必须和@Autowired一起使用。
-
如果不使用@Qualifier时,也可利用属性名与类名来进行匹配,此时属性名为首字母小写后的类名
@Autowired @Qualifier("od") private Order order;//订单对象
-
-
Resource
在自动扫描模式下也可使用@Resource注解,但该注解由J2EE提供,需要导入包javax.annotation.Resource
-
如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
-
如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
-
如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
-
如果既没有指定name,又没有指定type,则自动按照byName方式进行装配(属性名匹配name);如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
@Autowired可以为空,@Resource不能为空@Resource(name = "od") private Order order;
-