您的位置:首页 > 编程语言 > Java开发

spring 解读之 基本bean装配

2015-09-08 14:27 561 查看
容器是spring的核心,spring容器使用DI管理所有组成应用系统的组件。

spring的IOC容器能够帮我们自动new对象,对象交给spring管之后我们不用自己手动去new对象了。

1.spring 容器分为两类:

1.1 bean工厂(由BeanFactory接口定义)是最简单的spring容器,提供了基本的依赖注入支持。
1.2 应用上下文(由ApplicationContext接口定义)建立在bean工厂之上,提供了系统构架服务。

2.BeanFactory介绍:

采用工厂设计模式,就是说由这个类负责创建和分发Bean。

2.1 XmlBeanFactory

spring中有几种BeanFactory的实现  其中最常用的是XmlBeanFactory。
使用XmlBeanFactory读取spring配置文件,可以如下:
------下面是spring配置部分:

${google.database.driverClassName}${google.database.url}${google.database.username}${google.database.password}${google.database.tablename}${google.database.fieldname}${google.database.orderfieldname}

Resource resource=new ClassPathResource("conf/spring/applicationContext.xml");
BeanFactory factory=new XmlBeanFactory(resource);

上面的代码告诉Bean工厂从XML文件中读取Bean的定义信息。但是现在Bean工厂还没有本实例化Bean。
Bean是被延迟加载到Bean工厂中的,就是说Bean工厂会立刻把Bean的基本信息载入进来,但是Bean只有在需要的时候才会被实例化。
为了从Bean工厂得到一个Bean,只要简单地调用getBean()方法。

com.geostar.query.beans.DataSource ds=(com.geostar.query.beans.DataSource)factory.getBean("ds");
System.out.println(ds.getDriverClassName());

当getBean()方法被调用的时候,工厂就会实例化Bean并且使用依赖注入设置Bean的属性。这样就在spring容器里面开始了Bean的生命。

3.应用上下文:

使用ApplicationContext读取spring配置文件,可以如下:

ApplicationContext factory=new ClassPathXmlApplicationContext("classpath:conf/spring/applicationContext.xml");
DataSource  ds=(DataSource)factory.getBean("ds");
System.out.println(ds.getDriverClassName());


ApplicationContext的诸多实现中,以下三种经常用到:

ClassPathXmlApplicationContext

FileSystemXmlApplicationContext

XmlWebApplicationContext
第一种和第二种的区别在于,ClassPath可以在整个类路径(包括JAR文件)中寻找定义Bean的XML文件;而FileSystem只能在指定路径中寻找。

ApplicationContext context = new FileSystemXmlApplicationContext("c:/pirate.xml");
// or ~
ApplicationContext context = new ClassPathXmlApplicationContext("pirate.xml")


4.BeanFactory与ApplicationConText区别:

1 两者都是通过xml配置文件加载bean,ApplicationContext和BeanFacotry相比,提供了更多的扩展功能,但其主要区别在于后者是延迟加载,如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常;而ApplicationContext则在初始化自身是检验,这样有利于检查所依赖属性是否注入;所以通常情况下我们选择使用ApplicationContext.

2 两者在加载Bean实例时的区别:
BeanFactory被初始化的时候,并没有加载所有的单实例Bean对象,而是等到调用getBean()方法的时候才初始化相应的Bean实例对象。
ApplicationContext被初始化的时候就已经检查所有的Bean对象并初始化,当调用getBean()方法的时候,直接可以从缓存中取出相应的Bean实例对象。

5.Bean的生命周期

5.1 Bean的定义

Spring通常通过配置文件定义Bean。如:

<?xml version=”1.0″ encoding=”UTF-8″?>
HelloWorld


这个配置文件就定义了一个标识为 HelloWorld 的Bean。在一个配置文档中可以定义多个Bean。

5.2 Bean的初始化

有两种方式初始化Bean。
5.2.1在配置文档中通过指定init-method 属性来完成

在Bean的类中实现一个初始化Bean属性的方法,如init(),如:

public class HelloWorld{
public String msg=null;
public Date date=null;

public void init() {
msg=”HelloWorld”;
date=new Date();
}
……
}


然后,在配置文件中设置init-mothod属性:



5.2.2 实现 org.springframwork.beans.factory.InitializingBean接口

Bean实现InitializingBean接口,并且增加 afterPropertiesSet() 方法:

public class HelloWorld implement InitializingBean {
public String msg=null;
public Date date=null;

public void afterPropertiesSet() {
msg=”向全世界问好!”;
date=new Date();
}
……
}


那么,当这个Bean的所有属性被Spring的BeanFactory设置完后,会自动调用afterPropertiesSet()方法对Bean进行初始化,于是,配置文件就不用指定 init-method属性了。

5.3 Bean的调用

有三种方式可以得到Bean并进行调用:
5.3.1 使用BeanWrapper

HelloWorld hw=new HelloWorld();
BeanWrapper bw=new BeanWrapperImpl(hw);
bw.setPropertyvalue(“msg”,”HelloWorld”);
system.out.println(bw.getPropertyCalue(“msg”));


5.3.2 使用BeanFactory

InputStream is=new FileInputStream(“config.xml”);
XmlBeanFactory factory=new XmlBeanFactory(is);
HelloWorld hw=(HelloWorld) factory.getBean(“HelloWorld”);
system.out.println(hw.getMsg());


5.3.3 使用ApplicationContext

ApplicationContext actx=new FleSystemXmlApplicationContext(“config.xml”);
HelloWorld hw=(HelloWorld) actx.getBean(“HelloWorld”);
System.out.println(hw.getMsg())


5.4 Bean的销毁

5.4.1 用配置文件中的 destory-method 属性


与初始化属性 init-methods类似,在Bean的类中实现一个撤销Bean的方法,然后在配置文件中通过 destory-method指定,那么当bean销毁时,Spring将自动调用指定的销毁方法。

5.4.2 实现 org.springframwork.bean.factory.DisposebleBean接口

如果实现了DisposebleBean接口,那么Spring将自动调用bean中的Destory方法进行销毁,所以,Bean中必须提供Destory方法。

参考: http://www.cnblogs.com/likehua/archive/2011/12/16/2290737.html http://www.mianwww.com/html/2009/01/207.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: