`

Spring学习之一----创建Bean的三种方法

    博客分类:
  • J2EE
阅读更多
关键字
BeanFactory
ApplicationContext
创建Bean的三种方法
Bean的作用域
Bean的生命周期
Bean的XML元数据配置
自动扫描管理Bean

对于Spring框架开发而言,BeanFactory和ApplicationContext无疑是最基础的两个类。那么这篇文章就介绍下。
一 BeanFactory
   接口BeanFactory(org.springframework.beans.BeanFactory),其职责是:处理Bean的初始化,定位,配置应用程序中的对象以及建立这些对象的依赖。Bean对象的依赖是通过元数据来描述。通过BeanFactoryAware类实现。比较常用的子接口为XMLBeanFactory。
对于单个文件的读取方法有如下两种:
1)
Resource resource = new FileSystemResource(“beans.xml”);
BeanFactory factory = new XmlBeanFactory(resource);

2)
ClassPathResource resource = new ClassPathResource(“beans.xml”);
BeanFactory factory = new XmlBeanFactory(resource);

当需要从多个文件中加载一个BeanFactory实例时候,可以像如下使用:
ApplicationContext ctx= new ClassPathXmlApplicationContext(new String[]{“beans.xml”,”application.xml”});
BeanFactory  factory =ctx;

而Bean Factory通过Bean definition reader从多个文件中读取Bean定义,这样的话,我们可以这么处理,即组成基于XML配置元数据可以做如下配置:
<beans>
<import resource="services.xml"/>
    <import resource="resources/messageSource.xml"/>
    <import resource="/resources/themeSource.xml"/>
    
<bean id="bean1" class="..."/>
    <bean id="bean2" class="..."/>
</beans>
要求在完成bean定义之前导入所有的XML文件。
在BeanFactory中,与之关联最重要的类是:BeanWrapper。
Object object = Class.forName(“com.spring.service.impl.PersonServiceBean”).newInstance();
BeanWrapper  beanWrapper = new BeanWrapperImpl(object);
beanWrapper.setPropertyValue(“name”, “Jamson”);
通过BeanWrapper,我们可以无需在编码时就指定JavaBean的实现类和属性值,通过在配置文件加以设定,就可以在运行期动态创建对象并设定其属性(依赖关系).

二 ApplicationContext
   接口ApplicationContext来自于org.springframework.context.ApplicationContext,继承BeanFactory,除了支持BeanFactory的功能外,还能支持企业应用的其它功能,如:事务管理,国际化支持,以及AOP集成等等。通过类ApplicationContextAware类实现。比较常用的子接口为:AbstactApplicationContext。
例如:
ApplicationContext ctx = new ClassPathXmlApplicationContext(“application.xml”);
对于多个XML配置文件来读取一个ApplicationContext实例时,可以这样使用:
1) ApplicationContext ctx= new ClassPathXmlApplicationContext(new String[]{“beans.xml”,”application.xml”});
2) ApplicationContext context = new FileSystemXmlApplicationContext("c:/foo.xml");---不推荐使用
3) XmlApplicationContext:用来读取包含一个WebAppliction中的XML文件。

ApplictionContext的关闭,通过调用AbstractApplicationContext.close()来执行。而BeanFactory的关闭,可以通过destroy-method=”method”来实现。
三 创建bean的三种方法
1. 类构造器
如:<bean id=”personService” class=”com.spring.service.impl.PersonServiceBean”/>
下面给出一个Sample:
1) beans.xml配置
<bean id=”personService” class=”com.spring.service.impl.PersonServiceBean”/>

2) PersonService.java/PersonServiceBean.java
PersonService.java:
public interface PersonService {

	public  void save();
}
PersonServiceBean.java:
public class PersonServiceBean implements PersonService{
public void save(){
		System.out.println("Save Method is running.");
}
}

3) 测试类:SpringTest.java

public class SpringTest {

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

Console执行:
 
Save method is running.

当然,在这个方法被调用之前,构造函数和init()方法都已经被调用。
2. 静态工厂(Static  Factory)
如: <bean id=”personService” class=”com.spring.service.impl.PersonServiceBeanFactory” factory-method=”createPersonServiceBean”/>
1) beans.xml:
<bean id=”personService” class=”com.spring.service.impl.PersonServiceBeanFactory” factory-method=”createPersonServiceBean”/>

2) PersonService.java和PersonServiceBean.java同上
3) PersonServiceBeanFactory.java
public class PersonServiceBeanFactory {
	public static PersonServiceBean createPersonServiceBean(){
		return new PersonServiceBean();
	}

}

4) SpringTest.java:同上
3. 实例工厂
如: <bean id=”personService” class=”com.spring.service.impl.PersonServiceBeanFactory” factory-bean=”PersonServiceBeanFacotory”  factory-method=”createPersonServiceBean”/>
1) beans.xml:
  
<bean id=”personService” class=”com.spring.service.impl.PersonServiceBeanFactory” factory-bean=”PersonServiceBeanFacotory”  factory-method=”createPersonServiceBean”/>

2)  PersonService.java和PersonServiceBean.java同上
3)  PersonServiceBeanFactory.java
public class PersonServiceBeanFactory {
			public PersonServiceBean createPersonServiceBean2(){
				return new PersonServiceBean();
}
}

4) SpringTest.java:同上
四 Bean的作用域
Bean的作用域在Spring中主要用到两个:Singleton(默认)和Prototype。
1. Singleton:
对于每个Spring Ioc容器而言,每个bean定义只有一个对象实例,这同Java对象中的Singleton不一样。在Spring中,singleton是基于Spring Ioc容器这个Level,而java中是针对与JVM这个Level。默认情况下,系统会在容器启动的时候加载,即在容器加载完成后去调用该Bean的默认构造函数。当然,可以在bean.xml中配置延迟加载(Lazy-init=”true”),或者是要求所有的bean都使用延迟加载(default-lazy-init=”true”).
2. Prototype:
对于Prototype而言,每次都会创建一个新的对象实例。而Bean的实例化是在调用getBean方法时。
五 Bean的生命周期
Bean是由Spring容器初始化,装配和管理的对象。Bean的生命周期主要是:
1) Bean实例化
Bean的默认构造函数。
2) Bean的初始化
Init()方法中可以进行初始化。
3) Bean的使用
getBean()方法可以获取当前的Bean,从而做相对应的业务操作。
4) Bean的销毁
destroy()方法执行bean的销毁。
六 Bean的XML元数据配置
   对于所有的Bean配置,我们都是在XML中完成。所有的Bean属性配置可以参考http://www.springframework.org/schema/beans/spring-beans-2.5.xsd。
详细内容请看下面的一个Sample:
<bean id="personService" class="com.spring.service.impl.PersonServiceBean" 
		   		scope="singleton" lazy-init="true" init-method="init" destroy-method="destory"
		   		autowire="autodetect" dependency-check="simple">

1. Scope:
这里同Web应用中的Scope一样,但是在Spring中,Singleton和Prototype是常用的Value。
2. Init-method:
就是初始化Bean时调用的方法
3. Destroy-method:
就是Bean销毁时候指定调用的方法
4. Autowire
Autowire:对应有五个Value,分别如下:
Mode Desc
No 不使用自动装配,必须通过ref元素指定依赖,默认设置。
byname 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配
byType 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发生,也可以通过设置dependency-check="objects"让Spring抛出异常
Constructor 与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一致的bean,那么抛出异常
Autodetect 通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果没有发现默认的构造器,那么将使用byType方式
可以设置bean使自动装配失效:
采用xml格式配置bean时,将<bean/>元素的autowire-candidate属性设置为false,这样容器在查找自动装配对象时,将不考虑该bean,即它不会被考虑作为其它bean自动装配的候选者,但是该bean本身还是可以使用自动装配来注入其它bean的.
不过,在日常的开发中,一般都是进行手工装配,很少用自动装配,因为手工装配易于开发管理。
5. Dependency-check
Dependency-check属性是同autowire属性一同使用,也就是说,只有在使用自动装载的时候,才会发挥作用。主要有四个Value:
Mode Desc
Simple 对基本类型,字符型和集合进行依赖检查
Object 对依赖的对象进行检查
All 对全部属性进行检查
None 不进行依赖检查
Default 默认是none

如:
< bean id="personService" class="com.spring.service.impl.PersonServiceBean" 
		   		scope="singleton" 
		   		autowire="autodetect" dependency-check="simple">
	<property name=”name” value=”jamson”/>
</bean>

是不能被子Bean所继承。
6. Abstract
Value值对应有true和false.一个bean组件没有指定实现类,而是通过设置abstract="true"属性来组织spring 容器实例化组件.abstract="true",表明这个bean只能作为其他bean的父bean使用,不能直接被实例化。
7. Factory-bean
只有使用实例工厂实例化bean的场合。
8. Factory-method
在使用非构造器方式实例化bean的场合。
9. 关于Collection的实例化

七 自动扫描管理Bean
   自动扫描管理Bean,主要分为以下步骤:
1. XML配置
<context:component-scan base-package=”com.spring”/>
告诉Spring容器,在com.spring包包含子包下所有的Bean都委托给Spring容器扫描管理。
2. Bean的注解
对于Spring引入的注解有四种:@Service,@Controller,@Repository,@Component。
对于@Service,用于标注业务层组件。
对于@Controller,用于标注控制层组件。
对于@Repository, 用于标注数据访问层组件(即Dao层);
对于@Component,用于标注所有的组件,通常用于一个不宜归于上述三种组件类型的Bean组件。
更多详细的设置,可以参考:http://www.springframework.org/schema/context/spring-context-2.5.xsd。
0
0
分享到:
评论

相关推荐

    spring.jar spring-webmvc-struts.jar spring-webmvc.jar

    Spring框架是Java开发中最广泛使用的轻量级框架之一,它提供了一种模块化的方式来构建企业级应用。"spring.jar"是Spring框架的核心库,包含了核心容器、AOP(面向切面编程)、上下文、表达式语言等模块。这个核心库...

    简单Spring框架模拟器--Demo

    在这个阶段,你将学习到BeanFactory如何解析XML配置,创建Bean实例,并执行初始化方法,理解Bean的生命周期管理。 “tiny-spring-step-3-inject-bean-with-property.zip”带你走进依赖注入的世界。这个步骤通过属性...

    spring学习系列 -- 定时器三 两种定时器的比较

    在Spring框架中,定时任务是应用开发中常见的一种需求,例如执行日志清理、数据同步或者定时发送邮件等。本文将深入探讨Spring提供的两种定时器——`Quartz`和`Spring Task`,并进行对比分析。 首先,让我们了解`...

    spring学习之八--Hibernate编程式事务

    在本篇"Spring学习之八--Hibernate编程式事务"中,我们将探讨如何在Spring框架中使用Hibernate进行编程式事务管理。编程式事务管理是相对于声明式事务管理的一种方式,它允许开发者通过代码来显式控制事务的开始、...

    尚硅谷-佟刚-spring使用的spring-framework-4.0.0.RELEASE

    3. **Spring的依赖注入(Dependency Injection, DI)**: Spring的核心特性之一是DI,它允许开发者通过声明式方式管理对象及其依赖关系。在Spring与Hibernate的整合中,DI使得我们可以轻松地将数据访问层(DAO)对象...

    普元eos-springbean开发

    SpringBean是Spring框架的核心概念之一,它是Spring IoC容器管理的对象。在普元EOS平台中,SpringBean同样扮演着重要角色,用于封装业务逻辑、数据访问等功能。通过合理地设计和配置SpringBean,可以极大地提高开发...

    spring-boot-starter-hbase自定义的spring-boot的hbasestarter

    在Java开发中,Spring Boot以其简洁、高效的特性,已经成为Web开发框架的首选之一。它通过自动配置和启动器(starter)来简化应用的搭建与运行。而当我们涉及到大数据存储与处理时,Apache HBase作为NoSQL数据库的一...

    Sping学习笔记(2)----实例化Bean的三种方式

    在Spring框架中,实例化Bean是其核心功能之一,它为开发者提供了多种方式来创建和管理对象。这篇“Spring学习笔记(2)----实例化Bean的三种方式”着重讲解了如何在Spring应用上下文中初始化Bean。以下是这三种方式...

    spring-boot-reference-zh

    1. **起步依赖(Starter Dependencies)**:Spring Boot 的关键特性之一就是起步依赖,这些预配置的 Maven 或 Gradle 依赖可以帮助开发者快速开始项目,比如 `spring-boot-starter-web` 可用于构建 Web 应用。...

    【框架源码篇 04】Spring源码手写篇-Bean定义配置化

    Bean的类名则指定了Bean的实现类,Spring将根据这个类名创建Bean实例。 其次,Bean的初始化方法和销毁方法允许我们自定义Bean的生命周期。初始化方法在Bean创建后且所有依赖注入完成之前调用,而销毁方法在Bean被...

    spring入门学习-3、Bean装配(XML).pdf

    2. **初始化**:当Spring IoC容器加载时,会根据配置文件中的信息创建Bean实例,并执行任何指定的初始化方法。 3. **使用**:开发者可以通过Spring容器获取Bean的实例并进行使用。 4. **销毁**:在某些情况下,...

    spring-framework-4.2.0.RELEASE官方完整包加官方文档

    其中,对Java 8的支持是这个版本的重要更新之一,允许开发者充分利用Java 8的新特性,如lambda表达式和日期时间API。 在依赖注入方面,Spring 4.2.0.RELEASE进一步简化了配置,通过Java配置类和注解,使得代码更加...

    Spring 框架学习总结-学习代码示例

    Spring框架是Java开发中最常用的轻量级框架之一,它以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)为核心特性,极大地简化了企业级应用的开发工作。本总结将围绕...

    spring bean life cycle

    在Spring框架中,Bean生命周期是核心概念之一,它涉及到Bean的创建、初始化、使用和销毁等阶段。了解和掌握Bean生命周期对于开发高质量的Spring应用至关重要。以下是对Spring Bean生命周期的详细解析。 首先,Bean...

    Spring-ioc-jar

    Spring IOC,全称为Inversion of Control,中文常被称为“控制反转”,是Spring框架的核心特性之一。这个概念在软件设计中引入了一种新的依赖管理方式,它将对象的创建和管理权交给了容器,使得开发者可以更专注于...

    spring-framework-5.0.2.RELEASE-中文注释版-终极完美版.rar

    在使用Spring 5.0.2.RELEASE中文注释版时,开发者可以清晰地理解每个类、接口和方法的功能,这对于深入学习和掌握Spring至关重要。例如,`org.springframework.beans.factory.BeanFactory`接口定义了容器的基本操作...

    spring boot demo 是一个用来深度学习并实战 spring bo-spring-boot-demo.zip

    2. **自动配置**: Spring Boot 的核心特性之一是自动配置。当你在项目中引入特定的依赖,Spring Boot 会尝试根据类路径中的存在情况自动配置相关的bean。例如,添加了`spring-boot-starter-web`,它将自动配置Tomcat...

    spring-tool-suite-4-4.13.0.RELEASE-e4.22.0-linux

    标题中的“spring-tool-suite-4-4.13.0.RELEASE-e4.22.0-linux”指的是一款基于Eclipse平台的Spring Tool Suite(STS)开发...对于想要学习或使用Spring框架的Java开发者来说,Spring Tool Suite是不可或缺的工具之一。

    spring-framework-2.5.6

    Spring框架,作为Java开发领域中的核心框架之一,自诞生以来就以其强大的功能、优秀的可扩展性和模块化的结构赢得了广大开发者们的青睐。2.5.6版本是Spring在2008年10月发布的一个稳定版本,它在前一版本的基础上...

Global site tag (gtag.js) - Google Analytics