本篇内容主要讲解“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)中,要注入的方法需要以下形式的签名:
[abstract] theMethodName(no-arguments);
如果方法是抽象的,则动态生成的子类实现该方法。否则,动态生成的子类将重写在原来类中定义的方法。请使用以下示例:
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,类似于以下示例:
String
可以在
java.lang.StringStringStr
因为参数的数量通可以区分每个可能的情况,所以简化方式可以节省大量的输入,只允许键入与参数类型匹配的最短字符串。
到此,相信大家对“Sping中lookup-method注入的方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!