目录
1.XML方式AOP快速入门
1:导入AOP相关坐标
2:准备目标类,准备增强类,并配置给Spring管理
3:配置切点表达式(那些方法要被增强)
4:配置织入(切点被哪些方法增强,是前置增强还是后置增强)
2.XML方式AOP配置详解
2.1切点表达式的配置方式
切点表达式的配置语法
2.3通知的类型
AOP的配置的两种方式
1.XML方式AOP快速入门
1:导入AOP相关坐标
2:准备目标类,准备增强类,并配置给Spring管理
目标类
目标类 public class UserServiceImpl implements UserService { @Override //目标方法 public void show1() { System.out.println("show1"); } @Override public void show2() { System.out.println("show2"); } }
增强类
//增强类 切面类 public class MyAdvice { //切面方法 也叫通知 这就是需要增强的代码(通知) public void beforeAdvice() { System.out.println("before advice"); } public void afterAdvice() { System.out.println("after advice"); }
配置给Spring管理
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id="userService" class="com.hu.service.impl.UserServiceImpl"></bean> <bean id="myAdvice" class="com.hu.proxy.MyAdvice"></bean>
3:配置切点表达式(那些方法要被增强)
4:配置织入(切点被哪些方法增强,是前置增强还是后置增强)
<aop:config> <aop:pointcut id="pointcut01" expression="execution(void com.hu.service.impl.UserServiceImpl.show1())"/> <aop:aspect ref="myAdvice"> <aop:before method="beforShow" pointcut-ref="pointcut01"></aop:before> <aop:after-returning method="afterShow" pointcut-ref="pointcut01"></aop:after-returning> <aop:before method="beforShow" pointcut="execution(void com.hu.service.impl.UserServiceImpl.show2())"></aop:before> <aop:after-returning method="afterShow" pointcut="execution(void com.hu.service.impl.UserServiceImpl.show2())"></aop:after-returning> </aop:aspect> </aop:config> <!--忽略默认的jdk动态代理 --> <aop:aspectj-autoproxy proxy-target-class="true"/>
<aop:aspectj-autoproxy proxy-target-class="true"/> 开启自动代理之后,凡事带有@Aspect注解的bean都会生成代理对象。
proxy-target-class="true" 表示采用cglib动态代理。
proxy-target-class="false" 表示采用jdk动态代理。默认值是false。即使写成false,当没有接口的时候,也会自动选择cglib生成代理类
2.XML方式AOP配置详解
2.1切点表达式的配置方式
细节1:可以把切面表达式直接写入
<aop:after method="afterAdvice" pointcut="execution(void com.rocky.service.Impl.UserServiceImpl.show2())"></aop:after>
切点表达式的配置语法
切点表达式是配置要对哪些连接点(哪些类的哪些方法)进行通知的增强,语法如下:
execution([访问修饰符] 返回值类型 包名.类名.方法名(参数))
访问修饰符可以省略不写;
返回值类型,某一级包名,类名,方法名 可以使用*表示任意;
包名与类名之间使用单点
.
表示该包下的类,使用双点..
表示该包及其子包下的类;参数列表可以使用两个点
..
表示任意参数<aop:pointcut id="pointcut01" expression="execution(void com.rocky.service..UserServiceImpl.show1())"/>
切点表达式举几个大家容易理解的例子
//表示访问修饰符为public、无返回值、在com.rocky.aop包下的TargetImpl类的无参方法show execution(public void com.rocky.aop.TargetImpl.show()) //表述com.rocky.aop包下的TargetImpl类的任意方法 execution(* com.rocky.aop.TargetImpl.*(..)) //表示com.rocky.aop包下的任意类的任意方法 execution(* com.rocky.aop.*.*(..)) //表示com.rocky.aop包及其子包下的任意类的任意方法 execution(* com.rocky.aop..*.*(..)) //表示任意包中的任意类的任意方法 execution(* *..*.*(..))
-
2.3通知的类型
-
AOP的配置的两种方式