浅谈Spring6之AOP(注解)实现

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

Spring对AOP的实现,3种方式
1、Spring框架结合AspectJ框架实现的AOP,基于注解方式。(重点)
2、Spring框架结合AspectJ框架实现的AOP,基于xml方式。
3、Spring框架自己实现的AOP,基于xml方式。
实际开发中都是Spring+ AspectJ来实现AOP
AspectJ(1998年)是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。

通知(增强代码)类型
前置通知:@Before()目标方法执行之前
后置通知:AfterReturning()目标方法执行之后
环绕通知:@Around() 目标方法执行之前通知,同时目标方法执行之后通知
异常通知:AfterThrowing() 发生异常之后执行的通知
最终通知:@After()   放在finall语句中的通知

注解切点表达式

@Before("execution(* com.service.UserService.*(..))")

切面=通知(增强)+切点(目标方法)
通知(Advice以方法的形式出现)
前置通知
@Before(切点表达式)注解-@Before("execution(修饰符 返回值类型 全限定名称 方法名(形式参数类型))"),
4个权限都包括    返回值类型任何 .*任何方法 (..)参数类型和个数随意的方法
@Before("execution(* com.service.UserService.*(..))")
多个目标类 ..两个点表示当前包以及子包下的所有类 ..*所有类所有方法

Spring-AOP实现基于注解

所需依赖

Spring context依赖
spring-aspects依赖

Spring+ AspectJ引入依赖

pom.xml配置
<repositories>
    <!-- Spring6 -->
    <repository>
        <id>repository.spring.milestone</id>
<name>Spring Milestone Repository</name>
        <url>https://repo.spring.io/milestone</url>
    </repository>
</repositories>

<dependencies>
    <!--        Spring context依赖-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>6.0.0-M2</version>
    </dependency>
    <!--        spring-aspects-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>6.0.0-M2</version>
    </dependency>
    <!--junit依赖-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>
springConfig.xml配置

xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

<!--扫描-->
    <context:component-scan base-package="com.qgs.service"/>
    <!--开启aspectj自动代理     spring容器扫描类的时候 ,查看是否有@Aspect注解,如有会生成代理对象-->
    <!--    proxy-target-class="true" 表示强制使用CGLIB动态代理-->
    <aop:aspectj-autoproxy proxy-target-class="true"/>

前置通知(增强)与后置通知(增强)

目标类

@Service
public class UserTest {//目标类

    public void login() {//目标方法
        System.out.println("用户正在登陆!");
    }

}
切面

@Component
@Aspect
public class AspectDemo {
    Long start,end;
    //切面=通知(增强)+切点(目标方法)
    //通知(Advice以方法的形式出现)
    // 前置通知
    //@Before(切点表达式)注解-@Before("execution(修饰符 返回值类型 全限定名称 方法名(形式参数类型))"),
    @Before("execution(* com.qgs.service.UserTest.*(..))")
    public void addpower(){
        start = System.currentTimeMillis();
        System.out.println("前置增强");
    }
    @After("execution(* com.qgs.service.UserTest.*(..))")
    public void addpower2(){
        end = System.currentTimeMillis();
        System.out.println("后置增强 此方法消耗了:"+(end-start)+" 毫秒");
    }
}
测试类

public class aopTest {
    @Test
    public void  strengthen() {
        ApplicationContext applicationContext =new ClassPathXmlApplicationContext("springConfig.xml");
        UserTest u = applicationContext.getBean("userTest", UserTest.class);
        u.login();
    }
}

环绕通知(增强)

切面

//环绕通知
                                //表示service包下所有的类
@Around("execution(* com.qgs.service..*(..))")
public void aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
    //前面代码
    System.out.println("前环绕");
    //执行目标
    joinPoint.proceed();
    //后面代码
    System.out.println("后环绕");
}

测试类

public class aopTest {
    @Test
    public void  strengthen() {
        ApplicationContext applicationContext =new ClassPathXmlApplicationContext("springConfig.xml");
        UserTest u = applicationContext.getBean("userTest", UserTest.class);
        u.login();
    }
}

异常通知(增强)+最终通知(通知)

目标类

@Service
public class UserTest {//目标类
    public void login() {//目标方法
        System.out.println("用户正在登陆!");
        if(66==66){
            throw new RuntimeException("运行异常");
        }
    }

}

切面=切点+通知

切面

//异常通知
@AfterThrowing("execution(* com.qgs.service..*(..))")
public void AfterThrowingAdvice(){
    System.out.println("异常通知");
}

//最终通知
@After("execution(* com.qgs.service..*(..))")
public void afterAdvice(){
    System.out.println("最终通知");
}

@Test

    public void testBeanComponent(){

        ApplicationContext applicationContext =new ClassPathXmlApplicationContext("SpringConfig.xml");

        UserTest u = applicationContext.getBean("UserTest", UserTest.class);

        u.login();

    }

Spring_IoC注解多个包扫描问题

<!--    多个包扫描-->

<!--    第一种方式:多个包用逗号隔开-->

    <context:component-scan base-package="com.bean,com.bean2" />

<!--    第二种方式:指定多个包的父包,需要牺牲部分效率-->

    <context:component-scan base-package="com"/>

如有错误请指正,谢谢

QGS-CD
关注 关注
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
浅谈SpringAop动态代理
asdsa_df的博客
04-11 1028
Spring中,自定义生成动态代理的方式主要涉及两个方面:选择代理接口: 当使用JDK动态代理时,需要确保业务实现了一个或多个接口,因为JDK动态代理是基于接口进行代理的。如果业务没有实现任何接口,那么Spring会使用CGLib动态代理作为默认的代理方式。配置AOP代理细节: 通过Spring的配置(XML或注解),可以指定如何创建代理对象。这些配置包括切面(Aspect)、切点(Pointcut)和通知(Advice)。
浅谈自己对于spring aop的理解
荣兄2016的博客
07-28 1748
开始学习spring就被重点的关注ioc和aop这两个关键的部分,今天着重了解下关于aop的一些实现和原理。 aop 面向切面编程 即可以在业务逻辑前后加上需要的无关业务的处理如日志,权限控制等操作,与实际的业务相分离。 首先需要介绍的技术就是AspectJ 了解了这个之后会对springaop实现有对比显示出两者的差异。aspectJ是一个由java实现aop框架,通过对编译期的代码进行...
Spring实现AOP的4种方式
10-25
Spring实现AOP有很多方式,这里总结了四种,有基于代理的实现方式,也有基于AspectJ 的注解方式,还有基于AOP标签的配置
Spring(六)- 基于注解AOP 开发
yirenyuan的博客
10-09 81
1. 快速入门 基于直接的AOP 开发步骤: (1)创建目标接口和目标(内部有切点) (2)创建切面(内部有增强方法) (3)将目标和切面的对象创建权交给Spring (4)在切面中使用注解配置织入关系 (5)在配置文件中开启组件扫描和AOP 的自动代理 (6)测试 (4)在切面中使用注解配置织入关系 @Component @Aspect public class MyAspect { @Before("execution(* com.it.*.*(..)).
Spring AOP的三种实现方式
yu8196378的博客
12-21 5922
原文地址:http://blog.csdn.net/udbnny/article/details/5870076 三种方式分别为: 经典的基于代理的AOP @AspectJ注解的切面 纯POJO切面 方式一:经典的基于代理的AOP 需要如下步骤: 1.创建通知:实现这几个接口,把其中的方法实现了 2.定义切点和通知者:在Spring配制文件中配置这些信息
spring源码分析之AOP开启注解
Lxn2zh的博客
10-06 697
在获取bean的时候会创建bean,但是不要忘了该实现了一个BeanFactoryAware接口,在创建bean之后会进行初始化,也就会执行org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods方法。即进行自定义标签的解析,会去META-INF/spring.handlers中寻找对应的handler,该标签的namespace是。
Spring实现AOP之四种方式详解
LittleByte1的博客
06-22 3068
AOP:Aspect Oriented Programming 面向切面编程 在不改变业务方法的同时可以对方法进行功能增强,Spring的两大特色IOC(Inversion of Controler控制反转)和AOP之一. Spring中提供了四种实现AOP的方式:实现Spring提供的AOP接口   1.使用JDK提供的代理方式(又分为静态和动态)   2.使用原生Spring API接口   3.使用Spring纯配置实现   4.使用Spring注解 一.使用JDK提供的代理方式(此种方式不依赖于Sp
浅谈SpringBoot集成Redis实现缓存处理(Spring AOP实现)
08-28
SpringBoot集成Redis实现缓存处理(Spring AOP实现) 本文主要介绍了如何使用SpringBoot框架集成Redis实现缓存处理,通过Spring AOP(面向切面编程)实现缓存处理。下面是相关知识点的总结: 一、需求分析 在开源...
浅谈SpringCache与redis集成实现缓存解决方案
08-28
"浅谈SpringCache与redis集成实现缓存解决方案" SpringCache是Spring Framework中的一种缓存机制,可以与Redis集成实现缓存解决方案。Redis是一种key-value型数据库,具有高性能、低延迟的特点,广泛应用于缓存...
浅谈Spring的两种事务定义方式
08-29
浅谈Spring的两种事务定义方式 Spring框架提供了两种事务定义方式:声明式和注解式。下面我们将深入探讨这两种方式的实现和应用。 声明式事务 声明式事务是通过在XML文件中定义需要拦截方法的匹配来完成配置的。...
Spring AOP的五种通知方式代码实例
08-25
主要介绍了Spring AOP的五种通知方式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
spring-aspects.jar
08-12
spring-aspects.jar spring-aspect.jar
spring-aspects-4.1.4.RELEASE
12-06
spring-aspects-4.1.4.RELEASEspring-aspects-4.1.4.RELEASEspring-aspects-4.1.4.RELEASE
spring-aspects
04-12
spring-aspects-4.2.0.RELEASE.jar包
Spring AOP需要的jar包(注解).rar
06-29
aspectjweaver-1.9.5.jar com.springsource.org.aopalliance-1.0.0.jar commons-logging-1.1.1.jar log4j-1.2.17.jar spring-aop-4.0.0.RELEASE.jar spring-aspects-4.0.0.RELEASE.jar spring-beans-4.0.0.RELEASE.jar spring-context-4.0.0.RELEASE.jar spring-core-4.0.0.RELEASE.jar spring-expression-4.0.0.RELEASE.jar
Spring AOP 注解配置
qq_45935397的博客
02-19 757
1.添加依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.s
spring源码项目使用spring-aspects
gsy159369的博客
03-20 6765
** spring源码项目使用spring-aspects ** 1.spring源码编译好了,需要在spring下自己建个模块来验证是否可用 建好的模块 2.导入spring-aspects 我们先看看导入spring-aspects 这个包,然后编写切面代码,测试会报错,原因是spring-aspects模块依赖了aspectJ 3.下载AspectJ编译器 去AspectJ官网下载AspectJ编译器,下载aspectj1.9.5的。 链接地址: https://www.eclipse.o
Spring事务和Aspects框架管理事务,看这篇就够了!(简单易懂!)
TheWayForDream
10-06 3669
数据库事务概念详解和Spring管理事务的用法一.事务的介绍1.1什么是事务1.2事务的四大特性二.事务的隔离级别以及导致的问题介绍2.1隔离级别介绍2.2导致的问题介绍2.2.1脏读2.2.2不可重复读2.2.3幻读2.2.4串行话读三.事务的传播行为三Spring管理事务3.1使用Spring的事务注解管理事务(掌握)3.1.1Spring的事务注解管理事务的特点3.1.2实现步骤3.2使用AspectJ的AOP配置管理事务(掌握)3.2.1AspectJ的AOP配置管理事务的特点3.1.2实现步骤四.
spring切面aspects使用
最新发布
qq_27080351的博客
08-14 1493
AOP切面使用
写文章

热门文章

  • 如何参加活动拿到华为实践证书?一起来吧~ 21351
  • (linux-x86-arm)银河麒麟V10安装ToDesk远程控制 12307
  • (linux-x86)Centos8 zabbix6.0-安装部署 6600
  • (linux-x86-ARM)麒麟V10安装DBeaver21.3通用的数据库管理工具和 SQL 客户端 5964
  • DBeaver21.3连接数据库(mariaDB,Oracle11g,mysql,postgres,神通数据库ShenTong—OSCAR,达梦数据库dm8) 5025

分类专栏

  • kafka 1篇
  • 数据库 14篇
  • MQ 3篇
  • java 32篇
  • Vue 1篇
  • OpenTiny 1篇
  • Spring6 3篇
  • Servlet 4篇
  • Spring 5篇
  • zabbix 23篇
  • 开源 31篇
  • 国产 11篇

最新评论

  • 手拉手spring-boot-starter-mail实现发送QQ邮箱

    QGS-CD: 可根据自己的需求更改

  • 手拉手spring-boot-starter-mail实现发送QQ邮箱

    Xi_Chen123: 既然是工具类,sendText和sendTexts是不是要设置成static呀?不然调用得重新new没有意义还有开销。那这个该怎么解决呀?

  • 手拉手整合Springboot3+RocketMQ2.3

    W-同学: 2.3.0版本DefaultRocketMQListenerContainer源码都有报错。initRocketMQPushConsumer方法,MessageModel这个类不存在。。。 [code=java] switch (messageModel) { case BROADCASTING: consumer.setMessageModel(org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel.BROADCASTING); break; case CLUSTERING: consumer.setMessageModel(org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel.CLUSTERING); break; default: throw new IllegalArgumentException("Property 'messageModel' was wrong."); } [/code]

  • 手拉手springboot整合kafka

    普通网友: 支持一下,细节很到位!【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • 手拉手springboot整合kafka

    普通网友: 优质好文,博主的文章细节很到位,兼顾实用性和可操作性,感谢博主的分享,文章思路清晰【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

最新文章

  • 入门Ansible常用模块
  • Centos7安装自动化运维Ansible
  • 手拉手springboot整合kafka发送消息
2024年31篇
2023年85篇
2022年28篇
2021年18篇
2020年1篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QGS-CD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司北京网站优化托管宣城企业网站排名优化哪家有名网站seo优化方案如何写贵州网站优化在线咨询合肥市seo网站优化在线网站优化服务如何襄阳网站seo优化开发seo网站优化费用优化排名网站长云速捷真诚网站排版优化新沂盐城网站优化企业如何辨别优化过的网站网站结构优化日照专业网站优化哪家好百度企业网站优化模拟浏览器点击优化网站排名优化公司网站出色火4星完美成都优化网站清远百度网络推广网站优化排名试述怎么做好网站搜索引擎优化无锡网站优化网络推广肝病医院网站优化公司山东网站优化地址鞍山网站搜索引擎优化网站建设优化方案金寨县网站seo优化排名保定整站网站优化多少钱巩义网站优化公司亦庄网站关键词排名优化临汾百度网站优化歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化