`

Spring2.5学习之二----依赖注入

    博客分类:
  • J2EE
阅读更多
Key points
依赖注入的原理
依赖注入的方式---XML配置
依赖注入的方式---注解的方式
Java包装类的注入
Collection的注入


学习Spring 它的核心就是IOC和AOP。而IOC中实现Bean注入的实现方式之一就是DI(依赖注入)。

一 DI的原理
DI的基本原理:对象之间的依赖关系只会通过三种方式:构造函数参数,工厂方法的参数以及构造函数或工厂方法创建的对象属性设置。因此,容器的工作哦就是在创建Bean时注入所有的依赖关系。相对于由Bean自己控制其实例化,直接在构造器中指定依赖关系或者类似服务定位器(Service Locator)这三种自主控制依赖关系注入的方法,而控制权从根本上发生改变,即控制反转(Inverse of Controll)---IOC.
应用DI规则后,我们不用在关注对象之间的依赖关系,从而达到高层次的松耦合。DI有两种实现方式---Setter/getter方式(传值方式)和构造器方式(引用方式)。
下面就从XML配置和注解角度来介绍这两种方式。
二 DI的方式---XML配置
1. Setter/getter方法
下面是一个Sample:
1) beans.xml:
<bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean>
		   <bean id="personService" class="com.spring.service.impl.PersonServiceBean" 
		   		scope="singleton" >
<property name=”personDao” ref=”personDao”/>
</bean>

2) PersonService.java

public interface PersonService {
			public  void save();
}

3) PersonServiceBean.java

public class PersonServiceBean implements PersonService{
	//all 需要注入的bean都在这里处理
	private PersonDao personDao;
	
public PersonServiceBean(){
		System.out.println("personServiceBean.constructor() is running.");
	}
	
	/**
	 * 使用getter/setter方法注入
	 * @return the personDao
	 */
	public PersonDao getPersonDao() {
		return personDao;
	}

	/**
	 * @param personDao the personDao to set
	 */
	//使用注解注入到setter方法上,等同于注解注入到Field上。
    //@Resource
	public void setPersonDao(PersonDao personDao) {
		this.personDao = personDao;
	}
	public void save(){
		System.out.println("Name:" +name);
		personDao.add();
	}
	@PostConstruct
	public void init(){
		System.out.println("PersonServiceBean.init() is running.");
	}
	
	@PreDestroy
	public void destory(){
		System.out.println("PersonServiceBean.destory() is running.");
	}
}

4) PersonDao.java

public interface PersonDao {
	public void add();
}

5) PersonDaoImpl.java

public class PersonDaoImpl implements PersonDao {
	public void add(){
		System.out.println("PersonDao.add() is running.");
	}
}

6) SpringTest.java(测试类)

public class SpringTest {

	/**
	 * @throws java.lang.Exception
	 */
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}
	@Test public void instanceSpring(){
		AbstractApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
		PersonService personService = (PersonService)context.getBean("personService");
		personService.save();
		
		/**
		 * call destroy()
		 */
		context.close();
}
	
}

Console出现的Log:
personServiceBean.constructor() is running.
PersonServiceBean.init() is running.
Name:null
PersonDao.add() is running.


在这里,是采用一种外部注入的方式,我们还可以采用内部注入的方式来处理:
Beans.xml修改如下:

  
<bean id="personService" class="com.spring.service.impl.PersonServiceBean" 
		   		scope="singleton" >
<property name="personDao">
		   	    	<bean class="com.spring.dao.impl.PersonDaoImpl"/>
		   	    </property>
</bean>


2. 构造器注入
以下是一个Sample:
1) Beans.xml:

<bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean>
		   <bean id="personService" class="com.spring.service.impl.PersonServiceBean" 
		   		scope="singleton" >
<!—使用构造函数注入-->
<constructor-arg index="0" type="com.spring.dao.PersonDao" ref="personDao"/>
<constructor-arg index="1" value="Jamson" />
</bean>


2) PersonService.java:同Setter方法注入
3) PersonServiceBean.java

public class PersonServiceBean implements PersonService{
	//all 需要注入的bean都在这里处理
	//使用注解方式注入,首先按名称查找,然后是按照类型查找
	//@Resource(name="personDao")
//	@Autowired
	private PersonDao personDao;
	
	public String name;
	public PersonServiceBean(){
		System.out.println("personServiceBean.constructor() is running.");
	}
	/**
	 * 使用构造器注入
	 * @param personDao
	 * @param name
	 */
	public PersonServiceBean(PersonDao personDao, String name) {
		this.personDao = personDao;
		this.name = name;
	}

//	/**
//	 * 使用getter/setter方法注入
//	 * @return the personDao
//	 */
//	public PersonDao getPersonDao() {
//		return personDao;
//	}
//
//	/**
//	 * @param personDao the personDao to set
//	 */
//	//使用注解注入到setter方法上,等同于注解注入到Field上。
//    //@Resource
//	public void setPersonDao(PersonDao personDao) {
//		this.personDao = personDao;
//	}
	public void save(){
		System.out.println("Name:" +name);
		personDao.add();
	}
	@PostConstruct
	public void init(){
		System.out.println("PersonServiceBean.init() is running.");
	}
	@PreDestroy
	public void destory(){
		System.out.println("PersonServiceBean.destory() is running.");
	}

//	/**
//	 * @return the name
//	 */
//	public String getName() {
//		return name;
//	}
//
//	/**
//	 * @param name the name to set
//	 */
//	public void setName(String name) {
//		this.name = name;
//	}

}
4) PersonDao.java:同Setter方法注入
5) PersonDaoImpl.java:同Setter方法注入
6) 测试类(SpringTest.java):同上

Console出现的Log:
PersonServiceBean.init() is running.
Name:Jamson
PersonDao.add() is running.

三 DI的方式---注解的配置
自从Jdk5中引入Annotation类后,在EJB和Spring中得到广泛的使用,也越来越被开发者们在平时的应用中使用。主要是用在Field上的注入。在日常的应用开发中,一个项目中有很多的bean,如果使用XML文件配置,就会导致配置文件难以管理。使用注解注入的时候,能够使bean的配置文件内容不至于繁杂。
首先介绍下注解的两种方式:@Resource(javax.annotation.Resource)和@Autowired.
@Resource:首先按照名称去寻找当前的bean,如果找不到的话,那就以类型装配。
@Autowired:首先按照类型去寻找当前的bean, 如果找不到的话,那就以名称装配。
1. Resource
下面介绍一个Sample:
1) Beans.xml:

<bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean>
		   <bean id="personService" class="com.spring.service.impl.PersonServiceBean" 
		   		scope="singleton"  init-method="init" destroy-method="destory"
		   		>

2) PersonService.java:同上。
3) PersonServiceBean.java

public class PersonServiceBean implements PersonService{
	//all 需要注入的bean都在这里处理
	//使用注解方式注入,首先按名称查找,然后是按照类型查找
	@Resource(name="personDao")
private PersonDao personDao;
	
	public String name="Jamson";
	public PersonServiceBean(){
		System.out.println("personServiceBean.constructor() is running.");
	}
	/**
	 * 使用构造器注入
	 * @param personDao
	 * @param name
	 */
	public PersonServiceBean(PersonDao personDao, String name) {
		this.personDao = personDao;
		this.name = name;
	}

//	/**
//	 * 使用getter/setter方法注入
//	 * @return the personDao
//	 */
//	public PersonDao getPersonDao() {
//		return personDao;
//	}

	/**
	 * @param personDao the personDao to set
	 */
	//使用注解注入到setter方法上,等同于注解注入到Field上。
//    @Resource
//	public void setPersonDao(PersonDao personDao) {
//		this.personDao = personDao;
//	}
	public void save(){
		System.out.println("Name:" +name);
		personDao.add();
	}
	@PostConstruct
	public void init(){
		System.out.println("PersonServiceBean.init() is running.");
	}
	
	@PreDestroy
	public void destory(){
		System.out.println("PersonServiceBean.destory() is running.");
	}
}

4) PersonDao.java:同上
5) PersonDaoService.java:同上
6) SpringTest.java:同上
2. Autowired
下面介绍一个Sample:
1) Beans.xml:

<bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean>
		   <bean id="personService" class="com.spring.service.impl.PersonServiceBean" 
		   		scope="singleton"  init-method="init" destroy-method="destory"
		   		>

2) PersonService.java:同上。
3) PersonServiceBean.java

public class PersonServiceBean implements PersonService{
	//all 需要注入的bean都在这里处理
	//使用注解方式注入,首先按名称查找,然后是按照类型查找
	@Autowired
private PersonDao personDao;
	
	public String name="Jamson";
	public PersonServiceBean(){
		System.out.println("personServiceBean.constructor() is running.");
	}
	/**
	 * 使用构造器注入
	 * @param personDao
	 * @param name
	 */
	//public PersonServiceBean(PersonDao personDao, String name) {
		//this.personDao = personDao;
		//this.name = name;
	//}

	/**
	 * 使用getter/setter方法注入
	 * @return the personDao
	 */
	public PersonDao getPersonDao() {
		return personDao;
	}

	/**
	 * @param personDao the personDao to set
	 */
	//使用注解注入到setter方法上,等同于注解注入到Field上。
//    @Resource
	public void setPersonDao(PersonDao personDao) {
		this.personDao = personDao;
	}
	public void save(){
		System.out.println("Name:" +name);
		personDao.add();
	}
	@PostConstruct
	public void init(){
		System.out.println("PersonServiceBean.init() is running.");
	}
	
	@PreDestroy
	public void destory(){
		System.out.println("PersonServiceBean.destory() is running.");
	}

}
4) PersonDao.java:同上
5) PersonDaoService.java:同上
6) SpringTest.java:同上

Noted:所有的注解可以使用在Field上,也可以使用到Setter方法上,最后结果都是一样的。

四 Java基本类型的注入
   Java基本类型的注解可以参考二.2
   在beans.xml中配置如下:
<property name="name" value="Jamson"></property>

五 Collection的注入
   Collection的注入分为以下两步:
1. Beans.xml:
<property name="sets">
		   	    	<set>
		   	    		<value>set_1</value>
		   	    		<value>set_2</value>
		   	    	</set>	
		   	    </property>
		   	    
		   	    <property name="lists">
		   	    	<list>
		   	    		<value>list_1</value>
		   	    		<value>list_2</value>
		   	    	</list>
		   	    </property>
		   	    
		   	    <property name="properties">
		   	    	<props>
		   	    		<prop key="key_1">value_1</prop>
		   	    		<prop key="key_2">value_2</prop>
		   	    	</props>
		   	    </property>
		   	    
		   	    <property name="maps">
		   	    	<map>
		   	    		<entry key="map_1" value="value-1"/>
		   	    		<entry key="map_2" value="value-2"/>
		   	    	</map>
		   	    </property>


2. SpringTest.java:

		System.out.println("============Set is Starting===========");
		for(String value : personService.getSets()){
			System.out.println(value);
		}
		System.out.println("============List is Starting===========");
		for(String value: personService.getLists()){
			System.out.println(value);
		}
		System.out.println("============Properties is Starting===========");
		for(Object key: personService.getProperties().keySet()){
			System.out.println(key +"="+ personService.getProperties().getProperty((String)key));
		}
		System.out.println("============Map is Starting===========");
		for(String key: personService.getMaps().keySet()){
			System.out.println(key +"="+ personService.getMaps().get(key));
		}

0
1
分享到:
评论

相关推荐

    spring-framework-2.5-rc2-with-dependencies\spring-framework-2.5-rc2\spring-framework-2.5-rc2docs

    2.5版本引入了一些重要的增强,如依赖注入(Dependency Injection,DI)的改进,使得组件之间的依赖关系更加明确,降低了代码间的耦合度。DI通过容器管理对象的生命周期,允许开发者在不修改代码的情况下更换或升级...

    spring-framework-2.5-rc2-with-dependencies\spring-framework-2.5-rc2\spring-framework-2.5-rc2源代码

    2.5版本是Spring发展过程中的一个重要阶段,它增强了对依赖注入(Dependency Injection,DI)的支持,这是Spring的核心功能之一。依赖注入允许开发者在运行时通过容器来管理对象及其依赖关系,提高了代码的可测试性...

    spring 2.5依赖包

    综上所述,"spring 2.5依赖包"包含了实现上述功能所需的所有jar文件,如spring-context、spring-beans、spring-aop、spring-web等模块,确保了开发者能够充分利用Spring 2.5提供的特性来构建高效、可维护的企业级...

    Spring2.5-中文参考手册chm

    Spring的核心特性之一是依赖注入(Dependency Injection,简称DI),也被称为控制反转(Inversion of Control,IoC)。DI允许开发者声明他们所需的依赖关系,而无需手动创建对象或管理这些依赖关系。通过配置文件或...

    Spring2.5-中文参考手册chm.zip

    这个"Spring2.5-中文参考手册chm.zip"文件包含了关于Spring 2.5版本的详细中文指南,对于学习和理解Spring框架具有很高的价值。 Spring框架的核心特性包括依赖注入(Dependency Injection,DI)、面向切面编程...

    spring2.5的所有jar包

    1. **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一,允许对象之间的依赖关系在运行时由框架动态管理。通过DI,开发者可以降低代码间的耦合度,提高组件的可测试性和可维护性。 2. **AOP(面向切...

    spring2.5中文文档

    1. **依赖注入(DI)增强**:在Spring 2.5中,依赖注入进一步加强,支持了基于注解的配置。开发者可以使用`@Autowired`、`@Qualifier`和`@Resource`等注解来简化装配过程,无需编写XML配置文件。 2. **注解驱动的开发...

    精通Spring2.5pdf书籍proSpring2.5

    首先,Spring 2.5对依赖注入(Dependency Injection,DI)进行了优化,使得配置更加简洁和灵活。XML配置文件中的注解支持得以增强,开发者可以更方便地使用注解来声明和管理Bean。此外,引入了基于Java配置的功能,...

    Spring2.5-中文参考手册(这是个chm格式的文档)

    1. **依赖注入(Dependency Injection, DI)**:Spring 2.5中的DI是其核心功能之一,允许开发者在运行时将依赖关系注入到对象中,而不是硬编码这些依赖。通过XML配置或注解,可以轻松地管理类之间的依赖关系,提高代码...

    spring2.5-zh-cn讲义.pdf

    Spring2.5版本是其发展的一个重要里程碑,引入了许多改进和新特性,使得开发者能够更加方便地进行依赖注入、事务管理、AOP(面向切面编程)等关键功能的实现。 在Spring框架中,依赖注入(Dependency Injection,...

    Spring2.5 源代码

    Spring的核心特性之一就是依赖注入,它允许对象之间的依赖关系在运行时由容器管理,而不是硬编码在类内部。在Spring 2.5中,DI的实现更加完善,支持了注解驱动的依赖注入,使得代码更简洁、更易于测试。 2. **注解...

    spring2.5参考手册(spring-reference.pdf)

    根据提供的信息来看,这份文档是关于Spring 2.5版本的...综上所述,Spring 2.5参考手册涵盖了Spring框架的核心特性和新功能,并提供了详细的配置指南和最佳实践建议,是Java开发者学习和使用Spring框架的重要参考资料。

    spring2.5需要的jar

    在压缩包"spring2.5需要的jar"中,可能包含了一系列Spring框架的核心库,如spring-core、spring-context、spring-aop、spring-beans、spring-expression等。这些jar文件是构建基于Spring 2.5的应用所必需的,它们...

    spring 2.5中文帮助文档

    通过阅读《Spring2.5-中文参考手册.chm》这份文档,开发者可以深入了解Spring 2.5的各种特性和用法,解决实际开发中遇到的问题,提升开发效率。文档不仅包含详细的API参考,还包含丰富的示例和最佳实践指导,是学习...

    Spring2.5-Reference_zh_CN.txt

    依赖注入(Inversion of Control, IoC)是Spring框架的核心特性之一,它通过将对象间的依赖关系交由外部容器管理来实现松耦合。在Spring2.5中,IoC容器支持通过XML配置文件或注解的方式定义和管理Bean之间的依赖关系...

    spring 2.5 api chm(英文正宗不骗人,喜欢就下)

    1. **依赖注入增强**:Spring 2.5对依赖注入进行了优化,支持了基于注解的配置,使得开发者可以更方便地在类的字段或方法上使用`@Autowired`、`@Qualifier`等注解来声明依赖,减少了XML配置的复杂性。 2. **JSR-303...

    spring2.5学习笔记

    - **通用的类型安全的依赖注入**:通过使用泛型,Spring 2.5能够提供更安全的依赖注入,减少类型转换错误。 总的来说,Spring 2.5的学习涵盖了Bean的声明、属性注入、类型转换和后处理器的使用等关键概念。理解...

    struts2.1+spring2.5+hibernate3.3整合之第一步(spring2.5+hibernate3.3)

    这样,业务逻辑、控制逻辑和持久化操作就通过Spring的依赖注入相互关联。 6. 测试:编写测试用例,验证整合后的系统是否能正常运行,包括Action的跳转、数据的存取等。 这个过程中可能会遇到的挑战包括:配置文件...

Global site tag (gtag.js) - Google Analytics