zoukankan      html  css  js  c++  java
  • AOP

    原理

    cglib

    JDK Proxy实现。

    Spring-AOP 简介

    @see: https://www.baeldung.com/spring-aop

    AspectJ 简介

    @see: https://www.baeldung.com/aspectj

    maven 依赖

        implementation 'org.springframework:spring-aop:5.2.0.RELEASE'         // <----- 似乎只支持XML
    
        // AOP
        // https://mvnrepository.com/artifact/org.aspectj/aspectjrt
        implementation group: 'org.aspectj', name: 'aspectjrt', version: '1.9.6'
        // https://mvnrepository.com/artifact/org.aspectj/aspectjweaver
        implementation group: 'org.aspectj', name: 'aspectjweaver', version: '1.9.6'
    

    测试

    package aop
    
    import org.aspectj.lang.annotation.Aspect
    import org.aspectj.lang.annotation.Before
    import org.junit.jupiter.api.Assertions.*
    import org.junit.jupiter.api.Test
    import org.junit.jupiter.api.extension.ExtendWith
    import org.springframework.beans.factory.annotation.Autowired
    import org.springframework.context.ApplicationContext
    import org.springframework.context.annotation.ComponentScan
    import org.springframework.context.annotation.EnableAspectJAutoProxy
    import org.springframework.stereotype.Component
    import org.springframework.test.context.junit.jupiter.SpringExtension
    import org.springframework.test.context.junit.jupiter.SpringJUnitConfig
    
    var isHandle = false
    
    interface Foo {
        fun bar(): String = "Foo#bar()"
    }
    
    @Component
    class MyFoo : Foo {
        override fun bar(): String {
            println("calling")
            return super.bar()
        }
    }
    
    @Component
    @Aspect
    @EnableAspectJAutoProxy
    class MyAspect {
        @Before("execution(String bar())")
        fun handle() {
            println("handle called")
            isHandle = true
        }
    }
    
    @ComponentScan
    class HeadfirstAOPJavaConfig
    
    @ExtendWith(SpringExtension::class)
    @SpringJUnitConfig(HeadfirstAOPJavaConfig::class)
    class HeadfirstAOP {
        @Autowired lateinit var ctx: ApplicationContext
    
        @Autowired lateinit var foo: Foo
    
        @Test fun `handle() should be call`() {
            assertFalse(isHandle)
            val str = foo.bar()
            assertTrue(isHandle)
            println("str=$str")
        }
    }
    

    END

  • 相关阅读:
    markdown
    线段树模板
    Trie模板 UVALive 3942 Remember the Word
    使用swift写sprite Kit的模仿微信打飞机游戏
    Graffiti support page
    使用代码控制ScrollView的contentSize
    资料整理
    pd.to_sql()用法
    如何将表格的数据导入到mysql
    安装启动MySQL8.0,报错:1053
  • 原文地址:https://www.cnblogs.com/develon/p/14503368.html
Copyright © 2011-2022 走看看