`

Lookup方法注入

 
阅读更多
Lookup方法注射指容器能够重写容器中bean的抽象或具体方法,返回查找容器中其他bean的结果。 被查找的bean在上面描述的场景中通常是一个non-singleton bean (尽管也可以是一个singleton的)。Spring通过使用CGLIB库在客户端的类之上修改二进制码, 从而实现上述的场景要求。

包含方法注入的客户端类,必须按下面的形式的抽象(具体)定义方法:

protected abstract SingleShotHelper createSingleShotHelper();
如果方法不是抽象的,Spring就会直接重写已有的实现。在XmlBeanFactory的情况下,你可以使用bean定义中的lookup-method 属性来指示Spring去注入/重写这个方法,以便从容器返回一个特定的bean。举个例子说明:

<!-- a stateful bean deployed as a protype (non-singleton) -->
<bean id="singleShotHelper class="..." singleton="false">
</bean>

<!-- myBean uses singleShotHelper -->
<bean id="myBean" class="...">
  <lookup-method name="createSingleShotHelper"
                 bean="singleShotHelper"/>
  <property>
    ...
  </property>
</bean>
当myBean需要一个新的singleShotHelper的实例的时候, 它就会调用它自己的createSingleShotHelper 方法。 值得注意的是:部署beans的人员必须小心地将singleShotHelper作为一个non-singleton部署 (如果确实需要这么做)。如果它作为一个singleton(除非明确说明,否则缺省就是singletion)而部署, 同一个singleShotHelper实例将会每次被返回。

注意Lookup方法注射能够同构造函数注射结合(对创建的bean提供可选的构造函数参数), 也可以同setter方法注射结合(在创建的bean之上设置属性)。

public class UserDao {
	
	public UserDao(){}
	
	private String name = "";

	public UserDao(String name) {
		this.name = name;
	}

	public void create() {
		System.out.println("create user from - " + name);
	}
}

public abstract class UserManager {
	public UserDao getUserDao() {
		return new UserDao("UserManager.getUserDao()");
	}

	public void createUserDao() {
		UserDao dao = getUserDao();
		dao.create();
	}
	//方法注入所需要的方法,由spring提供实现
	public abstract UserDao getSingleUserDao();
	
}



      	<bean name="userManager" class="com.yoyousfot.spring.lookup.UserManager">
		<lookup-method name="getSingleUserDao" bean="userDao"/>
	</bean>
	<bean name="userDao" class="com.yoyousfot.spring.lookup.UserDao">
		<constructor-arg>
			<value>lookup method</value>
		</constructor-arg>
	</bean>


    通过这种机制我们可以在不修改原系统代码的情况下,可以轻易的把UserDao换成别的类型相容的对象而不会影响原系统。Spring是使用CGLIB在字节码级别动态实现出userManager的子类,并重写getUserDao方法的方式来实现这个神奇的功能的。
分享到:
评论

相关推荐

    深入理解Spring中的Lookup(方法注入)

    “Lookup方法”可以使Spring替换一个bean原有的,获取其它对象具体的方法,并自动返回在容器中的查找结果。下面这篇文章主要给大家介绍了关于Spring中Lookup(方法注入)的相关资料,需要的朋友可以参考下

    Spring.3.x企业应用开发实战(完整版).part2

    4.5.1 lookup方法注入 4.5.2 方法替换 4.6 之间的关系 4.6.1 继承 4.6.2 依赖 4.6.3 引用 4.7 整合多个配置文件 4.8 Bean作用域 4.8.1 singleton作用域 4.8.2 prototype作用域 4.8.3 Web应用环境相关的Bean作用域 ...

    Spring3.x企业应用开发实战(完整版) part1

    4.5.1 lookup方法注入 4.5.2 方法替换 4.6 之间的关系 4.6.1 继承 4.6.2 依赖 4.6.3 引用 4.7 整合多个配置文件 4.8 Bean作用域 4.8.1 singleton作用域 4.8.2 prototype作用域 4.8.3 Web应用环境相关的Bean作用域 ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    Lookup方法注入 3.3.8.2. 自定义方法的替代方案 3.4. bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用域 3.4.3. 其他作用域 3.4.3.1. 初始化web配置 3.4.3.2. Request作用域 3.4.3.3. Session作用域 3.4...

    .NET Autofac依赖注入

    依赖注入是做什么用的? 依赖注入又称之为控制反转(Inversion of ... 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。引用自百度百科。

    hapi-pioc:pioc 依赖注入容器的 hapi.js 插件

    hapi-pioc通过添加可用于获取服务的lookup方法来扩展 hapi 服务器对象。 因此它遵循服务定位器模式。 但是,在您的服务中,您可以通过构造函数注入、属性注入或延迟属性注入自由地依赖依赖注入。为什么? 因为我真...

    NC65安全漏洞补丁.rar

    发现多处调用了NCLocator的lookup方法查找Service接口进行操作,通过跟踪发现,实际使用了RmiNCLocator类,RmiNCLocator类的lookup方法,这里的lookup,已初步判断出无需继续跟踪调试,可以直接通过jndi注入漏洞进行...

    JNDI注入学习1

    JNDI 注简单来说就是在 JNDI 接在初始化时,如: InitialContext.lookup(URI) ,如果URI 可控,那么客户端就可能会被攻击通过

    ejb-fallback-lookup

    有时,当我们注入远程 EJB 时,如果它的远程应用程序不可用,则注入的 EJB 将不再工作。 但是,如果应用程序重新启动,则应该再次查找注入的 EJB。 但它不适用于另一个 EJB(@Stateless 或 @Stateful)中的 @EJB ...

    04-IoC简介-控制翻转概念(IoC)

    其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的...

    springioc和spring aop

    其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的...

    JAVA spring 系列案例50个和学习资料

    Spring系列第12篇:lazy-init:bean延迟初始化Spring系列第13篇:使用继承简化bean配置(abstract & parent)Spring系列第14篇:lookup-method和replaced-method比较陌生,怎么玩的?Spring系列第15篇:代理详解(Java...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    FactoryInstance 的 lookup() 方法被调用,在 SpringFactoryInstance 中,首先查找 Spring 容器,然后,通过 Bean 的 ID 查找 Bean,最终,FlexService 接口的实例被返回。 注意到 destination 的 id 并没有写死在...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    FactoryInstance 的 lookup() 方法被调用,在 SpringFactoryInstance 中,首先查找 Spring 容器,然后,通过 Bean 的 ID 查找 Bean,最终,FlexService 接口的实例被返回。 注意到 destination 的 id 并没有写死在...

    spring3.2+strut2+hibernate4

    -- &lt;jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/store" /&gt;--&gt; &lt;!--Hibernate配置--&gt; &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"&gt;&lt;!...

Global site tag (gtag.js) - Google Analytics