ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2019.7.11

2019-07-23 19:35:57  阅读:211  来源: 互联网

标签:11 zoe 配置文件 2019.7 Component AOP 注解 execution


文章目录

今日心得

参考视频链接

Spring

Spring的自动注入—2

  • 直接通过ref指向对应的id,没有使用autowired

    mark

SpringAOP

个人理解

在面向切面编程中,我觉得很重要的一点是先知道什么是OOP。以前解决问题是纵向的解决思路,整个项目写下来,会发现很多重复的代码,主要是他们具有相同的或者类似的功能。因此我们用横向的思路去解决问题,提取出他们共有的部分,换了一种变成思路。将这些提取出来的代码块,对使用中的程序员进行隐藏,帮助程序员实现他们不想关注的代码块,但是又被迫去关注的代码块。

  • 切面
  • 连接点
  • 建议
    • 前置建议:在连接点之前执行,但是不能阻止执行流程进入连接点的建议(除非抛出异常)
    • 返回建议后:区别方法之后执行和返回值之后执行
    • 抛出建议
    • 在(最终建议)之后
    • 围绕建议:最强建议类型
  • 切入点
  • 间接
  • 目标对象
  • AOP代理:XML方式或者注解方式,AOP是基于代理完成的
  • 织入

AOP基于注解方式

  • 切面切到不同的地方:@Aspect、@Component、@Before 。。。

    execution切到哪里,首先来看看目录结构:

    mark

    • 第一种情况:表示zoe包及其任意子包(无论多少层都可以),的任何类的,任何方法都可以被切到
        @Before("execution(* zoe..*.*(..))")
    

    mark

    • 第二种情况:表示zoe下的任何子包都被切到,third不是子包的子包所以没被切到

      @Before("execution(* zoe.*.*.*(..))")
      

      mark

    • 第三种情况:表示切到zoe包,但是之下的包没有

        @Before("execution(* zoe.*.*(..))")
    

    mark

  • 入参问题:JoinPoint 切点

  • @After在方法之前

  • @AfterReturning在返回值之后

    public String stat(){
            System.out.println("明星");
            return "xxx";
        }
    
    @Aspect
    @Component
    public class AfterRe {
        @AfterReturning(value = "execution(* zoe.First.stat())",returning = "returning")
        public void afterRenturn(String returning){
            System.out.println("返回值之后。。。" + returning);
        }
    }
    

    mark

    mark

  • @Afterthrowing在异常之后

  • @Around

mark

mark

注解

  • @Component(“id”):标记它为一个组件

    id一般可以不用写,默认是所标记的类的类名的第一个字母的小写—>在getBean的时候就是用这个默认id

  • controller(srpingmvc)

  • service(业务层)

  • repository(dao层)

当不确定要处理那一层的时候,才使用Component

其他tip

  1. 如何引入外部properties—>classpath引入方式

    <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
    

    mark

    官方文档

    mark

  2. 如何通过表示式引用外部properties的键值

    mark

  3. 从一个配置文件引入多个spring配置文件的问题

    当需要引用多个同前缀的配置文件时,可以采用.*

    <import resource="classpath:spring/spring-*.xml">
    

    此时,假设有3个spring配置文件,我们用另外一个主配置文件中写入以上语句,就可以引用。并且在测试文件中,扫描配置文件的时候,只扫描主配置文件,便可以调用。

    mark

  4. 扫描包问题:

    激活Component注解,扫描一个包或者子包所有(包内有包),如果发现这个包里面有@Component注解,就会被激活。

<context:component-scan base-package="zoe.xxxx某个包"/>

因此,当有扫描一个包,又不想要扫到他的子包的时候,就要用exclude

mark

  1. AOP依赖引入
<dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.8.9</version>
    </dependency>

    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.9</version>
    </dependency>

    <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib</artifactId>
      <version>3.2.2</version>
    </dependency>

  1. 当有多个@before注解的时候,要严格指定建议顺序

    采用@Order注解再类级别上

    @Order
    @Aspect
    @Component
    public ....
    
    
  2. 一个类里面不能有多个@before否则再@Order的时候还没办法判定

  3. @After和@Before使用@Order的先后参数表示的顺序是相反的。

  4. execution表达式

  • 先写访问修饰符,包名的限定,类名,方法名,参数列表+组合条件符合,同时符合两个多条或者多个条件都可以

标签:11,zoe,配置文件,2019.7,Component,AOP,注解,execution
来源: https://blog.csdn.net/qq_32703777/article/details/97023980

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有