装修网网站建设,途牛网站建设的特点,重庆必打卡的7个景点,新闻发布会稿件第五章 AOP概述#xff0c;底层原理#xff0c;AOP术语#xff0c;切入点表达式#xff0c;AOP操作#xff08;基于注解方式#xff0c;基于xml配置文件#xff09;
1.AOP概述#xff1a; #xff08;1#xff09;什么是AOP#xff1a; ①面向切面编程#xff08;…第五章 AOP概述底层原理AOP术语切入点表达式AOP操作基于注解方式基于xml配置文件
1.AOP概述 1什么是AOP ①面向切面编程方面利用AOP可以对业务逻辑的各个部分进行隔离从而使得业务逻辑各部分间的耦合度降低提高程序的可重用性同时提高开发的效率。 ②通俗描述不通过修改源代码方式在主干功能里面添加新功能。 2底层原理 ①AOP底层使用动态代理有两种情况动态代理。 第一种有接口情况使用jdk动态代理 创建接口实现类代理对象增强类的方法。 第二种没有接口情况使用CGLIB动态代理。 创建子类的代理对象增强类的方法。 ②AOPjdk动态代理 a.使用jdk动态代理使用Proxy类里面的方法创建代理对象。 调用newProxyInstance方法 方法有三个参数 第一个参数类加载器。 第二个参数增强方法所在类这个类实现的接口支持多个接口。 第三个参数实现这个接口InvocationHandler创建代理对象写增强的方法。 b.编写jdk动态代理代码。 第一步创建接口定义方法
public interface UserDao {public int add(int a,int b);public String update(String id);
}第二步创建接口实现类实现方法
public class UserDaoImpl implements UserDao {Overridepublic int add(int a, int b) {System.out.println(add方法执行了);return ab;}Overridepublic String update(String id) {System.out.println(update方法执行了);return id;}
}第三步使用Proxy类创建接口代理对象
public class JDKProxy {public static void main(String[] args) {//创建接口实现类代理对象Class[] interfaces{UserDao.class};UserDaoImpl userDaonew UserDaoImpl();UserDao dao (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));int result dao.add(1, 2);System.out.println(resultresult);}
}
//创建代理对象代码
class UserDaoProxy implements InvocationHandler{//把创建的是谁的代理对象把谁传递过来//有参数的构造进行传递private Object obj;public UserDaoProxy( Object obj){this.objobj;}//增强的逻辑Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//方法之前System.out.println(方法之前执行method.getName():传递参数--- Arrays.toString(args));//被增强的方法执行Object res method.invoke(obj, args);//方法之后System.out.println(在方法之后执行obj);return res;}
}3AOP术语 ①连接点类里面哪些方法可以被增强这些方法称为连接点。 ②切入点实际被真正增强的方法称为切入点。 ③通知增强实际增强的逻辑部分称为通知增强 通知有多种类型前置通知、后置通知、环绕通知、异常通知、最终通知类似于try-catch中的finally ④切面把通知应用到切入点的过程。 2.AOP操作准备工作 1在spring框架中一般基于AspectJ实现AOP操作。 AspectJ不是spring组成部分独立AOP框架一般把AspectJ和spring框架一起使用进行AOP操作。 2基于AspectJ实现AOP操作。 ①基于xml配置文件实现 ②基于注解方式实现。 3在项目中引入AOP依赖 4切入点表达式 ①切入点表达式作用知道要对哪个类里面的哪个方法进行增强。 ②语法结构
execution([权限修饰符] [返回类型] [类全路径名] [方法名称] [参数列表])
举例1对demo1.dao.BookDao类里面的add进行增强
execution(* demo1.dao.BookDao.add(..))
举例2对demo1.dao.BookDao类里面的所有方法进行增强
execution(* demo1.dao.BookDao.*(..))
举例3对demo1.dao.包里面的所有类类里面的所有方法进行增强
execution(* demo1.dao.*.*(..))3.AOP操作AspectJ 基于注解方式 1创建类在类里面定义方法
//被增强类
public class User {public void add(){System.out.println(add......);}
}2创建增强类编写增强逻辑 ①在增强类里面创建方法让不同的方法代表不同通知类型。
//增强类
public class UserProxy {//前置通知public void before(){System.out.println(before....);}
}3进行通知的配置 ①在spring配置文件中开启注解的扫描
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:aophttp://www.springframework.org/schema/aopxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd!--开启注解扫描--context:component-scan base-packageaopano/context:component-scan②使用注解创建User和UserProxy对象
Component
public class User {}
Component
public class UserProxy {}③在增强类上面添加注解Aspect
Component
Aspect
public class UserProxy {}④在spring配置文件中开启生成代理对象 !--开启Aspect生成代理对象--aop:aspectj-autoproxy/aop:aspectj-autoproxy4配置不同类型的通知 ①在增强类里面在作为通知方法上面添加通知类型注解使用切入点表达式配置
//增强类
Component
Aspect
public class UserProxy {//前置通知Before(value execution(* aopano.User.add(..)))public void before(){System.out.println(before....);}
}测试的时候执行的是被增强的方法Testpublic void testAopno(){ApplicationContext applicationContextnew ClassPathXmlApplicationContext(bean2.xml);User user applicationContext.getBean(user, User.class);user.add();}//前置通知Before(value execution(* aopano.User.add(..)))public void before(){System.out.println(before....);}//最终通知After(value execution(* aopano.User.add(..)))public void after(){System.out.println(after....);}//后置通知AfterReturning(value execution(* aopano.User.add(..)))public void afterReturning(){System.out.println(afterReturning....);}//异常通知AfterThrowing(value execution(* aopano.User.add(..)))public void afterThrowing(){System.out.println(afterThrowing....);}//环绕通知Around(value execution(* aopano.User.add(..)))public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {System.out.println(环绕之前);//被增强的方法执行proceedingJoinPoint.proceed();System.out.println(环绕之后);}5公共切入点进行抽取 //相同切入点进行抽取Pointcut(value execution(* aopano.User.add(..)))public void pointdemo(){}//前置通知Before(value pointdemo())public void before(){System.out.println(before....);}6有多个增强类对同一个方法进行增强设置增强类优先级。 在增强类的上面添加注解Order(数字类型值)数字类型值越小优先级越高。
Component
Aspect
Order(1)
public class personProxy {Before(value execution(* aopano.User.add(..)))public void afterReturning(){System.out.println(person before ....);}
}4.AOP操作AspectJ 基于xml配置文件方式了解 1创建两个类增强类和被增强类创建方法
public class Book {public void buy(){System.out.println(buy.....);}
}
public class BookProxy {public void before(){System.out.println(before....);}
}2在spring配置文件中创建两个类对象 !--创建两个类的对象--bean idbook classaopxml.Book/beanbean idbookProxy classaopxml.BookProxy/bean3在spring配置文件中配置切入点。 !--aop的增强--aop:config !--切入点--aop:pointcut idp expressionexecution(* aopxml.Book.buy(..))/!--配置切面--aop:aspect refbookProxy!--增强作用在具体的方法上--aop:before methodbefore pointcut-refp/aop:before/aop:aspect/aop:config