`

Spring基础入门二:基于XML及注解配置完成Spring对Bean的注入

阅读更多

第一种方法:手动装配完成依赖注入

基于XML配置的:

1。通过set方法注入

	<!-- 手动装配 通过setter方式注入 -->
	<!-- Spring的DI注入方式 -->
	<bean id="studao" class="di.dao.imple.StudentDaoImple"></bean>
	
	<bean id="stuService"
		class="di.service.imple.StudentServiceImple">
		<property name="stuDao" ref="studao"></property>
	</bean>
 
public class StudentServiceImple implements StudentService {
	private StudentDao stuDao;

	public void save() {
		stuDao.add();
	}

	public void setStuDao(StudentDao stuDao) {
		this.stuDao = stuDao;
	}
}

 2。通过构造方法注入

<!-- 手动装配 通过构造器方式注入  -->
	<bean id="stuService3"
		class="di.service.imple.StudentServiceImple2">
		<constructor-arg>
			<bean class="di.dao.imple.StudentDaoImple"></bean>
		</constructor-arg>
	</bean>

	<bean id="stuService4"
		class="di.service.imple.StudentServiceImple2">
		<constructor-arg>
			<bean class="di.dao.imple.StudentDaoImple"></bean>
		</constructor-arg>
		<constructor-arg>
			<bean class="java.lang.String"></bean>
		</constructor-arg>
		<!--  
		<constructor-arg index="0" type="di.dao.StudentDao" ref="studao" />
		<constructor-arg index="1" type="java.lang.String" value="xiaobo" />
		-->
	</bean>
 
public class StudentServiceImple2 implements StudentService {

	private StudentDao stuDao;

	private String stuName;

	public StudentServiceImple2(StudentDao stuDao) {
		this.stuDao = stuDao;
	}
	
	public StudentServiceImple2(StudentDao stuDao,String stuName) {
		this.stuDao = stuDao;
		this.stuName = stuName;
	}

	public void save() {
		System.out.println("=====通过构造器注入进来的属性====");
		System.out.println(stuDao);
		System.out.println(stuName);
		stuDao.add();
	}
}

 3。通过内部Bean完成注入及其它集合类型的属性注入

<!-- Spring的DI内部Bean注入方式 -->
	<bean id="stuService2"
		class="di.service.imple.StudentServiceImple">
		<property name="stuDao">
			<bean class="di.dao.imple.StudentDaoImple"></bean>
		</property>
		<!-- 普通属性的注入 -->
		<property name="stuName" value="http://zmx.iteye.com"></property>
		<property name="stuAge" value="23"></property>
		<!-- 集合类型的注入 -->
		<property name="sets">
			<set>
				<value>abc</value>
				<value>mengya</value>
				<ref bean="studao"></ref>
			</set>
		</property>
		<property name="lists">
			<list>
				<value>list1</value>
				<ref bean="studao"></ref>
			</list>
		</property>
		<property name="properties">
			<props>
				<prop key="key1">value1</prop>
				<prop key="key2">value2</prop>
				<prop key="key3">value3</prop>
			</props>
		</property>
		<property name="maps">
			<map>
				<entry key="mapkey1" value="mapValue1"></entry>
				<entry>
					<key>
						<value>mapkey2</value>
					</key>
					<ref bean="studao"></ref>
				</entry>
			</map>
		</property>
	</bean>
 
/**
 * 手动装配 通过set方法注入
 * 
 * @author 张明学
 */
public class StudentServiceImple implements StudentService {
	private StudentDao stuDao;
	private String stuName;
	private Integer stuAge;
	private Set<Object> sets;
	private List<Object> lists;
	private Properties properties;
	private Map<String, Object> maps;
	public void save() {
		stuDao.add();
		System.out.println("------普通属性注入-----");
		System.out.println(stuName);
		System.out.println(stuAge);
		System.out.println("------set集合注入-----");
		for (Object str : sets) {
			System.out.println(str);
		}
		System.out.println("------list集合注入-----");
		for (Object str : lists) {
			System.out.println(str);
		}
		System.out.println("------properties合注入-----");
		Set<Entry<Object, Object>> entrys = properties.entrySet();
		for (Map.Entry<Object, Object> entry : entrys) {
			System.out.println(entry.getKey() + " = " + entry.getValue());
		}
		System.out.println("------map合注入-----");
		for (Map.Entry<String, Object> entry : maps.entrySet()) {
			System.out.println(entry.getKey() + " = " + entry.getValue());
		}
	}
	public void setStuAge(Integer stuAge) {
		this.stuAge = stuAge;
	}
	public void setStuName(String stuName) {
		this.stuName = stuName;
	}
	public void setStuDao(StudentDao stuDao) {
		this.stuDao = stuDao;
	}
	public void setSets(Set sets) {
		this.sets = sets;
	}
	public void setLists(List<Object> lists) {
		this.lists = lists;
	}
	public void setProperties(Properties properties) {
		this.properties = properties;
	}
	public void setMaps(Map<String, Object> maps) {
		this.maps = maps;
	}
}

 基于注解配置的:@Autowired与@Resource的用法

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    <!-- 手动装配 通过注解的方式注入
    	 添加common-annotations.jar,配置下面内容即打开Spring对注解的解析器的功能
     -->
	<context:annotation-config/>
	
	<bean id="myStuDao" class="di.dao.imple.StudentDaoImple"></bean>
	<bean id="stuService" class="di.service.imple.StudentServiceImple3"></bean>
</beans>
 
/**
 * 手动装配 通过注解的方式注入对象
 * 
 * @author 张明学
 */
/**
 * 方式:@Autowired 
 * 		表示:可以用在字段或set方法上面,按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,
 * 			 可以设置它required属性为false。如果我们使用按名称装配,可以结合@Qualifier注解一起使用
 * 			 如:@Autowired(required=false)
 *			    @Qualifier("stuDao")
 *	            private StudentDao stuDao;
 *	                       
 * 		@Resource  
 * 		表示:可以用在字段或set方法上面,按名称装配依赖对象,名称可以通过@Resource的name属性指定,如果没有
 * 			 指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性
 * 			 的set方法上,即默认取属性名作为bean名称寻找依赖对象。
 * 			 如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时,@Resource注解会回退到按类型装配。
 *			 但一旦指定了name属性。就只能按名称装配了。
 */
public class StudentServiceImple3 implements StudentService {
	
	@Resource(name="myStuDao")
	private StudentDao stuDao;
	
	public void save() {
		stuDao.add();
	}
}

 测试:

public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans3.xml");
		StudentService stuService = null;
		stuService = (StudentService) ctx.getBean("stuService");
		stuService.save();
	}

 第二种方法:自动装配完成依赖注入

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	<!--依赖注入:自动装配方式-->
	<!-- 
		autowire:byName表示:按名称装配,可以根据属性名称,在容器中寻找跟属性名相同的bean,
		如果没有找到,即属性值为null。
		byType表示:按类型装配,可以根据属性的类型,在容器中寻找跟该类型匹配的bean,
		如果发现多个,那么将会抛出异常。如果没有找到,即属性值为null。
		constructor表示:与byType的方式类似,不同之处在于它应用于构造器参数。如果
		在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
		autodetect表示:通过bean类的自省机制(introspection)来决定是使用constructor
		还是byType方式进行自动分配。
	-->
	<bean id="stuDao"
		class="di.autowire.dao.imple.StudentDaoImple">
	</bean>
	<bean id="stuService1"
		class="di.autowire.service.imple.StudentServiceImple"
		autowire="byName">
	</bean>
	<bean id="stuService2"
		class="di.autowire.service.imple.StudentServiceImple"
		autowire="byType">
	</bean>
	<bean id="stuService3"
		class="di.autowire.service.imple.StudentServiceImple"
		autowire="constructor">
	</bean>
</beans>

 javaBean代码如下:

package di.autowire.dao;

public interface StudentDao {
	public abstract void add();
}
 
package di.autowire.dao.imple;

import di.dao.StudentDao;

public class StudentDaoImple implements StudentDao {
	public void add() {
		System.out.println("自动按配StudentdaoImple的add方法");
	}
}
 
package di.autowire.service;

public interface StudentService {
	public abstract void save();
}
 
/**
 * 使用Spring自动装配
 * 
 * @author 张明学
 */
public class StudentServiceImple implements StudentService {

	private StudentDao stuDao;

	// 通过byName或byType都要提供set方法注入
	public void setStuDao(StudentDao stuDao) {
		this.stuDao = stuDao;
	}
	public void save() {
		stuDao.add();
	}
	public StudentServiceImple() {

	}
	// 通过构造器进行依赖注入
	public StudentServiceImple(StudentDao stuDao) {
		this.stuDao = stuDao;
	}
}

 测试:

/**
 * 依赖注入:自动装配
 * 
 * @author 张明学
 */
public class AutowireDITest {
	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans4.xml");
		StudentService stuService = null;
		// stuService = (StudentService) ctx.getBean("stuService1");
		// stuService = (StudentService) ctx.getBean("stuService2");
		stuService = (StudentService) ctx.getBean("stuService3");
		stuService.save();
	}
}
 
0
1
分享到:
评论
2 楼 NewAE 2013-11-27  
若早遇到这文章,弯路就不用走多了.
1 楼 qianqingfu 2010-06-04  
基础,但是强大。谢谢!

相关推荐

    spring bean XML配置入门

    一旦XML配置加载到Spring容器中,容器将根据配置创建Bean实例,并按照定义进行初始化、依赖注入,最后完成Bean的生命周期管理。 10. **实践操作**: 在实际开发中,我们可以使用Eclipse的Spring插件来简化Bean...

    Spring框架xml注解配置方式实例

    7. **XML配置中的bean定义**:尽管大部分配置可以通过注解完成,但在某些情况下,我们仍需在XML文件中声明bean,例如,当需要自定义初始化方法、配置特定的bean属性,或者处理非Java组件(如数据库连接池)时。...

    Spring与IoC系列四:基于注解的依赖注入.rar

    为了启用注解配置,我们需要在Spring配置中引入`@Configuration`和`@EnableAutoConfiguration`两个注解。`@Configuration`表示当前类是一个配置类,而`@EnableAutoConfiguration`则会启动Spring Boot的自动配置功能...

    Spring与IoC系列三:基于XML的依赖注入测试程序di.rar

    在这个基于XML的依赖注入测试程序中,我们将会看到如何通过Spring的配置文件定义bean及其依赖。"03-di"可能是表示第三部分的教程或者测试用例,通常在这种结构下,我们会有多个文件分别对应不同的概念或功能。 在...

    Spring定义bean的三种方式和自动注入

    在Spring框架中,管理Bean的方式主要有三种:XML配置、注解配置和Java配置。下面将详细介绍这三种方式以及Spring的自动注入机制。 1. **基于XML的Bean定义**: 在XML配置中,我们通常在`applicationContext.xml`...

    day38 17-Spring的Bean的属性注入:注解方式

    总结,Spring的注解方式为Bean的属性注入提供了简洁、灵活的方式,大大减少了XML配置的工作量。通过深入理解这些注解以及其背后的工作原理,我们可以更好地利用Spring框架进行开发。同时,结合源码阅读和相关工具的...

    spring3零配置注解实现Bean定义

    在标签《spring3》的指引下,需要关注的范围被限定在Spring 3版本相关的特性上,特别是在该版本中新增或强化的注解配置特性。 根据提供的部分内容,可以详细解读的知识点包括: 1. Spring 3之前版本中Bean定义通常...

    spring配置文件----注解配置

    注解配置是Spring框架的一种简化配置手段,它允许开发者通过在类或方法上添加特定的注解,替代传统的XML配置文件,使得代码更加简洁且易于维护。 首先,我们需要理解Spring配置文件的作用。在早期的Spring版本中,...

    Spring 基础和入门:Struts2+Spring整合

    **Spring基础和入门** Spring框架是Java开发中的一个核心组件,尤其在企业级应用中广泛使用。它提供了一个全面的编程和配置模型,用于简化Java应用程序的开发,特别是Web应用程序。Spring的核心特性包括依赖注入...

    spring依赖注入bean

    综上所述,Spring 的依赖注入和 Bean 管理不仅限于 Web 应用,也可以方便地应用于 Java Application 中,通过 XML 或注解配置来实现组件间的解耦,提高代码质量。这个示例项目 `test` 可能包含了实现上述功能的代码...

    Spring全注解project示例 (无web.xml配置)

    2. **全注解配置**:在Spring框架中,可以使用注解替代XML配置来声明bean及其依赖。常见的注解包括`@Component`(定义组件),`@Service`(业务层服务),`@Repository`(数据访问层),`@Controller`(控制器层),...

    Spring注解注入属性

    然而,随着Java注解的普及,Spring也引入了基于注解的依赖注入机制,简化了开发过程中的配置工作,提高了代码的可读性和可维护性。例如,在上述案例中,原本通过XML配置文件定义的`UserManagerImpl`和`UserDaoImpl`...

    spring配置文件:整理总结Spring中XML配

    - 为了避免重复定义相同的bean配置,Spring支持一种类似于继承的机制,即通过定义一个抽象bean来作为其他bean的基础模板。例如,创建一个抽象bean `AbstractService`,并在其他具体服务中引用它: ```xml &lt;bean ...

    spring famework 基于注解配置示例

    本示例将详细介绍如何使用注解配置实现Spring框架的注入。 首先,我们需要了解几个关键的注解: 1. `@Component`:这是Spring中的基础组件注解,可以标记一个类为Spring管理的bean。例如,我们可以定义一个简单的...

    (转)Spring 3.0 注解注入详解

    除了这些核心注解,Spring还提供了`@Resource`注解,它基于Java标准JSR-250,主要用于注入JSR-250管理的bean。`@Resource`默认按名称注入,而`@Autowired`默认按类型注入。 理解了这些注解后,我们来看看如何在实际...

    spring2.5.6注解以及xml简单ioc入门示例

    这个入门示例项目旨在帮助初学者了解和掌握Spring 2.5.6版本中的注解使用和基于XML的IoC配置。 首先,让我们来探讨一下Spring的IoC概念。IoC是一种设计模式,它将对象的创建和管理权交给了容器,而不是由对象自身...

    在非spring注解类中使用spring容器中的bean_普通类中使用yml配置文件中的配置信息

    然而,在某些情况下,我们可能需要在非Spring注解的类中访问Spring容器中的Bean,或者在这些类中使用YAML配置文件中的配置信息。本篇将详细介绍如何在这样的场景下实现这一目标。 首先,让我们来理解如何在非Spring...

    spring,springmvc,mybatis基于xml文件整合(2)

    在本教程中,我们将深入探讨如何在Java Web开发中整合Spring、Spring MVC和MyBatis框架,特别是关注基于XML配置的Mapper接口方式。这三种技术的集成为开发高效、可维护的Web应用提供了强大支持。 首先,Spring是...

    跟我学Spring3(12.3)零配置之注解实现Bean定

    本教程聚焦于Spring3中的注解配置,帮助开发者更高效、简洁地实现Bean的声明和管理。通过学习这一章节,你将深入理解如何利用注解的力量,使得Spring应用程序的构建更加灵活和直观。 首先,我们来了解什么是Bean。...

    Spring 注解 入门

    总结来说,Spring的注解使得bean的创建和依赖注入更加简洁和直观,减少了XML配置,提升了开发效率。`@Autowired`和`@Qualifier`是其中的关键注解,它们帮助我们在多bean环境中实现精确的依赖注入。结合其他组件注解...

Global site tag (gtag.js) - Google Analytics