spring aop的使用,spring aop用法
[重点]使用面向切面编程织入需要导入一个依赖包
依赖项依赖项groupId组织。AspectJ/groupId artifactIdaspectjweaver/artifactId版本1 .9 .9 .1/版本/依赖项/依赖项方式一:使用原生Spring API接口
配置文件
?可扩展标记语言版本=1.0 编码=UTF八号?豆子xmlns= http://www。spring框架。org/schema/beans xmlns : xsi= http://www。w3。org/2001/XML架构实例 xmlns : p= http://www。spring框架。org/schema/p xmlns : c= http://www。spring框架。org/schema/c xmlns : AOP= 3http://www。弹簧框架注册bean-bean id= userService class= com。kero。服务。userserviceimpl /bean id= log class= com。kero。日志。在llog class= com后记录/bean id=。kero。日志。在日志/!-配置面向切面编程(面向方面的编程的缩写)需要导入面向切面编程(面向方面的编程的缩写)的约束- aop:config!-切入点表示表达式表情(要执行的位置)-AOP :切入点id=切入点表达式=执行(* com。kero。服务。userserviceimpl。*(.))/!-执行环绕增加-AOP :顾问建议-ref= log pointcut-ref= pointcut /AOP :顾问建议-ref= after llog pointcut-ref= pointcut //AOP :配置/bean日志
导入org。spring框架。AOP。方法先于建议;导入Java。郎。反思。方法;公共类日志实现methodbeforadvisory {//方法:要执行的目标对象的方法//objects:参数//target:目标对象@ Override public void before(Method方法,Object[] args,Object target)抛出Throwable { system。出去。println(目标。getclass().getName()的 method.getName()被执行了);} }导入org。spring框架。AOP。afterreturningadvice导入Java。郎。反思。方法;公共类后日志实现AfterReturningAdvice {//方法:要执行的目标对象的方法//objects:参数//target:目标对象//returnValue:返回值@Overri
de public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("执行了"+ method.getName() + "方法,返回结果为:"+returnValue); }}Service
import org.springframework.stereotype.Service;@Servicepublic interface UserService { public void add(); public void delete(); public void update(); public void search();}public class UserServiceImpl implements UserService{ @Override public void add() { } @Override public void delete() { } @Override public void update() { } @Override public void search() { }}
test动态代理 代理的是接口(代理模式是SpringAOP的底层)
import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //动态代理 代理的是接口 UserService userService = context.getBean("userService", UserService.class); userService.add(); }}
方式二:使用自定义类
配置文件
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c" xmlns:aop="http://www.springframework.org/schema/aop" 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--> <bean id="userService" class="com.kero.service.UserServiceImpl"/> <bean id="log" class="com.kero.log.Log"/> <bean id="afterlLog" class="com.kero.log.AfterLog"/> <bean id="diy" class="com.kero.diy.DiyPointCut"/> <aop:config><!-- 自定义切面 ref要引用的类--> <aop:aspect ref="diy"><!-- 切入点--> <aop:pointcut id="point" expression="execution(* com.kero.service.UserServiceImpl.*(..))"/><!-- 通知--> <aop:before method="before" pointcut-ref="point"/> <aop:after method="after" pointcut-ref="point"/> </aop:aspect> </aop:config></beans>
DIY类
public class DiyPointCut { public void before(){ System.out.println("````方法执行前````"); } public void after(){ System.out.println("````方法执行后````"); }}
其他的不变
方式三:使用注解实现
配置文件
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" 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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!-- 注册bean--> <bean id="userService" class="com.kero.service.UserServiceImpl"/> <bean id="log" class="com.kero.log.Log"/> <bean id="afterlLog" class="com.kero.log.AfterLog"/><!-- 开启注解支持--> <aop:aspectj-autoproxy/> <bean id="annotationPointCut" class="com.kero.diy.AnnotationPointCut"/></beans>
自定义类
import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;//使用注解方式实现AOP@Aspect//标注这个类是一个切面public class AnnotationPointCut { @Before("execution(* com.kero.service.UserServiceImpl.*(..))") public void before(){ System.out.println("````方法执行前````"); } @After("execution(* com.kero.service.UserServiceImpl.*(..))") public void after(){ System.out.println("````方法执行后````"); }}
其他不变
补充知识:execution表达式
execution表达式的详解
切入点表达式:execution(* 包名.*.*(..))
整个表达式可以分为五个部分:
1、execution(): 表达式主体。
2、第一个*号:方法返回类型, *号表示所有的类型。
3、包名:表示需要拦截的包名。
4、第二个*号:表示类名,*号表示所有的类。
5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面( )里面表示方法的参数,两个句点表示任何参数
其中除了返回类型模式、方法名模式和参数模式外,其它项都是可选的。
举例:
execution(public * *(..)) 匹配所有的public修饰符的方法
execution(* set*(..)) 匹配所有set开头的方法:
execution(* com.kero.service.UserServiceImpl.*(..))) 匹配UserServiceImpl接口/类的所有方法:
到此这篇关于Spring深入讲解实现AOP的三种方式的文章就介绍到这了,更多相关Spring AOP内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。