Spring--方法注入

BtWangZhi發表於2017-10-06

1 Spring利用了CGLIB庫在執行時生成二進位制程式碼功能,通過動態建立Lookup方法bean的子類而達到複寫Lookup方法的目的。
例:
建立一個抽象類:

public abstract class CommandManager {

    public void process() {
        Command command = createCommand();
        command.sayHello();
    }

    protected abstract Command createCommand();
}

注入的方法的類,實現BeanFactoryAware介面 :

public class Command {

    public void sayHello() {
        System.out.println("hello world");
    }
}

配置檔案:

    <bean id="command" class="com.test.service.Command"/>

    <bean id="commandManager" class="com.test.service.CommandManager">
        <lookup-method name="createCommand" bean="command"/>
    </bean>

測試:

public class TextMain {
    public static void main(String[] args){
        ClassPathResource classPathResource = new ClassPathResource("beanFactoryText.xml");
        BeanFactory beanFactory=new XmlBeanFactory(classPathResource);
        CommandManager commandManager=(CommandManager)beanFactory.getBean("commandManager"); 
        commandManager.process();
    }
}

Spring通過動態建立一個CommandManager 的實現類,Commed物件動態注入抽象方法createCommand的放回值中。

2 替換方法
替換的方法:

public class TestMethodReplacer implements MethodReplacer {

    public Object reimplement(Object obj, Method method, Object[] args) throws Throwable {
        System.out.println("TestMethodReplacer-》reimplement");
        return null;
    }
}

被替換的方法:

public class UserService {
    public void sayHello() {
        System.out.println("UserService-》sayHello");
    }
}

配置:

<bean id="userService" class="com.test.service.UserService">
        <replaced-method name="sayHello" replacer="testMethodReplacer"/>
    </bean>

    <bean id="testMethodReplacer" class="com.test.service.TestMethodReplacer"/>

測試將會輸出 TestMethodReplacer-》reimplement而不是UserService-》sayHello

相關文章