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