码迷,mamicode.com
首页 > 编程语言 > 详细

开涛spring3(3.3) - DI 之 3.3 更多DI的知识

时间:2015-02-27 11:49:00      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

3.3.1  延迟初始化Bean

       延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean。

       配置方式很简单只需在<bean>标签上指定 “lazy-init” 属性值为“true”即可延迟初始化Bean。

       Spring容器会在创建容器时提前初始化“singleton”作用域的Bean,“singleton”就是单例的意思即整个容器每个Bean只有一 个实例,后边会详细介绍。Spring容器预先初始化Bean通常能帮助我们提前发现配置错误所以如果没有什么情况建议开启,除非有某个Bean可能需 要加载很大资源,而且很可能在整个应用程序生命周期中很可能使用不到,可以设置为延迟初始化。

       延迟初始化的Bean通常会在第一次使用时被初始化;或者在被非延迟初始化Bean作为依赖对象注入时在会随着初始化该Bean时被初始化,因为在这时使用了延迟初始化Bean

       容器管理初始化Bean消除了编程实现延迟初始化,完全由容器控制,只需在需要延迟初始化的Bean定义上配置即可,比编程方式更简单,而且是无侵入代码的。

       具体配置如下:

 

<bean id="helloApi"  
    class="cn.javass.spring.chapter2.helloworld.HelloImpl"  
    lazy-init="true"/>  

 

3.3.2  使用depends-on

       depends-on是指指定Bean初始化及销毁时的顺序,使用depends-on属性指定的Bean要先初始化完毕后才初始化当前Bean,由于只 有“singleton”Bean能被Spring管理销毁,所以当指定的Bean都是“singleton”时,使用depends-on属性指定的 Bean要在指定的Bean之后销毁。

 

配置方式如下:

    <bean id="helloApi" class="cn.javass.spring.chapter2.helloworld.HelloImpl"/>  
    <bean id="decorator"  
        class="cn.javass.spring.chapter3.bean.HelloApiDecorator"  
        depends-on="helloApi">  
        <property name="helloApi"><ref bean="helloApi"/></property>  
    </bean>  

 

“decorator”指定了“depends-on”属性为“helloApi”,所以在“decorator”Bean初始化之前要先初始化 “helloApi”,而在销毁“helloApi”之前先要销毁“decorator”,大家注意一下销毁顺序,与文档上的不符。

 

“depends-on”属性可以指定多个Bean,若指定多个Bean可以用“;”、“,”、空格分割。

       那“depends-on”有什么好处呢?主要是给出明确的初始化及销毁顺序,比如要初始化“decorator”时要确保“helloApi”Bean 的资源准备好了,否则使用“decorator”时会看不到准备的资源;而在销毁时要先在“decorator”Bean的把对“helloApi”资源 的引用释放掉才能销毁“helloApi”,否则可能销毁 “helloApi”时而“decorator”还保持着资源访问,造成资源不能释放或释放错误。

 

让我们看个例子吧,在平常开发中我们可能需要访问文件系统,而文件打开、关闭是必须配对的,不能打开后不关闭,从而造成其他程序不能访问该文件。让我们来看具体配置吧:

 

   具体代码如下:

1.ResourceBean

package lqy.springh5;

import java.io.File;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;  
public class ResourceBean {  
    private FileOutputStream fos;     
    private File file;  
    //初始化方法  
    public void init() {  
        System.out.println("ResourceBean:========初始化");  
        //加载资源,在此只是演示  
        System.out.println("ResourceBean:========加载资源,执行一些预操作");  
        try {  
            this.fos = new FileOutputStream(file);  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        }  
    }  
    //销毁资源方法  
    public void destroy() {  
        System.out.println("ResourceBean:========销毁");  
        //释放资源  
        System.out.println("ResourceBean:========释放资源,执行一些清理操作");  
        try {  
            fos.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
    public FileOutputStream getFos() {  
        return fos;  
    }  
    public void setFile(File file) {  
        this.file = file;  
    }  
}  

 

2.DependentBean

package lqy.springh5;

import java.io.IOException;  
public class DependentBean {  
    ResourceBean resourceBean;     
    public void write(String ss) throws IOException {  
        System.out.println("DependentBean:=======写资源");  
        resourceBean.getFos().write(ss.getBytes());  
    }  
    //初始化方法  
    public void init() throws IOException {  
        System.out.println("DependentBean:=======初始化");  
resourceBean.getFos().write("DependentBean:=======初始化=====".getBytes());  
    }  
    //销毁方法  
    public void destroy() throws IOException {  
        System.out.println("DependentBean:=======销毁");  
        //在销毁之前需要往文件中写销毁内容  
        resourceBean.getFos().write("DependentBean:=======销毁=====".getBytes());  
    }  
     
    public void setResourceBean(ResourceBean resourceBean) {  
        this.resourceBean = resourceBean;  
    }  
}  

3.springh5.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"  
xmlns:context="http://www.springframework.org/schema/context"  
xsi:schemaLocation="  
http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
http://www.springframework.org/schema/context                http://www.springframework.org/schema/context/spring-context-3.0.xsd">  

    <bean id="resourceBean"  
        class="lqy.springh5.ResourceBean"  
        init-method="init" destroy-method="destroy">  
        <property name="file" value="D:/test.txt"/>  
    </bean>  
    <bean id="dependentBean"  
        class="lqy.springh5.DependentBean"  
        init-method="init" destroy-method="destroy" depends-on="resourceBean">  
        <property name="resourceBean" ref="resourceBean"/>  
    </bean>  
</beans>

 

<property name="file" value="D:/test.txt"/>配置:Spring容器能自动把字符串转换为java.io.File。

init-method="init" 指定初始化方法,在构造器注入和setter注入完毕后执行。    

destroy-method="destroy"指定销毁方法,只有“singleton”作用域能销毁,“prototype”作用域的一定不能,其他作用域不一定能;后边再介绍。

 

在此配置中,resourceBean初始化在dependentBean之前被初始化,resourceBean销毁会在dependentBean销毁之后执行。

测试一下吧:

 

package lqy.springh5;

import org.springframework.context.support.ClassPathXmlApplicationContext;


public class App5
{
    public static void main( String[] args ) throws Exception
    {
        ClassPathXmlApplicationContext context =  new ClassPathXmlApplicationContext("springh5.xml");  
        //一点要注册销毁回调,否则我们定义的销毁方法不执行  
        context.registerShutdownHook();  
        DependentBean dependentBean =  context.getBean("dependentBean", DependentBean.class);  
        dependentBean.write("aaa");  
        
    }
}

 

  测试跟其他测试完全一样,只是在此我们一定要注册销毁方法回调,否则销毁方法不会执行。

技术分享

 

test.txt的文本

技术分享

 

 

注意:context.registerShutdownHook(); 若注释,则destroy方法不执行,不回调了

 

开涛spring3(3.3) - DI 之 3.3 更多DI的知识

标签:

原文地址:http://www.cnblogs.com/crazylqy/p/4302792.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!