Spring笔记(2)

Spring笔记(2)

一、AOP简介

1.概念:

  • 面向切面编程(Aspect-Oriented Programming),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。

  • AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现。

2.作用

在程序运行期间,在不修改源码的情况下对方法进行功能的增强

  • 日志记录,性能统计,安全控制,事务处理,异常处理等等wn及扩展

3.底层实现

AOP的动态代理技术

JDK代理

基于接口的动态代理技术

image-20210318161029482

cglib代理

基于父类动态代理技术

image-20210318161056876

4.知识要点

aop:面向切面编程

aop底层实现:基于jdk的动态代理和基于cglib的动态代理

aop的重点概念:

  • ​ Pointcut(切入点):被增强的方法
  • ​ Adivce(通知/增强):封装增强业务逻辑的方法
  • ​ Aspect(切面):切点+通知
  • ​ Weaving(织入):将切点与通知结合的过程

二、基于XML的AOP开发

1.快速入门

步骤

  1. 添加坐标,spring-context 和 aop

    <!--    spring-context-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>5.0.5.RELEASE</version>
        </dependency>
    <!--    aop-->
        <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
          <version>1.8.13</version>
        </dependency>
      </dependencies>
    
  2. 创建目标接口并实现目标接口(连接点,切入点)

    //接口类
    public interface TargetInterface {
        public void save();
    }
    
    //实现类
     @Override
        public void save() {
            System.out.println("saving..");
        }
    
  3. 创建切面类(内写增强方法)

    //切面类
    public class MyAspect {
        public void before(){
            System.out.println("前置增强。。。");
        }
    }
    
  4. 创建applicationContext.xml文件,并将目标对象切面类注入

    <!--    目标对象-->
        <bean id="target" class="AopLearn.Target"></bean>
    
    
    <!--    切面对象-->
        <bean id="myAspect" class="AopLearn.MyAspect"></bean>
    
  5. 引入aop命名空间

    xmlns:aop="http://www.springframework.org/schema/aop"
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    
  6. 配置织入,告诉spring框架,哪些方法(切点)需要进行那些增强(前置、后置)

        <aop:config>
    <!--        声明切面-->
            <aop:aspect ref="myAspect">
    <!--            声明切点和通知-->
                <aop:before method="before" pointcut="execution(public void AopLearn.Target.save())">
            </aop:aspect>
        </aop:config>
    

2.切点表达式

表达式语法:

​ execution([修饰符] 返回值类型 包名.类名.方法名(参数))

注:

  • 返回值类型、包名、类名、方法名可以使用星号*代表任意
  • 访问修饰符可以省略
  • 包名与类名之间一个点.代表当前包下的类,两个点表示当前包及其子包下的类
  • 参数列表可以使用两个点…示任意个数,任意类型的参数列表

常用:

excution( com itheima.app. .* (..));**

​ 任意返回值 it黑马aop包下的 任意类的 任意方法

抽取(易于维护 ):

<!--            抽取切点表达式-->
            <aop:pointcut id="myPointcut" expression="execution(* AopLearn.*.*(..))"/>
<!--            使用抽取的切点表达式-->
            <aop:before method="before" pointcut-ref="myPointcut"/>

3.通知的类型

  • 前置通知:调用目标组件前,调用方面组件(before)

  • <aop:before method="before" pointcut="execution(public void AopLearn.Target.save())"></aop:before>
    
  • 后置通知:调用目标组件后,调用方面组件(after-returning)

  • 最终通知:调用目标组件后,在finally里调用方面组件(after)

  • 异常通知:目标组件发生异常时,调用方面组件。(after-throwing)

  • 环绕通知:调用目标组件前、后,分别调用一次方面组件。(around)

三、基于注解的AOP开发

1.快速入门

  1. 创建目标接口目标类

  2. 创建切面类

  3. 将目标类和切面类的创建权交给Spring管理,并设置切面类标识。 (生成bean

    
    //实现bean的注入
    @Component("target")
    public class Target implements TargetInterface {
        @Override
        public void save() {
            System.out.println("saving..");
        }
    }
    
    //实现bean的注入
    @Component("myAspect")
    //配置为切面类
    @Aspect
    public class MyAspect {
        //注解配置织入关系
        @Before("execution(* Annotation.*.*(..))")
        public void before(){
            System.out.println("anno前置增强。。。");
        }
    }
    
  4. 在切面类中使用注解配置织入关系

    public class MyAspect {
        //注解配置织入关系
        @Before("execution(* Annotation.*.*(..))")
        public void before(){
            System.out.println("anno前置增强。。。");
        }
    }
    
  5. 创建context命名空间

  6. 在配置文件中开启组件扫描AOP的自动代理

    <!--        开启组件扫描-->
            <context:component-scan base-package="Annotation"/>
    <!--    aop自动代理-->
            <aop:aspectj-autoproxy/>
    
  7. 测试

    @Test
    public void test02(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext-anno.xml");
        TargetInterface target = app.getBean(TargetInterface.class);
        target.save();
    }
    

2.切点表达式

抽取

/**
 * 定义切点表达式
 */
@Pointcut("execution(* Annotation.*.*(..))")
public void pointcut(){}

配置织入关系

@Before("pointcut()")
public void before(){
    System.out.println("anno前置增强。。。");
}

3.通知的类型

  • @Before — 前置通知

  • @AfterReturning — 后置通知

  • @Around — 环绕通知(目标对象默认不执行,需要手动执行)

  • @After — 最终通知

  • @AfterThrowing — 异常抛出通知

4.注意

使用@Aspect标注切面类

一定配置aop自动代理

<!--    aop自动代理-->
        <aop:aspectj-autoproxy/>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115201.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 用C语言实现快速排序算法「建议收藏」

    用C语言实现快速排序算法「建议收藏」一、快速排序算法(Quicksort)1.定义快速排序由C.A.R.Hoare在1962年提出。快速排序是对冒泡排序的一种改进,采用了一种分治的策略。2.基本思想通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。3….

    2022年6月25日
    35
  • elasticSearch字段类型大全

    elasticSearch字段类型大全ES字段类型核心数据类型String类型:text、keyworknumber类型:long,integer,short,byte,double,float,half_float,scaled_floatdate类型:dateboolean类型:booleanbinary类型:binaryrange类型:integer_range,float_range,long_range,double_range,date_range复杂数据类型对象数据类型:object用

    2022年5月22日
    42
  • pycharm删除所有注释_pycharm怎么取消注释

    pycharm删除所有注释_pycharm怎么取消注释1Pycharm去掉项目所有#注释通过快捷键ctrl+shift+R进入项目全局替换窗口,点击右上角勾选正则,然后搜索框输入(#.*)即可,然后点击replaceall去掉所有注释2去掉单个文件注释ctrl+f

    2022年8月26日
    6
  • Stairway to SQLCLR Level 5: Development (Using .NET within SQL Server)

    Stairway to SQLCLR Level 5: Development (Using .NET within SQL Server)原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/119429/BySolomonRutzky,2015/03/11TheSeriesThisarticleispartoftheStairwaySeries:StairwaytoSQLCLRThepossibil

    2022年7月20日
    12
  • SQL Where 字符串拼接「建议收藏」

    SQL Where 字符串拼接「建议收藏」declare@svarchar(100)set@s=’1,2,3′–法一:select*fromtbwherecharindex(‘,’+ltrim(id)+’,’,’,’+@s+’,’)>0–法二:exec(‘select*fromtbwhereidin(‘+@s+’)’)转载于:https://www.cnblo…

    2022年6月20日
    90
  • BUAA_OO_Unit4 & 学期 总结「建议收藏」

    BUAA_OO_Unit4 & 学期 总结「建议收藏」BUAA_OO_Unit4 & 学期 总结

    2022年4月22日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号