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>