本篇内容主要讲解“Sping中lookup-method注入的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Sping中lookup-method注入的方法是什么”吧!
lookup-method 注入
lookup-method注入是容器重写容器管理(container-managed) bean上的方法并返回容器中另一个命名bean的lookup结果。lookup通常需要一个prototype bean,如前一节所述。Spring框架通过使用CGLIB库(CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作)中的字节码生成动态生成覆盖该方法的子类来实现此方法注入。
需要注意一下几点:
要使这个动态子类工作,Spring bean容器子类不能是final的类,要重写的方法也不能是final的类。
单元测试具有抽象方法的类需要自己对该类进行子类化,并对其它抽象方法的实现。
具体的类提供组件lookup需要的具体的方法。
另一个关键限制是lookup-method不能与工厂方法一起,特别是不能与配置类中的@Bean方法一起,因为在这种情况下,容器不负责创建实例,因此不能动态创建运行时生成的子类。
对于前面代码中的CommandManager类,Spring容器动态重写createCommand()方法的实现。CommandManager类没有任何Spring依赖,重新写的示例所示:
package fiona.apple;
public abstract class CommandManager {
public Object process(Object commandState) {
// 获取命令接口的新实例
Command command = createCommand();
// 在(希望是全新的)命令实例上设置状态
command.setState(commandState);
return command.execute();
}
// 可以。。。但是这种方法的实现在哪里呢?
protected abstract Command createCommand();
}
在要注入的方法的client 类(在本例中是CommandManager)中,要注入的方法需要以下形式的签名:
<public|protected> [abstract] <return-type> theMethodName(no-arguments);
如果方法是抽象的,则动态生成的子类实现该方法。否则,动态生成的子类将重写在原来类中定义的方法。请使用以下示例:
<!-- 作为prototype部署的bean(非单例) -->
<bean id="myCommand" class="fiona.apple.AsyncCommand" scope="prototype">
<!-- 根据需要在此处插入依赖项 -->
</bean>
<!-- commandProcessor使用statefulCommandHelper -->
<bean id="commandManager" class="fiona.apple.CommandManager">
<lookup-method name="createCommand" bean="myCommand"/>
</bean>
commandManager的bean需要myCommand bean的新实例时调用自己的createCommand()方法。如果真的需要myCommand bean,那么必须将其部署为prototype 。如果它是单例的,则每次都返回相同的myCommand bean实例。
或者,经常可以依赖于 target bean根据lookup method的返回类型得到解决:
public abstract class CommandManager {
public Object process(Object commandState) {
MyCommand command = createCommand();
command.setState(commandState);
return command.execute();
}
@Lookup
protected abstract MyCommand createCommand();
}
注意,你通常应该用一个具体的子类实现来声明带注解的lookup method,以便它们与Spring的组件扫描规则兼容,在该规则中,抽象类在默认情况下会被忽略。此限制不适用于指明注册或导入的bean类。
访问不同Scoped 目标bean的另一种方法是ObjectFactory/Provider注入点。将 Scoped bean视为依赖。
你还可能发现ServiceLocatorFactoryBean(在org.springframework.beans.factory.config包中)非常有用。
任意方法替换
method 注入的一种不如lookup 方法注入有用的形式是用另一个方法实现替换托管bean中的任意方法的能力。
使用基于XML的配置元数据,可以使用替换的方法元素替换已部署的bean的现有方法实现。考虑下面的类,它有一个名为computeValue的方法,覆盖它:
public class MyValueCalculator {
public String computeValue(String input) {
}
//其它methods...
}
实现org.springframework.beans.factory.support.MethodReplacer接口的类提供了新的方法定义,如下例所示:
/**
* 用于重写MyValueCalCulter中现有的CtudioValueString(String)实现
*/
public class ReplacementComputeValue implements MethodReplacer {
public Object reimplement(Object o, Method m, Object[] args) throws Throwable {
// 获取输入值,对其进行处理,并返回计算结果
String input = (String) args[0];
...
return ...;
}
}
部署初始类并指定方法重写的bean,类似于以下示例:
<bean id="myValueCalculator" class="x.y.z.MyValueCalculator">
<!-- 任意 method replacement -->
<replaced-method name="computeValue" replacer="replacementComputeValue">
<arg-type>String</arg-type>
</replaced-method>
</bean>
<bean id="replacementComputeValue" class="a.b.c.ReplacementComputeValue"/>
可以在<replaced-method/>中使用一个或多个<arg-type/>来指示要重写的方法的方法参数类型。只有当该方法重载且多个类型存在于类中时,参数的类型才是必需的。为了方便起见,参数的类型字符串可以是完全限定类型名的子字符串。例如,以下所有内容都匹配java.lang.String:
java.lang.StringStringStr
因为参数的数量通可以区分每个可能的情况,所以简化方式可以节省大量的输入,只允许键入与参数类型匹配的最短字符串。
到此,相信大家对“Sping中lookup-method注入的方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。