Spring IoC Setter注入

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

ref的方式

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

[java] 

  1. public interface UserDao {
  2.     public void save();
  3. }
[java] 

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

b、创建UserService接口及其实现类UserServiceImpl

[java] 

  1. public interface UserService {
  2.     public void addUser();
  3. }

 

[java] 

  1. public class UserServiceImpl implements UserService {
  2.     /*
  3.      * 在service层使用dao层的接口对象
  4.      * 接口对象必须有其setter方法,以供运行期spring注入值
  5.      */
  6.     private UserDao userDao;
  7.     public void setUserDao(UserDao userDao) {
  8.         this.userDao = userDao;
  9.     }
  10.     public void addUser() {
  11.         userDao.save();
  12.     }
  13. }

 

c、将UserDaoImpl与UserServiceImpl交由Spring管理

[html] 

  1.        <bean id=”userDao” class=”cn.framelife.spring.dao.impl.UserDaoImpl”></bean>
  2. <!– property是UserServiceImpl中的属性设置,这些属性必须有setter方法。name是属性的名字,与类中的名字相同。ref是引用,引用的是上面配置好的UserDaoImpl的name –>
  3. <bean id=”userService” class=”cn.framelife.spring.service.impl.UserServiceImpl”>
  4.     <property name=”userDao” ref=”userDao”></property>
  5. </bean>

 

d、测试

[java] 

  1.               ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{“applicationContext.xml”});
  2. UserService userService = (UserService) context.getBean(“userService”);
  3. userService.addUser();

 

注入内部Bean

 

注入内部Bean其实也是ref的方式基本一样,只是在配置的时候不大相同而已。UserDaoImpl不再需要作为单独的Bean交由Spring管理,而是作为UserServiceImpl的一部分来进行配置。

配置:

[html]

  1.       <!– property是UserServiceImpl中的属性设置,这些属性必须有setter方法。name是属性的名字,与类中的名字相同。Bean是属性对象所属的类的完整类名 –>
  2. lt;bean id=”userService” class=”cn.framelife.spring.service.impl.UserServiceImpl”>
  3. <property name=”userDao”>
  4.     <bean class=”cn.framelife.spring.dao.impl.UserDaoImpl”></bean>
  5. </property>
  6. lt;/bean>

注入基本类型

如:UserService中有一个String类型的字符串username:

[java] 

  1. public class UserServiceImpl implements UserService {
  2.     private UserDao userDao;
  3.     private String username;
  4.     public void setUsername(String username) {
  5.         this.username = username;
  6.     }
  7.     public void setUserDao(UserDao userDao) {
  8.         this.userDao = userDao;
  9.     }
  10.     public void addUser() {
  11.         System.out.println(username);
  12.         userDao.save();
  13.     }
  14. }

配置:

[html]

  1.       <bean id=”userService” class=”cn.framelife.spring.service.impl.UserServiceImpl”>
  2. <property name=”userDao”>
  3.     <bean class=”cn.framelife.spring.dao.impl.UserDaoImpl”></bean>
  4. </property>
  5. <property name=”username” value=”zhangsan”></property>
  6. lt;/bean>

 

注入集合

a、List和Set

类中有一个集合属性及其setter方法。

[java]

  1. private Set<String> usernames;
  2. public void setUsernames(Set<String usernames){
  3.       this.usernames = usernames;
  4. }

 

配置:

[java]

  1.              <property name=”usernames”>
  2.     <list>
  3.         <value>aaa</value>
  4.         <value>bbb</value>
  5.         <value>ccc</value>
  6.     </list>
  7. </property>

或者:

[html]

  1.               <property name=” usernames”>
  2.     <set>
  3.         <value>aaa</value>
  4.         <value>bbb</value>
  5.         <value>ccc</value>
  6.     </set>
  7. </property>

 

b、Map

 

类中的属性:

[java]

  1.       private Map<Integer, String> map;
  2. ublic void setMap(Map<Integer, String> map) {
  3. this.map = map;

 

配置:

[html] 

  1.              <property name=”map”>
  2. <map>
  3.     <entry key=”1″>
  4.         <value>aaa</value>
  5.     </entry>
  6.     <entry key=”2″>
  7.         <value>bbb</value>
  8.     </entry>
  9. </map>
  10. lt;/property>

c、Properties

 

         Properties类型其实可以看成是Map类型的一种。Properties的键和值都只能是字符串。

类中的属性:

[java]

  1.       private Properties mails;
  2. ublic void setMails(Properties mails) {
  3. this.mails = mails;

 

配置:

[html] 

  1.              <property name=”mails”>
  2. <props>
  3.     <prop key=”mailOfZhang”>zhangsan_2013@163.com</prop>
  4.     <prop key=”mailOfLi”>Lixiaolong_abcxx@qq.com</prop>
  5. </props>
  6. lt;/property>

标签