Spring特殊注入lookup-method、replaced-method

1、lookup-method注入

lookup method注入是spring动态改变bean里方法的实现。方法执行返回的对象,使用spring内原有的这类对象替换,通过改变方法返回值来动态改变方法。内部实现为使用cglib方法,重新生成子类,重写配置的方法和返回对象,达到动态改变的效果。 

 
     实例如下:
复制代码
package fiona.apple;
 
// no more Spring imports!
 
public abstract class CommandManager { public Object process(Object commandState) { // grab a new instance of the appropriate Command interface Command command = createCommand(); // set the state on the (hopefully brand new) Command instance  command.setState(commandState); return command.execute(); } // okay... but where is the implementation of this method? protected abstract Command createCommand(); }
复制代码

 

配置:
复制代码
class="fiona.apple.AsyncCommand" scope="prototype">

 
class="fiona.apple.CommandManager">
    
复制代码

 

注意:由于采用cglib生成之类的方式,所以需要用来动态注入的类,不能是final修饰的;需要动态注入的方法,也不能是final修饰的。
 
同时,还得注意command的scope的配置,如果scope配置为singleton,则每次调用方法createCommand,返回的对象都是相同的;如果scope配置为prototype,则每次调用,返回都不同。
 
 
2、replaced-method注入
     replaced method注入是spring动态改变bean里方法的实现。需要改变的方法,使用spring内原有其他类(需要继承接口org.springframework.beans.factory.support.MethodReplacer)的逻辑,替换这个方法。通过改变方法执行逻辑来动态改变方法。内部实现为使用cglib方法,重新生成子类,重写配置的方法和返回对象,达到动态改变的效果。
 
     实例如下:
复制代码
public class MyValueCalculator {
 
    public String computeValue(String input) {
        // some real code...  } // some other methods...  } /** * meant to be used to override the existing computeValue(String) * implementation in MyValueCalculator */ public class ReplacementComputeValue implements MethodReplacer { public Object reimplement(Object o, Method m, Object[] args) throws Throwable { // get the input value, work with it, and return a computed result String input = (String) args[0]; ... return ...; } }
复制代码
 
配置:
复制代码
class="x.y.z.MyValueCalculator">
    
    
        String
    

 
class="a.b.c.ReplacementComputeValue"/>
复制代码

 

 
注意:由于采用cglib生成之类的方式,所以需要用来动态注入的类,不能是final修饰的;需要动态注入的方法,也不能是final修饰的。
 

转载于:https://www.cnblogs.com/atwanli/articles/6154920.html

你可能感兴趣的:(Spring特殊注入lookup-method、replaced-method)