Spring完成动态的代理模式:
步骤如下:
1. 写接口类:
public interface Subject {
public void request();
}
2. 写实现接口的真实主题类:
public class RealSubject implements Subject {
public void request() {
System.out.println("真实的主题的实现的方法");
}
}
3. 再写一个类ProxySubjectBeforeAdvice实现MethodBeforeAdvice接口完成代理方法之前完成的任务:
public class ProxySubjectBeforeAdvice implements MethodBeforeAdvice {
public void before(Method arg0, Object[] arg1, Object arg2)
throws Throwable {
System.out.println("代理之前的任务~~~~~");
}
}
4. 写一个ProxySubjectAfterAdvice类实现AfterReturningAdvice接口完成代理之后完成的任务:
public class ProxySubjectAfterAdvice implements AfterReturningAdvice {
public void afterReturning(Object arg0, Method arg1, Object[] arg2,
Object arg3) throws Throwable {
System.out.println("在代理之后完成的任务~~");
}
}
5.在Spring提供的配置文件applicationContext.xml中进行配置如下:
<!-- 表示实现代理之前的方法的类的实例 -->
<bean id="before"
class="org.sqs.spring.aop.demo02.ProxySubjectBeforeAdvice">
</bean>
<!-- 表示实现代理之后的方法的类的实例 -->
<bean id="after" class="org.sqs.spring.aop.demo02.ProxySubjectAfterAdvice"></bean>
<!--定义一个真实主题类的对象 -->
<bean id="subject" class="org.sqs.spring.aop.demo02.RealSubject"></bean>
<!-- 写出Spring中提供的代理类的Bean(一定要注意找准Spring中的那个ProxyFactoryBean类) -->
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 说明代理的接口是谁 -->
<property name="proxyInterfaces">
<!-- 值表示那个真实的类实现的接口Subject -- <value>org.sqs.spring.aop.demo02.Subject</value>
</property>
<!-- 加入一个目标属性表示所代理的真实类-->
<property name="target">
<!-- 参考subject(真实的主题类的实例) -->
<ref bean="subject"/>
</property>
<!-- 写入拦截器属性 -->
<property name="interceptorNames">
<!-- 注入拦截器的集合 -->
<list>
<!-- 表示调用刚才定义的ProxySubjectBeforeAdvice的实例中的before()方法 -->
<!-- value中间的before其实是刚才ProxySubjectBeforeAdvice的Bean的id-->
<value>before</value>
<!-- 加入代理之后完成任务的拦截器 -->
<value>after</value>
</list>
</property>
</bean>
6.编写测试类:
public class TestDemo {
public static void main(String args[]){
ApplicationContext context = null;
context = new ClassPathXmlApplicationContext("applicationContext.xml");
//得到代理类的Bean(是Spring中提供的(已经在配置文件中实现了Subject接口))
Subject sub = (Subject) context.getBean("proxy");
sub.request();//实现真实的方法(同时代理也完成了!)
}
}
最后打印的结果是:
代理之前的任务~~~~~
真实的主题的实现的方法
在代理之后完成的任务~
|
|