第二章 IoC Setter注入

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

 


ref的方式


 

a、使用2.2的例子中的UserDaoUserDaoImpl

 

[java]  view plain copy print ?
 
  1. public interface UserDao {  
  2.     public void save();  
  3. }  

[java]  view plain copy print ?
 
  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、将UserDaoImplUserServiceImpl交由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>


 


注入集合


aListSet

类中有一个集合属性及其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>


 


 

bMap

 

类中的属性:

        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>



 

cProperties

 

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

类中的属性:

        private Properties mails;

	

	public void setMails(Properties mails) {

		this.mails = mails;

	}

 

配置:

<property name="mails">

			<props>

				<prop key="mailOfZhang">[email protected]</prop>

				<prop key="mailOfLi">[email protected]</prop>

			</props>

		</property>



你可能感兴趣的:(setter)