作者:禅楼望月(http://www.cnblogs.com/yaoyinglong

我们通常使用lookup方法注入,它可使Spring替换一个Bean的抽象或具体方法,返回查找容器中,其他Bean的结果,被查找的Bean通常是一个non-singleton Bean。

无状态的Bean的作用域一般可以配置成singleton单实例,如果我们向singleton的BeanA注入prototype的BeanB,并希望每次调用BeanA的getBeanB()时都能返回一个新的BeanB,使用传统的注入方式方法将无法实现这样的要求。因为singleton的Bean注入关联Bean的动作只有一次,虽然BeanB的作用域是prototype类型,返回的对象不是最开始注入的那个bean。

如果希望每次调用BeanA的getBeanB()时都能返回一个新的BeanB一种可选的方案是让Bean实现BeanFactoryAware接口,让BeanA能访问容器的引用,以下代码可以实现方式达到目的:

[+] view code

public class Bean_A implements BeanFactoryAware{

    private Bean_B bean_B=null;
    private BeanFactory beanFactory=null;
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory=beanFactory;
    }
    public Bean_B getBean_B(){
        return beanFactory.getBean("bean_B", Bean_B.class);
    }

}

回忆第一篇里讲的Bean的生命周期,当一个Bean的POJO类实现了BeanFactoryAware接口时,当Bean实例化完成并调用setter方法降属性也设置完毕后,会调用BeanFactoryAware接口的setBeanFactory方法,这样我们便可以得到BeanFactory的一个引用。使用BeanFactory我们便可以获取一个全新的scope="prototype" 的Bean实例了。

但是,这种方法,使得一个纯净的POJO类被污染了,因此一般情况下不适用这种方法。

1. 使用lookup方法注入

Spring IoC容器有复写Bean方法的能力,这项功能归功于CGLib类包,CGLib可以在运行期动态的操作Class字节码,使Spring替换一个Bean的抽象或具体方法,现在我们将上面的功能使用lookup方法注入来实现:

[+] view code

public class Bean_A{

    private Bean_B bean_B=null;
    public Bean_B getBean_B() {
        return bean_B;
    }
    public void setBean_B(Bean_B bean_B) {
        this.bean_B = bean_B;
    }

}

注意,我们这里的Bean_A是一个纯洁的POJO类。然后在Spring配置文件中为Bean_A添加lookup方法注入,使Spring替换getBean_B() 方法即可。

[+] view code

<bean id="bean_B" class="smzq.Bean_B" scope="prototype"/>

<bean id="bean_A" class="smzq.Bean_A">
    <lookup-method name="getBean_B" bean="bean_B"/>

</bean>

测试:

大功告成。

注:lookup方法还可以为bean动态的创建子类或实现类,现在我们声明一个接口,如下:

[+] view code

public interface BeanInterface {

    Bean_B getBean_B();

}

同样在Spring的配置文件中配置,但这次配置的不是类,而是一个接口。很神奇吧!

[+] view code

<bean id="bean_B" class="smzq.Bean_B" scope="prototype"/>

<bean id="beanInter" class="smzq.BeanInterface">
    <lookup-method name="getBean_B" bean="bean_B"/>

</bean>

再测试一下:

由此可见,Spring确实为我们的BaseInter接口创建了实现类。那么这里是抽象类呢?Spring也会为其创建一个子类。

<lookup-method> 元素只有两个属性:

name:指定要让Spring实现的或者替换的方法名称,该方法返回一个Bean对象。

bean:指定name属性指定的方法的返回值。

Spring应用教程-2 方法注入的更多相关文章

  1. Spring 自动装配;方法注入

    通过配置defalut—autowire属性,Spring IOC容器可以自动为程序注入Bean:默认是no(不启用自动装配). default—autowire的类型有: byName:通过名称自动 ...

  2. Spring中的Lookup(方法注入)

    在使用Spring时,可能会遇到这种情况:一个单例的Bean依赖另一个非单例的Bean.如果简单的使用自动装配来注入依赖,就可能会出现一些问题,如下所示: 单例的Class A @Component ...

  3. Spring学习笔记之方法注入

    public  abstract class ReplacedBean {protected static final Log log = LogFactory.getLog(ReplacedBean ...

  4. Spring第六弹—-依赖注入之使用构造器注入与使用属性setter方法注入

    所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中. 使用构造器注入   1 2 3 4 <constructor-arg index=“0” type=“java.lang. ...

  5. 【Spring Framework】Spring 入门教程(一)控制反转和依赖注入

    参考资料 Spring 教程 说在前面 什么样的架构,我们认为是一个优秀的架构? 判断准则:可维护性好,可扩展性好,性能. 什么叫可扩展性好? 答:在不断添加新的代码的同时,可以不修改原有代码,即符合 ...

  6. Spring揭秘 读书笔记 四----方法注入

    我们知道,拥有prototype类型scope的bean,在请求方每次向容器请求该类型对象的时候,容器都会返回一个全新的该对象实例. 我们看下面的例子: public class MockNewsPe ...

  7. spring依赖注入之构造函数注入,set方法注入

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  8. spring注入 属性注入 构造器注入 set方法注入

    spring注入 属性注入 构造器注入 set方法注入(外部bean注入)

  9. Spring依赖注入的Setter注入(通过get和set方法注入)

    Spring依赖注入的Setter注入(通过get和set方法注入) 导入必要的jar包(Spring.jar和commonslogging.jar) 在src目录下建立applicationCont ...

随机推荐

  1. JavaWeb开发学习(一)-JavaWeb开发概述

    1.Web相关概念 Web程序也就是一般所说的网站,由服务器.客户端浏览器以及网络组成.Web程序的好处是使用简单,不需要安装.学习,有一台电脑.一根网线就可以使用.Web程序不是一般意义上的网站.网 ...

  2. ORACLE基本知识

    一.数据库名  什么是数据库名? 数据库名就是一个数据库的标识,就像人的身份证号一样.他用参数DB_NAME表示,如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名.在数据库安装或创建完成 ...

  3. Linux环境下中文字体乱码处理办法

    项目中包含了一项生成JPG图片的功能,该功能需要使用JAVA的Graphics2D动态生成图片中的文字,原来在Windows平台中没有发现问题,但是迁移至Linux平台后发现生成的中文变成了乱码. 百 ...

  4. 如何判断ScrollView滑动方形

    1/判断滚动视图左右滚动 { CGFloat startContentOffsetX;//滚动开始的坐标 CGFloat willEndContentOffsetX; //滚动即将停止的坐标 CGFl ...

  5. 压力测试工具ab使用

    ab全名是apache bench,是apache自带的一款压力测试工具.它通过创建多个线程来模拟并发,测试目标是基于URL的,因此不论是什么web服务器都可以支持. 使用ab非常简单,进入apach ...

  6. DBCP连接池使用问题

    问题现象: 启动应用,访问无压力,一切正常,一段时间过后,应用访问异常. 问题分析: 1.web容器线程爆满,拒绝服务.由于应用并发量大,线程响应时间长增加,线程池连接数逐步递增直到爆满,导致应用拒绝 ...

  7. 从3D Touch 看 原生快速开发

    全新的按压方式苹果继续为我们带来革命性的交互:Peek和Pop,Peek 和 Pop 让你能够预览所有类型的内容,甚至可对内容进行操作,却不必真的打开它们.例如,轻按屏幕,可用 Peek 预览收件箱中 ...

  8. 常见标签的默认属性值及相互作用——关于CSS reset的思考

    在现在的网站设计中使用reset.css用重置整个站点的标签的CSS属性的做法很常见,但有时候我们已经为了reset而reset,我们经常看到这样的reset代码 div{ padding:0px; ...

  9. C# socket编程实践——支持广播的简单socket服务器

    在上篇博客简单理解socket写完之后我就希望写出一个websocket的服务器了,但是一路困难重重,还是从基础开始吧,先搞定C# socket编程基本知识,写一个支持广播的简单server/clie ...

  10. read links July-14

    1)   http://ruby-hacking-guide.github.io/intro.html It has one part to discuss “Technique to read so ...