Aop概述
面向切面编程,就是不改变源码的情况下来增强代码的功能!
Aop的专业术语
连接点:就是类中的可以增强的方法
切入点:实际增强的方法
通知(增强):实际增强的类容 前置,后置,环绕,异常,最终。
切面:把通知实际应用
Aop的底层原理(JDK的动态代理)
package com.atchengdu.Dao;public interface UserDao { public int add(int a,int b); public String updete(String id);}//接口package com.atchengdu.Dao;public class UserDaoimpl implements UserDao{ @Override public int add(int a, int b) { return a+b; } @Override public String updete(String id) { return id; }}//实现类
package com.atchengdu.Dao;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;//JDK动态代理public class Jdkproxy { public static void main(String[] args) { //创建接口的动态代理 Class[] interfaces = {UserDao.class}; UserDao userDao =(UserDao)Proxy.newProxyInstance(Jdkproxy.class.getClassLoader(), interfaces, new UserDaoimplProxy(new UserDaoimpl())); System.out.println(userDao.updete("123456")); }}class UserDaoimplProxy implements InvocationHandler{ //第一步:获取代理的对象 private Object obj; public UserDaoimplProxy(Object obj){ this.obj=obj; } //增强逻辑 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String mname=method.getName(); if("Add".equalsIgnoreCase(mname)){ //方法执行之前 System.out.println("方法"+method.getName()+"执行前"); //执行方法 Object invoke = method.invoke(obj, args); //执行方法后 System.out.println("方法"+method.getName()+"执行后"); return invoke; } if("updete".equalsIgnoreCase(mname)){ //方法执行之前 System.out.println("方法"+method.getName()+"执行前"); //执行方法 Object invoke = method.invoke(obj, args); //执行方法后 System.out.println("方法"+method.getName()+"执行后"); return invoke; } return null; }}
Aop注解方式实现
1.xml准备工作
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!--开启注解扫描--> <context:component-scan base-package="com.java.Aop"></context:component-scan> <!--开启Aspect生成代理对象--> <aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>
写增强类和被增强类
package com.java.Aop;import org.springframework.stereotype.Component;//创建类基于Aop增强方法逻辑@Componentpublic class User { public void add(){ System.out.println("add....."); }}
package com.java.Aop;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;import org.springframework.core.annotation.Order;import org.springframework.stereotype.Component;//增强user类的类@Component@Aspect //生成增强类代理对象//@Order(数字值) 如果多个类同时增强一个类 可以设置优先级public class UserProxy { //切入点抽取 @Pointcut(value ="execution(* com.java.Aop.User.add(..))") public void poincut(){ } //前置通知 @Before(value ="poincut()") public void before(){ System.out.println("before..."); } //最终通知 @After(value ="execution(* com.java.Aop.User.add(..))") public void after(){ System.out.println("after..."); } //异常通知 @AfterThrowing(value ="execution(* com.java.Aop.User.add(..))") public void AfterThrowing(){ System.out.println("AfterThrowing..."); } //后置通知 @AfterReturning(value ="execution(* com.java.Aop.User.add(..))") public void AfterReturning(){ System.out.println("AfterReturning..."); } @Around(value ="execution(* com.java.Aop.User.add(..))") public void AfterReturning(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("环绕前"); proceedingJoinPoint.proceed();//执行被增强类的方法 System.out.println("环绕后"); }}
package com.java.Aop;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Testspring { @Test public void Test1(){ ApplicationContext context=new ClassPathXmlApplicationContext("Bean.xml"); User user = context.getBean("user", User.class); user.add(); }}