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>