2019.7.11

今日心得

参考视频链接

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表达式

  • 先写访问修饰符,包名的限定,类名,方法名,参数列表+组合条件符合,同时符合两个多条或者多个条件都可以
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值