- //-------------------------.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"
- xsi:schemaLocation="http://www.springframework.org/schema/beans spring-beans-2.0.xsd">
- <!-- 代理无非是指定接口、target、advice,在spring写好了几个模板,不需要再写,只需要培植就行了
- ProxyFactoryBean中,pointcut现在默认是接口中所有的方法
- pointcut要优化:只需要在指定的方法上执行advice
- 指定方法名 org.springframework.aop.support.NameMatchMethodPointcutAdvisor
- 匹配方法名 org.springframework.aop.support.RegexpMethodPointcutAdvisor
- ProxyFactoryBean只能在一个target上执行指定的advice与pointcut
- BeanNameAutoProxyCreator org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator
- 能将任意多个target与任何advice的任何pointcut结合起来
- -->
- <bean name="userdao" class="org.spring.aop.UserDao"></bean>
- <bean name="after" class="org.spring.aop.LogAfterAdvice" />
- <bean name="before" class="org.spring.aop.LogBeforeAdvice" />
- <bean name="beforeafter" class="org.spring.aop.LogAdvice" />
- <bean name="autoproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
- <property name="beanNames">
- <list>
- <value>*dao</value> <!-- 以dao结尾的注册bean的name -->
- </list>
- </property>
- <property name="interceptorNames">
- <list>
- <value>before</value>
- <!-- <value>regexp</value>-->
- </list>
- </property>
- </bean>
- <!-- <bean name="dynamicProxy" class="org.springframework.aop.framework.ProxyFactoryBean">-->
- <!-- <property name="proxyInterfaces">-->
- <!-- <list>-->
- <!-- <value>org.spring.aop.IDao</value>-->
- <!-- </list>-->
- <!-- </property>-->
- <!-- <property name="target" ref="userdao"></property>-->
- <!-- <property name="interceptorNames">-->
- <!-- <list>-->
- <!-- <value>regexp</value>-->
- <!-- </list>-->
- <!-- </property>-->
- <!-- </bean>-->
- <!--
- 指定的advice在指定的方法上执行 -->
- <!-- <bean name="namematch" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">-->
- <!-- <property name="advice" ref="before"></property>-->
- <!-- <property name="mappedNames">-->
- <!-- <list>-->
- <!-- <value>save</value>-->
- <!-- </list>-->
- <!-- </property>-->
- <!-- </bean>-->
- <!-- 正则表达式 -->
- <!-- <bean name="regexp" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">-->
- <!-- <property name="advice" ref="before"></property>-->
- <!-- <property name="patterns">-->
- <!-- <list>-->
- <!-- .表示任何一个字符,*表示0-多个,.*表示任何包名下的所有方法或者任何方法名 -->
- <!-- .*aop.*表示包名或方法名中有aop的 -->
- <!-- <value>.*up.*</value>-->
- <!-- </list>-->
- <!-- </property>-->
- <!-- </bean>-->
- </beans>
- ---------------------自动匹配 test ------------------------------------
- package org.spring.aop;
- import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
- import org.springframework.aop.support.NameMatchMethodPointcutAdvisor;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class TestAutoProxy {
- public static void main(String[] args) throws Exception {
- ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
- //IDao dao = (IDao)ac.getBean("autoproxy");
- IDao dao = (IDao)ac.getBean("userdao");
- dao.save(null);
- dao.update(null);
- }
- }
- -------------------- 指定方法 -----------------------------------------
- package org.spring.aop;
- import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
- import org.springframework.aop.support.NameMatchMethodPointcutAdvisor;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class TestBeanFactory {
- public static void main(String[] args) throws Exception {
- ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
- //一定要通过接口去调用,不能是UserDao
- IDao dao = (IDao)ac.getBean("dynamicProxy");
- //UserDao dao = (UserDao)ac.getBean("dynamicProxy");
- //UserDao dao = (UserDao)ac.getBean("userdao");
- dao.save(null);
- dao.update(null);
- }
- }
- ----------------------------- 日志 -----------------------------------
- package org.spring.aop;
- import java.lang.reflect.Method;
- import org.springframework.aop.AfterReturningAdvice;
- import org.springframework.aop.framework.ProxyFactoryBean;
- /**
- * 是一个advice,但使用了spring框架
- * 使用spring的aop写advice,是侵入式编程
- * 在spring中,advice根据joinpoint不同分成四类:
- * MethodBeforeAdvice 方法前调用
- * AfterReturningAdvice 方法后调用
- * MethodInterceptor 方法前后同时调用
- * ThrowsAdvice 异常处理
- *
- * joinPoint:这个advice已经指定了,是方法后
- * pointcut:没有指定
- */
- public class LogAfterAdvice implements AfterReturningAdvice{
- /**
- * arg0 返回值
- * arg1 要调用的target的pointcut这个方法对象
- * arg2 参数的值
- * arg3 target对象
- * 暴露参数的目的是让我们处理次要业务,不用反射调用Method
- */
- public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
- //arg1.invoke(arg2, arg3); //不用写,spring会去调用
- System.out.println("方法调用后开始记日志,数据为"+arg0);
- }
- }
- ------------------------ LogAdvice --------------------------------
- package org.spring.aop;
- import org.aopalliance.intercept.MethodInterceptor;
- import org.aopalliance.intercept.MethodInvocation;
- import org.springframework.aop.support.RegexpMethodPointcutAdvisor;
- public class LogAdvice implements MethodInterceptor{
- public Object invoke(MethodInvocation arg0) throws Throwable {
- //arg0.getMethod(); //到到Method对象
- //arg0.getThis(); //target对象
- //arg0.getArguments(); //参数值
- System.out.println("方法前写日志");
- Object o = arg0.proceed(); //执行方法
- System.out.println("方法后写日志");
- return o; //返回值
- }
- }
- ---------------------- IDao ------------
- package org.spring.aop;
- public interface IDao {
- public void save(Object o) throws Exception;
- public void update(Object o) throws Exception;
- }
- -------------------LogBeforeAdvice -------------------------------
- package org.spring.aop;
- import java.lang.reflect.Method;
- import org.springframework.aop.MethodBeforeAdvice;
- public class LogBeforeAdvice implements MethodBeforeAdvice{
- //arg2 target
- public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
- System.out.println("方法前写日志");
- }
- }
AOP 详细描述
最新推荐文章于 2024-07-25 16:47:20 发布