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>
本文深入探讨了Spring容器在动态代理模式中的应用,通过具体的代码示例展示了如何使用ASM、CGLIB和Spring3.0COREJAR实现对象方法的替换,包括设置对象方法、替换对象方法以及返回值的修改。

3411

被折叠的 条评论
为什么被折叠?



