Spring之替换Bean的返回结果,替换Bean的方法实例
Spring是一个非常强悍的框架+容器,其中有代理模式(动态代理模式)的极致体现。下面是两个比较让人感觉精彩的代码使用,重点关注main方法中的ClassPathXMlApplicationContext对象的实例化代码,替换对象方法的代码以及替换对象方法返回值的代码。具体的支持类有ASM、CGLIB、以及Spring3.0 CORE JAR.
代码如下:
MainMethod.java
import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainMethod { private static StudentBiz studentBiz; public void setStudentBiz(StudentBiz studentBiz) { MainMethod.studentBiz = studentBiz; } public static void main(String[] args) { new ClassPathXmlApplicationContext("applicationContext.xml"); System.out.println(studentBiz.getStudent().getName()); studentBiz.printMsg(); } }
SbMethodReplacer.java
import java.lang.reflect.Method; import org.springframework.beans.factory.support.MethodReplacer; public class SbMethodReplacer implements MethodReplacer{ @Override public Object reimplement(Object obj, Method method, Object[] args) throws Throwable { System.out.println("Hi world!!"); return null; } }
Student.java
public class Student { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
StudentBiz.java
public interface StudentBiz { public Student getStudent(); public void printMsg(); }
StudentBizImpl.java
public class StudentBizImpl implements StudentBiz { @Override public Student getStudent() { return null; } @Override public void printMsg() { System.out.println("hello world!!"); } }
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean name="sbMethodReplacer" class="SbMethodReplacer"/> <bean name="student" class ="Student"> <property name="name"><value>anyone</value></property> </bean> <bean name="studentbiz" class="StudentBizImpl"> <lookup-method name="getStudent" bean="student"/> <replaced-method name="printMsg" replacer="sbMethodReplacer"/> </bean> <bean name="mainM" class="MainMethod"> <property name="studentBiz" ref="studentbiz"/> </bean> </beans>