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配置
- 有参数构造注入
实体类
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 中
name 对应实体中的要注入的属性名,value 是name设置的属性值对应的内容。
beans.xml 配置
通过上面代码,可以知道有参构造注入的方法,在使用有参构造注入的时候,需要注意,在beans.xml 文件中bean的配置,
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配置
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 的配置
说明:在约束中定义P命名空间,然后在bean 中使用 p:变量
对变量进行赋值。
复杂类型注入
复杂类型注入其实也非常简单,在
标签中使用
,具体看下面示例:
- 数组
- list 类型
- set 类型
- map 类型
- properties 类型
- 创建实体bean
public class MultType {
private String[] arr;
private ArrayList list;
private Set set;
private Map map;
private Properties properties;
public void setArr(String[] arr) {
this.arr = arr;
}
public void setList(ArrayList list) {
this.list = list;
}
public void setSet(Set set) {
this.set = set;
}
public void setMap(Map 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
中注入结合属性的:
arr1
arr2
arr3
zhangsan
wangwu
hello
good
pro.value1
pro.value2