第二章 IoC Setter注入

时间:2024-01-09 22:29:38

Setter注入又称为属性注入。是通过属性的setXXX()方法来注入Bean的属性值或依赖对象。由于Setter注入具有可选择性和灵活性高的优点,因此Setter注入是实际应用中最常用的注入方式。

ref的方式


a、使用2.2的例子中的UserDao与UserDaoImpl

  1. public interface UserDao {
  2. public void save();
  3. }
  1. public class UserDaoImpl implements UserDao {
  2. public void save() {
  3. System.out.println("保存用户...");
  4. }
  5. }

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>