`

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(方法注入)

    在Spring框架中,Lookup方法注入是一种特殊的依赖注入方式,它允许Spring容器动态替换bean中的某个方法,以便在运行时返回不同实例。这种方法主要用于处理单例bean依赖非单例bean的情况,确保每次调用都能获得一个新...

    spring资料6

    视频"Spring15_协调作用域不同的Bean与lookup方法注入.wmv"可能会详细解释如何管理这些不同作用域的Bean,以及如何使用lookup方法注入来动态地在运行时查找和注入依赖。 **Lookup方法注入**是一种特殊的依赖注入...

    Spring Framework Core 读书笔记

    Lookup 方法注入是 Spring Framework 中的一种机制,它允许容器覆盖容器管理的 bean 的方法,并返回另一个名为的 bean 的结果。这种机制是通过使用 CGLIB 库来动态生成子类实现的。例如,在 CommandManager 类中,...

    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作用域 ...

    NetBeans lookup的例子

    NetBeans Lookup是一个强大的服务发现和依赖注入机制,它在NetBeans平台的核心部分起着至关重要的作用。Lookup允许组件之间进行通信,无需事先了解其他组件的存在,增强了代码的可扩展性和可维护性。在这个"NetBeans...

    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...

    Spring Ioc 注解 依赖注入

    - **@Resource**:也是用于依赖注入,但它属于JSR 250规范的一部分,可以通过name或lookup属性指定依赖的名称。 #### 五、示例代码分析 假设我们有一个简单的例子,包含一个UserService类和一个UserRepository类,...

    spring依赖注入的实现原理

    Spring可以通过调用setter方法或构造器来注入依赖。 7. **AOP代理(AOP Proxy)** Spring通过AOP代理来实现对Bean的增强,提供事务管理、日志记录等服务。有JDK动态代理和CGLIB代理两种方式,前者适用于接口,后者...

    .NET Autofac依赖注入

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

    JNDI注入学习1

    JNDI注入漏洞通常发生在应用程序使用`InitialContext.lookup()`方法进行查找时,如果这个查找的URI(统一资源标识符)是由用户输入控制的,攻击者就可以构造恶意URI来执行任意代码。攻击过程通常包含以下步骤: 1. ...

    rapidsh-SSH经典整合框架-包括权限管理-文件上传下载-用户管理-分页-lookup

    综上所述,"rapidsh-SSH经典整合框架-包括权限管理-文件上传下载-用户管理-分页-lookup"是一个集成了上述技术的项目实例,它提供了一个完整的开发模板,可以帮助开发者快速搭建起具备上述功能的Web应用。通过学习和...

    Spring 框架中注入或替换方法实现

    例如,我们可以使用 lookup-method 标签来注入方法。 &lt;!-- 方法注入 --&gt; 毛姆" /&gt; &lt;lookup-method name="getAuthor" bean="author"/&gt; 在上面的示例中,我们使用 lookup-method 标签来注入 getAuthor() 方法,该...

    spring依赖注入知识点分享

    IoC 有两种方式:DL(Dependency Lookup)依赖查找和 DI(Dependency Injection)依赖注入。 DL 依赖查找 DL 依赖查找是一种 IoC 方式,它通过容器查找对象的依赖关系,典型的是 JNDI(Java Naming and Directory ...

    Spring相关设计思想解析IOC DI DL DP.doc

    - Setter注入:通过setter方法设置依赖对象,Spring会自动调用这些方法。 - 接口注入:通过实现特定接口,由容器调用接口方法注入依赖。 例如: ```java // 待注入的业务对象 public class Content { public ...

    spring里面想要让一个类的实例在所有属性都准备好之后就让它自动执行某些方法

    在Spring框架中,如果你希望一个类的实例在所有属性注入完成后自动执行某些特定的方法,你可以利用Spring的初始化回调机制。这个机制允许你在对象完全构造并准备好执行业务逻辑时执行一些自定义的操作。以下是对这个...

    依赖注入IOC

    2. **依赖查找**(Dependency Lookup):依赖查找是另一种实现控制反转的方法,它允许对象在运行时查询其所需的依赖服务。 #### 五、依赖倒置原则与控制反转的应用 为了更好地理解依赖倒置原则和控制反转的实际...

    j2ee常用方法.

    `InitialContext`的`lookup()`方法可以用来查找并返回数据库连接池。 5. EJB(Enterprise JavaBeans): - EJB是J2EE的一部分,提供了组件模型来构建可部署的应用。比如,Stateless Session Bean的`@Remote`接口中...

Global site tag (gtag.js) - Google Analytics