第二章 IoC Setter注入
Setter注入又称为属性注入。是通过属性的setXXX()方法来注入Bean的属性值或依赖对象。由于Setter注入具有可选择性和灵活性高的优点,因此Setter注入是实际应用中最常用的注入方式。
ref的方式
a、使用2.2的例子中的UserDao与UserDaoImpl
- public interface UserDao {
- public void save();
- }
- public class UserDaoImpl implements UserDao {
- public void save() {
- System.out.println("保存用户...");
- }
- }
b、创建UserService接口及其实现类UserServiceImpl
public interface UserService {
public void addUser();
}
public class UserServiceImpl implements UserService {
/*
* 在service层使用dao层的接口对象
* 接口对象必须有其setter方法,以供运行期spring注入值
*/
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void addUser() {
userDao.save();
}
}
c、将UserDaoImpl与UserServiceImpl交由Spring管理
<bean id="userDao" class="cn.framelife.spring.dao.impl.UserDaoImpl"></bean> <!-- property是UserServiceImpl中的属性设置,这些属性必须有setter方法。name是属性的名字,与类中的名字相同。ref是引用,引用的是上面配置好的UserDaoImpl的name --> <bean id="userService" class="cn.framelife.spring.service.impl.UserServiceImpl"> <property name="userDao" ref="userDao"></property> </bean>
d、测试
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
UserService userService = (UserService) context.getBean("userService");
userService.addUser();
注入内部Bean
注入内部Bean其实也是ref的方式基本一样,只是在配置的时候不大相同而已。UserDaoImpl不再需要作为单独的Bean交由Spring管理,而是作为UserServiceImpl的一部分来进行配置。
配置:
<!-- property是UserServiceImpl中的属性设置,这些属性必须有setter方法。name是属性的名字,与类中的名字相同。Bean是属性对象所属的类的完整类名 --> <bean id="userService" class="cn.framelife.spring.service.impl.UserServiceImpl"> <property name="userDao"> <bean class="cn.framelife.spring.dao.impl.UserDaoImpl"></bean> </property> </bean>
注入基本类型
如:UserService中有一个String类型的字符串username:
public class UserServiceImpl implements UserService {
private UserDao userDao;
private String username;
public void setUsername(String username) {
this.username = username;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void addUser() {
System.out.println(username);
userDao.save();
}
}
配置:
<bean id="userService" class="cn.framelife.spring.service.impl.UserServiceImpl"> <property name="userDao"> <bean class="cn.framelife.spring.dao.impl.UserDaoImpl"></bean> </property> <property name="username" value="zhangsan"></property> </bean>
注入集合
a、List和Set
类中有一个集合属性及其setter方法。
private Set<String> usernames;
public void setUsernames(Set<String usernames){
this.usernames = usernames;
}
配置:
<property name="usernames"> <list> <value>aaa</value> <value>bbb</value> <value>ccc</value> </list> </property>
或者:
<property name=" usernames"> <set> <value>aaa</value> <value>bbb</value> <value>ccc</value> </set> </property>
b、Map
类中的属性:
private Map<Integer, String> map;
public void setMap(Map<Integer, String> map) {
this.map = map;
}
配置:
<property name="map"> <map> <entry key="1"> <value>aaa</value> </entry> <entry key="2"> <value>bbb</value> </entry> </map> </property>
c、Properties
Properties类型其实可以看成是Map类型的一种。Properties的键和值都只能是字符串。
类中的属性:
private Properties mails;
public void setMails(Properties mails) {
this.mails = mails;
}
配置:
<property name="mails"> <props> <prop key="mailOfZhang">zhangsan_2013@163.com</prop> <prop key="mailOfLi">Lixiaolong_abcxx@qq.com</prop> </props> </property>


浙公网安备 33010602011771号