------------恢复内容开始------------
1.AOP底层使用动态代理:他有两种情况动态代理
a:有接口情况,使用JDK动态代理
b:没有接口情况,使用CGLIB动态代理
a:有接口情况,使用JDK动态代理:他的方法是,在有接口和接口实现类的情况下,如果想要增强接口实现类里的功能,那么就创建接口实现类代理对象,通过代理对象来增强类里的方法功能
b:没有接口情况,使用CGLIB动态代理:只是基本的类和方法,使用CGLIB动态代理,创建当前类子类的代理对象
AOP(JDK动态代理):使用JDK动态代理,使用Proxy类里面的方法创建出代理对象
调用newProxyInstance()方法,方法有三个参数分别是(类加载器、增强方法所在类,这个类实现的接口,支持多个接口、实现这个接口InvocationHandle,创建代理对象,写增强的方法)
编写JDK动态代理演示:
(1)第一步创建接口(UserDao),并写上定义若干方法;
(2)创建接口实现类(UserDaoImpl),实现方法
(3)创建类(JDKProxy),并使用引用Proxy类创建接口代理对象
Class[] interface={UserDao.class}
使用Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interface,new InvocationHandle())
或者最后一个参数不用匿名对象,而是单独写一个类来实现这个接口InvocationHandle
invoke()写增强的逻辑部分
AOP操作术语:
1.连接点:类里面哪些方法可以被增强,这些方法称为连接点
2.切入点:实际被增强的方法是切入点:
3.通知(增强):实际增强的逻辑部分称为通知;
通知有多种类型:前置通知、后置通知、环绕通知、异常通知、最终通知
4.切面:是动作,把通知应用到切入点的过程
AOP操作准备:Spring框架一般基于AspectJ实现AOP操作,
实现方式:基于XML配置文件实现、基于注解方式实现(常用)
在项目工程引入AOP相关依赖,
切入点表达式:知道哪个类里面的哪个方法增强
语法结构:execution([权限修饰符][返回类型][类全路径][方法名称]([参数列表]))
举例1:对com.atguigu.dao包中BookDao类里的add方法进行增强,
execution(* com.atguigu.dao.BookDao.add(..)) //用*表示任意修饰符都可以,..表示参数
举例2:对com.atguigu.dao包中BookDao类里的所有方法进行增强,
execution(* com.atguigu.dao.BookDao.*(..)) //这里*表示所有方法
举例3:对com.atguigu.dao包中所有类,类中所有方法进行增强,
execution(* com.atguigu.dao.*.*(..))
------------恢复内容结束------------