springboot aop

springboot怎樣使用aop呢?我們知道aop的實現(xiàn)一種是jdk動態(tài)代理實現(xiàn)aop右锨,一種是cglib動態(tài)代理實現(xiàn)的aop括堤。

先看一個demo,加入依賴:

<dependencies>
     <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
     <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-aop</artifactId>
     </dependency>
</dependencies>

定義一個controller

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/user/queryUserById/{id}")
    @ResponseBody
    private String queryUserById(@PathVariable int id){
        return userService.queryUserById(id);
    }
}

定義一個service層接口:

public interface UserService {

    String queryUserById(int id);
}

其實現(xiàn):

@Service("userService")
public class UserServiceImpl implements UserService{

    @Override
    public String queryUserById(int id) {
        return "user home";
    }

}

定義具體的aop功能,封裝橫切關(guān)注點悄窃,配置通知等等讥电,怎么在aop中拿到橫切的對象。

@Aspect
@Component
public class LogAspect {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Before("execution(* com.zhihao.miao.service..*.*(..))")
    public void log(){
        //logger.info("before method log done"+ AopContext.currentProxy().getClass());
        logger.info("before method log done");
    }

    //可以通過JoinPoint取到aop的類名轧抗,方法參數(shù)恩敌,方法簽名
    @After("execution(* com.zhihao.miao.service..*.*(..))")
    public void logAfter(JoinPoint joinPoint){
        logger.info("after method log done "+joinPoint.getTarget().getClass()+",args="+ Arrays.asList(joinPoint.getArgs())+",method="+joinPoint.getSignature());
    }
}

啟動類啟動:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

訪問:http://localhost:8080/user/queryUserById/1
打印結(jié)果,

很簡單的實現(xiàn)了aop的功能横媚。

AOP開發(fā)流程

  • spring-boot-starter-aop纠炮,加入依賴,默認(rèn)就開啟了AOP的支持
  • 寫一個Aspect灯蝴,封裝橫切關(guān)注點(日志恢口,監(jiān)控等等),需要配置通知(前置通知穷躁、后置通知等等)和 切入點(哪些包的哪些類的哪些方法等等)
  • 這個Aspect需要納入到spring容器管理耕肩,并且需要加入@Aspect

深入

可以使用spring.aop.auto配置決定是否啟用AOP,默認(rèn)啟用问潭。

AopAutoConfiguration

application.properties配置如下屬性猿诸,則aop實效,

spring.aop.auto=false

看了AopAutoConfiguration源碼發(fā)現(xiàn)我們可以指定是JDK的動態(tài)代理還是cglib的動態(tài)代理狡忙,通過設(shè)置spring.aop.proxy-target-class這個屬性梳虽。不設(shè)置(默認(rèn)屬性值是false)則默認(rèn)是jdk的代理。但是如果不設(shè)置或者設(shè)置為false去枷,但是代理的類沒有實現(xiàn)接口的話也是cglib代理怖辆。
比如再定義一個類OrderService,并沒有實現(xiàn)接口删顶,而上面的UserServiceImpl是實現(xiàn)UserService接口竖螃,我們看看其使用了什么動態(tài)代理

@Service("orderService")
public class OrderService {

    public String name(){
        return "order home";
    }
}

修改啟動類啟動,

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
        String userServiceClassname = context.getBean("userService").getClass().getName();
        System.out.println("userServiceClassname==="+userServiceClassname);

        String orderServiceclassname = context.getBean("orderService").getClass().getName();
        System.out.println("orderServiceclassname===="+orderServiceclassname);
    }
}

我們看到當(dāng)spring.aop.proxy-target-class=false(缺省的時候也是false)逗余,代理的類如果實現(xiàn)接口那么就使用的是jdk的動態(tài)代理特咆,如果沒有實現(xiàn)接口那么就使用的是cglib的動態(tài)代理。

我們在application.properties中設(shè)置spring.aop.proxy-target-class設(shè)為true录粱,

spring.aop.proxy-target-class=true

啟動啟動類腻格,發(fā)現(xiàn)二個類都是使用的cglib代理的

圖片.png

總結(jié):
默認(rèn)是使用基于JDK的動態(tài)代理來實現(xiàn)AOP,spring.aop.proxy-target-class=false 或者不配置啥繁,表示使用JDK的動態(tài)代理菜职,pring.aop.proxy-target-class=true表示使用cglib,如果配置了spring.aop.proxy-target-class=false旗闽,但是代理類沒有實現(xiàn)接口酬核,則依然使用cglib蜜另。

拓展

也可以使用
@EnableAspectJAutoProxy(proxyTargetClass=true,exposeProxy=true)這個注解,注解表示啟用AOP嫡意,當(dāng)然默認(rèn)也是啟用AOP的举瑰,因為springboot的自動裝配機制,第一個參數(shù)表示是使用JDK的動態(tài)代理還是Cglib的代理蔬螟,第二個參數(shù)表示可以使用AopContext這個類進(jìn)行一些操作此迅。

注釋之前所有的application.properties中的配置,在啟動類上加上
@EnableAspectJAutoProxy(proxyTargetClass=true,exposeProxy=true)

@SpringBootApplication
@EnableAspectJAutoProxy(proxyTargetClass=true,exposeProxy=true)
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
        String userServiceClassname = context.getBean("userService").getClass().getName();
        System.out.println("userServiceClassname==="+userServiceClassname);

        String orderServiceclassname = context.getBean("orderService").getClass().getName();
        System.out.println("orderServiceclassname===="+orderServiceclassname);
    }
}

表示自己啟動cglib代理旧巾,并且exposeProxy配置為true表示可以橫切關(guān)注點中使用AopContext這個類耸序,修改一下上面的LogAspect的log方法,

   @Before("execution(* com.zhihao.miao.service..*.*(..))")
    public void log(){
        logger.info("before method log done"+ AopContext.currentProxy().getClass());
        //logger.info("before method log done");
    }

啟動并測試菠齿,

可以通過AopContext得到當(dāng)前的代理對象佑吝,更一步得到一些方法簽名,方法的參數(shù)等一些具體信息绳匀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市炸客,隨后出現(xiàn)的幾起案子疾棵,更是在濱河造成了極大的恐慌,老刑警劉巖痹仙,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件是尔,死亡現(xiàn)場離奇詭異,居然都是意外死亡开仰,警方通過查閱死者的電腦和手機拟枚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來众弓,“玉大人恩溅,你說我怎么就攤上這事∥酵蓿” “怎么了脚乡?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長滨达。 經(jīng)常有香客問我奶稠,道長,這世上最難降的妖魔是什么捡遍? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任锌订,我火速辦了婚禮,結(jié)果婚禮上画株,老公的妹妹穿的比我還像新娘辆飘。我一直安慰自己涩搓,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布劈猪。 她就那樣靜靜地躺著昧甘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪战得。 梳的紋絲不亂的頭發(fā)上充边,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音常侦,去河邊找鬼浇冰。 笑死,一個胖子當(dāng)著我的面吹牛聋亡,可吹牛的內(nèi)容都是我干的肘习。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼坡倔,長吁一口氣:“原來是場噩夢啊……” “哼漂佩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起罪塔,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤投蝉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后征堪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘩缆,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年佃蚜,在試婚紗的時候發(fā)現(xiàn)自己被綠了庸娱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡谐算,死狀恐怖熟尉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情氯夷,我是刑警寧澤臣樱,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站腮考,受9級特大地震影響雇毫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜踩蔚,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一棚放、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧馅闽,春花似錦飘蚯、人聲如沸馍迄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽攀圈。三九已至,卻和暖如春峦甩,著一層夾襖步出監(jiān)牢的瞬間赘来,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工凯傲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留犬辰,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓冰单,卻偏偏與公主長得像幌缝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诫欠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理涵卵,服務(wù)發(fā)現(xiàn),斷路器呕诉,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 從三月份找實習(xí)到現(xiàn)在缘厢,面了一些公司,掛了不少甩挫,但最終還是拿到小米、百度椿每、阿里伊者、京東、新浪间护、CVTE亦渗、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,209評論 11 349
  • 什么是Spring Spring是一個開源的Java EE開發(fā)框架。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,445評論 1 133
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評論 6 342
  • 時光飛逝 轉(zhuǎn)眼間 你我即將分離 各奔東西 也許 我們會離得很遠(yuǎn)很遠(yuǎn) 也許 我們不會再見 再也許 我們會忘記彼此 離...
    櫻花落ww閱讀 217評論 3 2