`
x125521853
  • 浏览: 72714 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

第四章 构造器注入,自动装配,集合注入

阅读更多

一:控制反转(IOC):就是实例化对象的控制权发生了转变,以前是我们自己new,现在交给spring这个工厂去实例化,如果我现在要用对象,就直接向spring这个工厂索取就可以了。

     两种方式:set方式和构造器方式。

 

二:构造器方式注入

     构造器参数类型的匹配

     要求构造参数非常明确,即参数列表不会有同类型的参数。

     以水果service层为例:

     service层需要持有Dao层对象,才能调用Dao层方法。   

   //Dao层接口: 

package com.spring.chapter4.dao;

public interface FruitDao {
	public void create();
}

   //Dao层实现类:  

package com.spring.chapter4.dao.impl;

import com.spring.chapter4.dao.FruitDao;

public class FruitDaoImpl implements FruitDao {
	public void create() {
		System.out.println("Dao层方法create被调用");
	}
}

   //服务层接口:  

package com.spring.chapter4.service;

public interface FruitService {
	public void create();
}

   //服务层实现类:  

package com.spring.chapter4.service.impl;

import com.spring.chapter4.dao.FruitDao;
import com.spring.chapter4.service.FruitService;

public class FruitServiceImpl implements FruitService {
	private FruitDao fruitDao;

	public FruitServiceImpl(FruitDao fruitDao) {
		super();
		this.fruitDao = fruitDao;
	}

	public void create() {
		fruitDao.create();
	}
}

    这里和我们前面set注入的不同,提供的时我们熟悉的构造方法。

  //配置文件(chapter4.xml) 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
	<bean id="fruitDao" class="com.spring.chapter4.dao.impl.FruitDaoImpl"/>
	<bean id="fruitService" class="com.spring.chapter4.service.impl.FruitServiceImpl">
		<constructor-arg type="com.spring.chapter4.dao.FruitDao" ref="fruitDao"/>		
	</bean>
</beans>

   //测试类  

package com.spring.chapter4.service.impl;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.chapter4.service.FruitService;

public class Test {
	public static void main(String[] args) {
		ApplicationContext act = new ClassPathXmlApplicationContext(
				"chapter4.xml");
		FruitService fruitService = (FruitService) act.getBean("fruitService");
		fruitService.create();
	}
}

  

三:构造参数索引:

     可以解决参数同类型问题,并且配置时不用去维护参数顺序的问题,如果使用构造器注入(推荐使用这种方式),或者将前两者结合起来一起使用。

   例如:给服务层添加两个属性      

package com.spring.chapter4.service.impl;

import com.spring.chapter4.dao.FruitDao;
import com.spring.chapter4.service.FruitService;

public class FruitServiceImpl implements FruitService {
	private FruitDao fruitDao;
	private String name;
	private String address;

	public FruitServiceImpl(FruitDao fruitDao) {
		super();
		this.fruitDao = fruitDao;
	}

	public FruitServiceImpl(FruitDao fruitDao, String name, String address) {
		super();
		this.fruitDao = fruitDao;
		this.name = name;
		this.address = address;
	}

	public void create() {
		fruitDao.create();
	}

	public FruitDao getFruitDao() {
		return fruitDao;
	}

	public void setFruitDao(FruitDao fruitDao) {
		this.fruitDao = fruitDao;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}
}

  //配置文件(chapter4.xml) 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
	<bean id="fruitDao" class="com.spring.chapter4.dao.impl.FruitDaoImpl"/>
	<bean id="fruitService" class="com.spring.chapter4.service.impl.FruitServiceImpl">	
		<constructor-arg index="0" ref="fruitDao" />		
		<constructor-arg index="1" value="桔子" />
		<constructor-arg index="2" value="中国" />		
	</bean>
</beans>

   //测试类:  

package com.spring.chapter4.service.impl;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.chapter4.service.FruitService;

public class Test {
	public static void main(String[] args) {
		ApplicationContext act = new ClassPathXmlApplicationContext("chapter4.xml");
		FruitService fruitService = (FruitService) act.getBean("fruitService");
		fruitService.create();
		System.out.println(((FruitServiceImpl)fruitService).getName());
		System.out.println(((FruitServiceImpl)fruitService).getAddress());
	}
}

 

四:集合注入

     Set集合、list集合、properties集合、map集合   

package com.spring.chapter4.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class CollectionService {
	private Set<String> sets = new HashSet<String>();
	private List<String> lists = new ArrayList<String>();
	private Properties properties = new Properties();
	private Map<String,String> maps = new HashMap<String, String>();
	
	public Set<String> getSets() {
		return sets;
	}
	public void setSets(Set<String> sets) {
		this.sets = sets;
	}
	public List<String> getLists() {
		return lists;
	}
	public void setLists(List<String> lists) {
		this.lists = lists;
	}
	public Properties getProperties() {
		return properties;
	}
	public void setProperties(Properties properties) {
		this.properties = properties;
	}
	public Map<String, String> getMaps() {
		return maps;
	}
	public void setMaps(Map<String, String> maps) {
		this.maps = maps;
	}	
}

  //配置文件(collection.xml)  

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
	<bean id="collectionService" class="com.spring.chapter4.service.impl.CollectionService">
		<property name="sets">
			<set>
				<value>set1</value>
				<value>set2</value>
				<value>set3</value>
			</set>
		</property>
		<property name="lists">
			<list>
				<value>list1</value>
				<value>list2</value>
				<value>list3</value>
			</list>
		</property>
		<property name="properties">
			<props>
				<prop key="key1">properties1</prop>
				<prop key="key2">properties2</prop>
				<prop key="key3">properties3</prop>
			</props>
		</property>
		<property name="maps">
			<map>
				<entry key="key1" value="maps1"/>
				<entry key="key2" value="maps2"/>
				<entry key="key3" value="maps3"/>
			</map>
		</property>
	</bean>
</beans>

   //测试类:  

package com.spring.chapter4.service.impl;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDemo {
	public static void main(String[] args) {
		ApplicationContext act = new ClassPathXmlApplicationContext("collection.xml");
		CollectionService collectionService = (CollectionService) act.getBean("collectionService");
		Set<String> set = collectionService.getSets();
		for(String s:set){
			System.out.println(s);
		}
		
		List<String> lists = collectionService.getLists();
		for (String s : lists) {
			System.out.println(s);
		}
		
		Properties properties = collectionService.getProperties();
		for (Object key : properties.keySet()) {
			System.out.println(key + ":" + properties.getProperty((String) key));
		}
		
		Map<String, String> mpas = collectionService.getMaps();
		for(String key : mpas.keySet()){
			System.out.println(key + ":" + mpas.get((String) key));
		}
	}
}

 

五:自动装配

   (1). byName   

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
	<bean id="fruitDao" class="dao.impl.FruitDaoImpl" />
	<bean id="fruitService" class="service.impl.FruitServiceImpl"
		autowire="byName" />
</beans>

     需要注意的地方: <bean id="fruitDao" class="dao.impl.FruitDaoImpl" />
id="fruitDao"一定要和服务层的属性名称对应,即FruitDaoImpl类里面一定要有一个名称为fruitDao的属性.

   (2). byType   

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
	<bean id="fruitDao" class="dao.impl.FruitDaoImpl" />
	<bean id="fruitService" class="service.impl.FruitServiceImpl"
		autowire="byType" />
</beans>

      需要保证FruitServiceImpl类中有一个属性类型是FruitDao类型即可.

      尽量不要用自动装配的特性,因为会产生二异性,特别是按类型装配

 

分享到:
评论

相关推荐

    spring-developing-java-applications-enterprise

    - **依赖注入(DI)**:是Spring实现控制反转的主要手段,主要分为两种方式——构造器注入和setter注入。 - **构造器注入**:通过构造函数来注入依赖,这种方式更符合面向对象的设计原则。 - **setter注入**:通过...

    Spring in Action(第2版)中文版

    第4章通知bean 4.1aop简介 4.1.1定义aop术语 4.1.2spring对aop的支持 4.2创建典型的spring切面 4.2.1创建通知 4.2.2定义切点和通知者 4.2.3使用proxyfactorybean 4.3自动代理 4.3.1为spring切面创建自动...

    spring框架案例学习文档笔记.docx

    setter注入通过set方法来注入依赖,而构造器注入则在创建对象时就注入依赖。此外,我们还需要了解bean的id和name属性,它们用于唯一标识bean。简单属性注入允许我们为bean的属性赋值,而bean的作用范围(scope)定义...

    spring.net中文手册在线版

    第四章 对象、对象工厂和应用程序上下文 4.1.简介 4.2.IObjectFactory,IApplicationContext和IObjectDefinition接口介绍 4.2.1.The IObjectFactory和IApplicationContext 4.2.2.对象定义 4.2.3.对象的创建 ...

    Spring in Action(第二版 中文高清版).part2

    第4章 通知Bean 4.1 AOP简介 4.1.1 定义AOP术语 4.1.2 Spring对AOP的支持 4.2 创建典型的Spring切面 4.2.1 创建通知 4.2.2 定义切点和通知者 4.2.3 使用ProxyFactoryBean 4.3 自动代理 4.3.1 为Spring切...

    Spring in Action(第二版 中文高清版).part1

    第4章 通知Bean 4.1 AOP简介 4.1.1 定义AOP术语 4.1.2 Spring对AOP的支持 4.2 创建典型的Spring切面 4.2.1 创建通知 4.2.2 定义切点和通知者 4.2.3 使用ProxyFactoryBean 4.3 自动代理 4.3.1 为Spring切...

    JAVA Spring入门核心,权威的教育培训机构绝密资源第一部

    - **构造器注入**: 通过构造器参数传递依赖关系。 - **Setter方法注入**: 通过setter方法设置依赖关系。 - **字段注入**: 直接在类的字段上使用@Autowired注解进行注入。 **3. 集合的注入** - **概念**: 当一个类...

    SPRING面试宝典

    Bean自动装配是指Spring容器根据特定规则自动将Bean实例注入到依赖它们的其他Bean中的过程。这种方式可以简化配置。 **3.13 解释不同的自动装配模式** Spring框架支持以下几种自动装配模式: - **no**:默认模式...

    spring的详细介绍

    - 构造器注入:通过配置`&lt;constructor-arg/&gt;`元素来注入。 - 接口注入:Spring当前版本不支持此方式。 6. 注入的数据类型包括: - JavaBean类型:通过`&lt;ref/&gt;`元素注入。 - 基本数据类型、包装类型和字符串:...

    spring框架案例学习文档笔记.doc

    3. **注入类型**:包括setter注入和构造器注入,前者通过set方法设置依赖,后者在对象实例化时传入依赖。 4. **id、name**:在XML配置中,id是Bean的唯一标识,name则可以有多个,用于引用和查找Bean。 5. **简单...

    spring笔记

    * 构造器注入 * 属性注入 p 名称空间的支持 * 引入 p 名称空间 * 使用 p 名称空间注入属性 SpEL:Spring Expression Language * 统一使用 value 注入属性 注入数组或集合 * 注入数组或集合 团队开发(多个 ...

    java框架-Spring2复习题.pdf

    7. **设值注入(Setter Injection)**:设值注入的优点在于对于习惯传统JavaBean开发的程序员来说更直观,当依赖关系复杂时,构造注入的构造函数可能过于庞大,设值注入更简洁,且某些第三方库可能需要默认构造函数,...

    Spring的经典面试题

    - **构造器注入**:在构造函数中通过参数来设置依赖,有利于依赖关系的不可变性和对象的稳定性。 - **Setter方法注入**:通过setter方法来设置依赖,适用于可选依赖或在运行时可能变化的依赖。 ### Spring事件处理 ...

    spring famework xml配置使用示例

    Spring支持多种方式注入Bean的依赖,如构造器注入、设值注入等。设值注入通过`&lt;property&gt;`标签实现,如下所示: ```xml ``` `name`属性对应Java类中的属性名,`value`属性提供该属性的值。 3. **工厂方法...

    Spring 学习资料

    4. 构造器注入与setter注入的对比和选择。 5. 自动装配:@Autowired注解的使用及基于类型的自动装配。 6. Bean工厂与ApplicationContext的区别:理解这两种不同类型的IoC容器。 其次,AOP部分的Spring3PPT(AOP部分)...

    跟我学spring3(1-7)1

    3. **3.3 更多DI的知识**:涵盖了更多关于DI的高级话题,如构造器注入、属性注入、集合注入等,并解释了它们的适用场景。 4. **3.4 Bean的作用域**:阐述了Spring中Bean的不同作用域(如Singleton、Prototype、...

Global site tag (gtag.js) - Google Analytics