温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Sping中lookup-method注入的方法是什么

发布时间:2021-12-16 09:29:04 来源:亿速云 阅读:117 作者:iii 栏目:大数据

本篇内容主要讲解“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注入的方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI