spring依赖注入中除了构造器注入和settings注入以外还有一种方法注入。但是这种方式不常用,我也是最近翻书才回想起有这种用法,那么顺便把代码贴上来。
package mislay;
import java.lang.reflect.Method;
import org.springframework.beans.factory.support.MethodReplacer;
public class ReplaceMethodBean implements MethodReplacer {
@Override
public Object reimplement(Object obj, Method method, Object[] args)
throws Throwable {
return "hello";
}
}
package mislay;
public class TestBean {
public String getContent() {
return "大家好";
}
}
package mislay;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
TestBean bean1 = (TestBean) context.getBean("testBean1");
System.out.println(bean1.getContent());
System.out.println(bean1.getClass());
TestBean bean2 = (TestBean) context.getBean("testBean2");
System.out.println(bean2.getContent());
System.out.println(bean2.getClass());
((AbstractApplicationContext) context).registerShutdownHook();
}
}
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="testBean1" class="mislay.TestBean"> <replaced-method name="getContent" replacer="replaceBean"/> </bean> <bean id="testBean2" class="mislay.TestBean"> <lookup-method bean="helloString" name="getContent"/> </bean> <bean id="replaceBean" class="mislay.ReplaceMethodBean"/> <bean id="helloString" class="java.lang.String"> <constructor-arg value="hello again"/> </bean> </beans>
总结下,这两种方法注入实质上都是通过CGLIB生成需要替换方法的Bean的子类来实现的。两者区别在于:
- replace method 可以替换任何方法,而lookup method不能替换没有返回值的方法,因为lookup-method这个标签需要一个bean来做为返回值
- replace method这种方式必须通过实现了MethodReplacer这个接口的Bean来做替换.而loopup-method则不需要.框架自动处理了这一部分