导宝
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
第一种方式
接口
publicinterfaceUserService{voidadd();voiddelete();voidupdate();voidselect();}
实现类
publicclassUserServiceImplimplementsUserService{@Overridepublicvoidadd(){System.out.println("增加一个用户");}@Overridepublicvoiddelete(){System.out.println("删除一个用户");}@Overridepublicvoidupdate(){System.out.println("修改一个用户");}@Overridepublicvoidselect(){System.out.println("查询一个用户");}}
日志插入类
publicclassAfterLogimplementsAfterReturningAdvice{@OverridepublicvoidafterReturning(Object returnValue,Method method,Object[] args,Object target)throwsThrowable{System.out.println("执行了"+ method.getName()+"方法,返回的结果为"+ returnValue);}}publicclassLogimplementsMethodBeforeAdvice{//method:执行的目标对象的方法//args: 参数//target: 目标对象@Overridepublicvoidbefore(Method method,Object[] args,Object target)throwsThrowable{System.out.println(target.getClass().getName()+"的"+method.getName()+"被执行了");}}
xml文件
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd"><beanid="userservice"class="com.gmy.service.UserServiceImpl"></bean><beanid="log"class="com.gmy.log.Log"></bean><beanid="afterlog"class="com.gmy.log.AfterLog"></bean><!-- 方式一:使用原生Spring API接口--><!-- 配置aop:需要导入aop的约束--><aop:config><!-- 切入点 expression(要执行的位置)--><aop:pointcutid="pointcut"expression="execution(* com.gmy.service.UserServiceImpl.*(..))"/><!-- 执行环绕增加--><aop:advisoradvice-ref="log"pointcut-ref="pointcut"></aop:advisor><aop:advisoradvice-ref="afterlog"pointcut-ref="pointcut"></aop:advisor></aop:config></beans>
测试类
publicclassMyTest{@Testpublicvoidtest1(){ApplicationContext context=newClassPathXmlApplicationContext("applicationContext.xml");//动态代理的是接口//UserServiceImpl user = (UserServiceImpl) context.getBean("userservice");UserService user= context.getBean(UserService.class);
user.delete();}}
方式二:
插入类
publicclassDiypoincut{publicvoidbefore(){System.out.println("插入前");}publicvoidafter(){System.out.println("插入后");}}
方式二:自定义类<beanid="diy"class="com.gmy.diy.Diypoincut"></bean><aop:config><!-- 自定义切面 ref 要引用的类--><aop:aspectref="diy"><!-- 切入点--><aop:pointcutid="point"expression="execution(* com.gmy.service.UserServiceImpl.*(..))"/><!-- 通知--><aop:beforemethod="before"pointcut-ref="point"></aop:before><aop:aftermethod="after"pointcut-ref="point"></aop:after></aop:aspect></aop:config>
方式三:
@Aspect//标注这个类是一个切面publicclassAnnotationPoinCut{@Before("execution(* com.gmy.service.UserServiceImpl.*(..))")publicvoidbefore(){System.out.println("方法执行前");}@Around("execution(* com.gmy.service.UserServiceImpl.*(..))")publicvoidaround(ProceedingJoinPoint jp)throwsThrowable{System.out.println("环绕前");//执行方法Object proceed= jp.proceed();System.out.println("环绕后");//System.out.println(proceed);//Signature signature = jp.getSignature();//获得签名//System.out.println("signature:" + signature);}}
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd"><beanid="userservice"class="com.gmy.service.UserServiceImpl"></bean><beanid="log"class="com.gmy.log.Log"></bean><beanid="afterlog"class="com.gmy.log.AfterLog"></bean><beanid="annotationpoinCut"class="com.gmy.diy.AnnotationPoinCut"></bean><!-- 注解支持--><aop:aspectj-autoproxy></aop:aspectj-autoproxy>