Spring AOP快速使用教程
2022/6/6 23:21:49
本文主要是介绍Spring AOP快速使用教程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Spring是方法级别的AOP框架,我们主要也是以某个类的某个方法作为连接点,用动态代理的理论来说,就是要拦截哪个方法织入对应的AOP通知。为了更方便的测试我们首先创建一个接口
public interface RoleService { public void printRole(Role role); }
然后创建一个实现类
@Component public class RoleServiceImpl implements RoleService { public void printRole(Role role) { System.out.println(role.toString()); } }
这个类没啥特别,这个时候把printRole作为AOP的连接点,那么用动态代理的语言就是要为类RoleServiceImpl生成代理对象,然后拦截printRole方法,可以用于产生各种AOP通知方法。
接着我们来进行切面的创建,他如同一个拦截器,在Spring中只要使用@Aspect注解一个类,那么Spring IOC 容器就会认为这是一个切面了。
@Aspect public class RoleAspect { //在被代理对象的方法前调用 ,使用args来传递参数 @Before("execution(* com.aop.RoleServiceImpl.printRole(..)) && args(role,sort)") public void before(Role role, int sort) { System.out.println("before..."); } //在被代理对象的方法后调用 @After("execution(* com.aop.RoleServiceImpl.printRole(..))") public void after() { System.out.println("after..."); } //在被代理对象方法正常返回后调用 @AfterReturning("execution(* com.aop.RoleServiceImpl.printRole(..))") public void afterRunning() { System.out.println("afterRunning"); } //在被代理对象方法抛出异常后使用 @AfterThrowing("execution(* com.aop.RoleServiceImpl.printRole(..))") public void afterThrowing() { System.out.println("afterThrowing"); } //将验证角色对象是否为空的类加入到切面中 //value=""表示对某类进行增强,defaultImpl表示默认的实现类 @DeclareParents(value = "com.aop.RoleServiceImpl+", defaultImpl = RoleVerifierImpl.class) public RoleVerifier roleVerifier; }
此时连接点和切面我们都创建完成了,这个时候可以编写代码来测试AOP的内容,首先要对Spring的Bean进行配置,采用注解Java配置。
@Configuration @EnableAspectJAutoProxy @ComponentScan("com") public class AppConfig { @Bean public RoleAspect getRoleAspect() { return new RoleAspect(); } }
测试AOP流程
public class Main { public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class); RoleService roleService = (RoleService) ctx.getBean(RoleService.class); //使用刚才创建的RoleVerifier来进行检测role对象是否为空 RoleVerifier verifier = (RoleVerifier) ctx.getBean(RoleVerifier.class); Role role = new Role(); role.setId(1L); role.setRoleName("张三"); role.setRoleNote("张三的备注信息"); System.out.println("##测试结果"); roleService.printRole(role); System.out.println("#####################"); //测试异常通知 role = null; roleService.printRole(role, 2); } }
##测试结果 before... Role{id=1, roleName='张三', roleNote='张三的备注信息'} 1 afterRunning after... ##################### before... afterThrowing ##异常通知 after... Exception in thread "main" java.lang.NullPointerException at com.aop.RoleServiceImpl.printRole(RoleServiceImpl.java:9) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498)
很显然切面的通知已经通过AOP织入约定的流程当中了,这时我们可以使用AOP来处理一些需要切面的场景了。
这篇关于Spring AOP快速使用教程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16ShardingSphere 如何完美驾驭分布式事务与 XA 协议?
- 2024-11-16ShardingSphere如何轻松驾驭Seata柔性分布式事务?
- 2024-11-16Maven资料入门指南
- 2024-11-16Maven资料入门教程
- 2024-11-16MyBatis Plus资料:新手入门教程与实践指南
- 2024-11-16MyBatis-Plus资料入门教程:快速上手指南
- 2024-11-16Mybatis资料入门教程:新手必看指南
- 2024-11-16MyBatis资料详解:新手入门与初级实战指南
- 2024-11-16MyBatisPlus资料:初学者入门指南与实用教程
- 2024-11-16MybatisPlus资料详解:初学者入门指南