settter注入,分为两种引用类型和简单类型
<?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="dao.impl.bookdaoimpl" >
<property name="age" value="13"/>
<property name="name" value="zhangpeng"/>
</bean>
<bean id = "usedao" class="dao.impl.userdaoimpl" />
<bean id = "bookservice" class="service.impl.bookserviceimpl" >
<!-- 注意ref对应上面dao层配置bean的id,name对应创建属性的变量名-->
<property name="bookdao" ref="bookdao"/>
<property name="userdao" ref="usedao"/>
</bean>
</beans>
配置文件设置如上图所示,
<有一点你要注意,在那个bean写的配置信息你就跑哪个impl实现类里面去改>
我就是引用放在service层里面,简单放dao层里面
package service.impl;
import dao.bookdao;
import dao.userdao;
import service.bookservice;
public class bookserviceimpl implements bookservice {
private bookdao bookdao;
private userdao userdao;
public void setUserdao(dao.userdao userdao) {
this.userdao = userdao;
}
public void setBookdao(bookdao bookdao) {
this.bookdao = bookdao;
}
public void real() {
System.out.println("book service save.....");
bookdao.save();
userdao.save();
}
}
这里我设置两个接口属性测试是否可以多开,结果是的
引用数据类型要求
1.就是在bean中定义引用类型属性并提供可以访问的set方法
2.配置里面用property标签注入引用的类型对象,注意name和ref分别对应哪里
public class bookdaoimpl implements bookdao {
private int age;
private String name;
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
@Override
public void save() {
System.out.println("book dao save...."+name+age);
}
}
简单数据类型要求
1.就是在bean中定义简单类型属性并提供可以访问的set方法
2.配置里面用property标签注入简单数据类型对象,注意name和value的用法!
构造器注入,同样引用和简单数据两种类型
<?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.zp.dao.impl.bookdaoimpl" >
<constructor-arg name="name" value="zhangpeng"/>
<constructor-arg name="age" value="18"/>
</bean>
<bean id = "userdao" class="com.zp.dao.impl.userdaoimpl" />
<bean id = "bookservice" class="com.zp.service.impl.bookserviceimpl" >
<constructor-arg name="bookdao1" ref="bookdao"/>
<constructor-arg name="userdao1" ref="userdao"/>
<!-- 注意此处的name与实现类中的形参变量高度耦合。有的视情况而定可以用type=“int”代替name,或者是index=“0”这种,不过一般都不太好-->
</bean>
</beans>
与setter注入是xml文件配置不同的是换成了constructor-arg,并且注意这里name和之前不一样是实现类的形参,其他是一样
public class bookdaoimpl implements bookdao {
private int age;
private String name;
public bookdaoimpl(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public void save() {
System.out.println("book dao save...."+age+","+name);
}
}
public class bookserviceimpl implements bookservice {
private bookdao bookdao;
private userdao userdao;
public bookserviceimpl(com.zp.dao.bookdao bookdao1, com.zp.dao.userdao userdao1) {
this.bookdao = bookdao1;
this.userdao = userdao1;
}
public void real() {
System.out.println("book service save.....");
bookdao.save();
userdao.save();
}
}
两个实现类呢也是采用了构造方法,没用setter方法
总结
构造器注入多用于强制依赖的注入,setter用于可选依赖的注入
<受控对象没有setter方法,只能用构造器注入>
自己用的话还是setter注入吧,构造器有缺点不好用