IOC 和 DI 区别
- IOC : 控制反转,把对象创建交给spring 进行配置。
- DI : 依赖注入,向类里面的属性中设置值。
- 关系 : 依赖注入不能单独存在,需要在IOC基础之上完成操作。
属性注入
属性注入是在创建对象时候,向类里面属性里面设置值。
在 Java 中属性注入的三种方式
- 使用 set 方法注入
public class User{
private String name;
public void setName(String name){
this.name = name;
}
}
User user = new User();
user.setName("abcd");
- 使用有参构造注入
public class User{
private String name;
public User(String name){
this.name = name;
}
}
User user = new User("abc");
- 使用接口注入
public interface Dao{
public void insert(String name);
}
public class DaoImpl implements Dao{
private String name;
public void insert(String name){
this.name = name;
}
}
在 Spring 框架里面,支持两种方式
- set 方法注入(重点)
实体类
package com.sfox.bean;
public class Book {
private String name;
public void setName(String name){
this.name = name;
}
public void putMsg(){
System.out.println("out put name:" + name);
}
}
beans.xml配置
<!-- 使用set方法注入属性 -->
<bean id="book" class="com.sfox.bean.Book">
<!-- 注入属性值
name 属性:实体类里面定义的属性
value 属性:设置具体的值
-->
<property name="name" value="战士"/>
</bean>
- 有参数构造注入
实体类
package com.sfox.bean;
public class Book {
private String name;
public Book(String name){
this.name = name;
}
public void putMsg(){
System.out.println("out put name:" + name);
}
}
上面代码是使用set方法注入属性值,需要注意一下几点,
- 要在对应的实体类中添加需要注入的属性的set方法。
- beans.xml 中
<property name="name" value="战士"/>
name 对应实体中的要注入的属性名,value 是name设置的属性值对应的内容。
beans.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">
<!-- 有参数构造注入-->
<bean id="book" class="com.sfox.bean.Book">
<constructor-arg name="name" value="王五"/>
</bean>
</beans>
通过上面代码,可以知道有参构造注入的方法,在使用有参构造注入的时候,需要注意,在beans.xml 文件中bean的配置,<constructor-arg name="name" value="王五"/>
name 对应实体中的要注入的属性名,value 是name设置的属性值对应的内容。
注入对象类型属性值
下面的示例是向一个 Service 中注入一个 Dao ,在Service 中调用注入的 Dao.
实体Service
package com.sfox.bean;
public class ServiceDao {
private BookDao bookDao;
public void setBookDao(BookDao bookDao){
this.bookDao = bookDao;
}
public void serviceOut(){
System.out.println("service out......");
bookDao.bookDaoOut();
}
}
实体Dao
package com.sfox.bean;
public class BookDao {
public void bookDaoOut(){
System.out.println("book Dao....");
}
}
beans.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">
<bean id="bookDao" class="com.sfox.bean.BookDao"/>
<bean id="serviceDao" class="com.sfox.bean.ServiceDao">
<!-- 注入dao 对象
name 属性值:ServiceDao 类里面属性名称
现在不要写value属性,因为是对象
ref 属性: dao 配置bean标签中的id值
-->
<property name="bookDao" ref="bookDao"/>
</bean>
</beans>
P 命名空间注入
p命名空间注入和上面介绍的有些相同,很简单,在约束中加入如下约束:
xmlns:p="http://www.springframework.org/schema/p"
好了,现在我们就可以使用p命名空间注入了。
P命名空间注入bean配置也非常简单,看下面示例:
-
实体类:
public class UserP { private String pname; public void setPname(String pname) { this.pname = pname; } public void show() { System.out.println("pname:" + pname); } }
beans.xml 中bean 的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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="userp" class="com.cfox.spring.UserP" p:pname="wangwu"></bean>
</beans>
说明:在约束中定义P命名空间,然后在bean 中使用 p:变量
对变量进行赋值。
复杂类型注入
复杂类型注入其实也非常简单,在<bean>
标签中使用<property>
,具体看下面示例:
- 数组
- list 类型
- set 类型
- map 类型
- properties 类型
- 创建实体bean
public class MultType {
private String[] arr;
private ArrayList<String> list;
private Set<String> set;
private Map<String, String> map;
private Properties properties;
public void setArr(String[] arr) {
this.arr = arr;
}
public void setList(ArrayList<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public void show() {
System.out.println( "MultType [arr=" + Arrays.toString(arr) + ", list=" + list
+ ", set=" + set + ", map=" + map + ", properties="
+ properties + "]");
}
}
下面我们看一下beans.xml
中如何配置向bean
中注入结合属性的:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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="multType" class="com.cfox.spring.MultType">
<!-- 数组 -->
<property name="arr">
<list>
<value>arr1</value>
<value>arr2</value>
<value>arr3</value>
</list>
</property>
<!-- list 集合 -->
<property name="list">
<list>
<value>zhangsan</value>
<value>wangwu</value>
</list>
</property>
<!-- set 集合 -->
<property name="set">
<set>
<value>hello</value>
<value>good</value>
</set>
</property>
<!-- map 集合 key->value -->
<property name="map">
<map>
<entry key="key1" value="value1"></entry>
<entry key="key2" value="value2"></entry>
<entry key="key3" value="value3"></entry>
</map>
</property>
<!-- properties -->
<property name="properties">
<props>
<prop key="pro1">pro.value1</prop>
<prop key="pro2">pro.value2</prop>
</props>
</property>
</bean>
</beans>