前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring AOP快速使用教程

Spring AOP快速使用教程

作者头像
用户7353950
发布2022-06-23 16:25:18
1300
发布2022-06-23 16:25:18
举报
文章被收录于专栏:IT技术订阅IT技术订阅

Spring是方法级别的AOP框架,我们主要也是以某个类的某个方法作为连接点,用动态代理的理论来说,就是要拦截哪个方法织入对应的AOP通知。为了更方便的测试我们首先创建一个接口

代码语言:javascript
复制
public interface RoleService {    public void printRole(Role role);
}

然后创建一个实现类

代码语言:javascript
复制
@Componentpublic class RoleServiceImpl implements RoleService {    public void printRole(Role role) {
        System.out.println(role.toString());
    }
}

这个类没啥特别,这个时候把printRole作为AOP的连接点,那么用动态代理的语言就是要为类RoleServiceImpl生成代理对象,然后拦截printRole方法,可以用于产生各种AOP通知方法。

接着我们来进行切面的创建,他如同一个拦截器,在Spring中只要使用@Aspect注解一个类,那么Spring IOC 容器就会认为这是一个切面了。

代码语言:javascript
复制
@Aspectpublic 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配置。

代码语言:javascript
复制
@Configuration@EnableAspectJAutoProxy@ComponentScan("com")public class AppConfig {    @Bean
    public RoleAspect getRoleAspect() {        return new RoleAspect();
    }
}

测试AOP流程

代码语言:javascript
复制
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, );
    }
}
代码语言:javascript
复制
##测试结果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来处理一些需要切面的场景了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT技术订阅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档