spring 解读之 基本bean装配

来源:互联网 发布:淘宝省市区三级联动js 编辑:程序博客网 时间:2024/06/18 11:28

容器是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配置部分:

  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
<bean id="ds" class="com.geostar.query.beans.DataSource">
<property name="driverClassName">
<value>${google.database.driverClassName}</value>
</property>
<property name="url" >
<value>${google.database.url}</value>
</property>
<property name="userName">
<value>${google.database.username}</value>
</property>
<property name="passWord">
<value>${google.database.password}</value>
</property>
<property name="tableName">
<value>${google.database.tablename}</value>
</property>
<property name="fieldName">
<value>${google.database.fieldname}</value>
</property>
<property name="orderFieldName">
<value>${google.database.orderfieldname}</value>
</property>
</bean>
 来自CODE的代码片
database.xml
 1 2
Resource resource=new ClassPathResource("conf/spring/applicationContext.xml");
BeanFactory factory=new XmlBeanFactory(resource);
 来自CODE的代码片
beanFactory1.java
上面的代码告诉Bean工厂从XML文件中读取Bean的定义信息。但是现在Bean工厂还没有本实例化Bean。
Bean是被延迟加载到Bean工厂中的,就是说Bean工厂会立刻把Bean的基本信息载入进来,但是Bean只有在需要的时候才会被实例化。
为了从Bean工厂得到一个Bean,只要简单地调用getBean()方法。
 1 2
com.geostar.query.beans.DataSource ds=(com.geostar.query.beans.DataSource)factory.getBean("ds");
System.out.println(ds.getDriverClassName());
 来自CODE的代码片
getBean.java
当getBean()方法被调用的时候,工厂就会实例化Bean并且使用依赖注入设置Bean的属性。这样就在spring容器里面开始了Bean的生命。

3.应用上下文:

使用ApplicationContext读取spring配置文件,可以如下:
 1 2 3
ApplicationContext factory=new ClassPathXmlApplicationContext("classpath:conf/spring/applicationContext.xml");
DataSource ds=(DataSource)factory.getBean("ds");
System.out.println(ds.getDriverClassName());
 来自CODE的代码片
ApplicationContext.java

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

ClassPathXmlApplicationContext

FileSystemXmlApplicationContext

XmlWebApplicationContext

第一种和第二种的区别在于,ClassPath可以在整个类路径(包括JAR文件)中寻找定义Bean的XML文件;而FileSystem只能在指定路径中寻找。
 1 2 3
ApplicationContext context = new FileSystemXmlApplicationContext("c:/pirate.xml");
// or ~
ApplicationContext context = new ClassPathXmlApplicationContext("pirate.xml")
 来自CODE的代码片
app.java

4.BeanFactory与ApplicationConText区别:

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

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

5.Bean的生命周期

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

  1  2  3  4  5  6  7  8  9 10
<?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.0.xsd”>
<bean id=”HelloWorld” class=”com.pqf.beans.HelloWorld”>
<property name=”msg”>
<value>HelloWorld</value>
</property>
</bean>
</beans>
 来自CODE的代码片
bean.xml

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

5.2 Bean的初始化
有两种方式初始化Bean。
5.2.1在配置文档中通过指定init-method 属性来完成
在Bean的类中实现一个初始化Bean属性的方法,如init(),如:

  1  2  3  4  5  6  7  8  9 10
public class HelloWorld{
public String msg=null;
public Date date=null;
public void init() {
msg=HelloWorld;
date=new Date();
}
……
}
 来自CODE的代码片
bean2.java

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

 1
<bean id=”HelloWorld” class=”com.pqf.beans.HelloWorld” init-mothod=”init” ></bean>
 来自CODE的代码片
init.xml

5.2.2 实现 org.springframwork.beans.factory.InitializingBean接口
Bean实现InitializingBean接口,并且增加 afterPropertiesSet() 方法:

  1  2  3  4  5  6  7  8  9 10
public class HelloWorld implement InitializingBean {
public String msg=null;
public Date date=null;
public void afterPropertiesSet() {
msg=”向全世界问好!”;
date=new Date();
}
……
}
 来自CODE的代码片
initializ.java

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

5.3 Bean的调用

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

 1 2 3 4
HelloWorld hw=new HelloWorld();
BeanWrapper bw=new BeanWrapperImpl(hw);
bw.setPropertyvalue(msg,HelloWorld);
system.out.println(bw.getPropertyCalue(msg));
 来自CODE的代码片
beanWrapper.java

5.3.2 使用BeanFactory

 1 2 3 4
InputStream is=new FileInputStream(config.xml);
XmlBeanFactory factory=new XmlBeanFactory(is);
HelloWorld hw=(HelloWorld) factory.getBean(HelloWorld);
system.out.println(hw.getMsg());
 来自CODE的代码片
xmlBeanFactory.java

5.3.3 使用ApplicationContext

 1 2 3
ApplicationContext actx=new FleSystemXmlApplicationContext(config.xml);
HelloWorld hw=(HelloWorld) actx.getBean(HelloWorld);
System.out.println(hw.getMsg())
 来自CODE的代码片
applicationContext.java

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
原创粉丝点击