AspectJ

本博客是总结《Spring in action》的学习。

1、AspectJ常用注解及意义

@After:通知方法会在目标方法返回或者抛出异常后调用。

@AfterReturning:通知方法在目标方法返回后调用。

@AfterThrowing :通知方法在目标方法抛出异常后调用。

@Around:通知方法将会将目标方法封装起来。

@Before : 通知方法将会在目标方法调用之前执行。

(1)目标方法

package com.liutao.aop;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

/**
 * 演示AspectJ
 * Created by liutao on 2017/3/19.
 */
@Component
public class PerformanceOfAspectJ {
    Logger logger = Logger.getLogger(PerformanceOfAspectJ.class);
    public void perform(){
        logger.info("#########################");
        logger.info("##### this is perform ####");
        logger.info("#########################");
    }
}
(2)通知方法

package com.liutao.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

/**
 * 用于演示AspectJ
 * Created by liutao on 2017/3/19.
 */
@Aspect
public class AudienceOfAspectj {
    Logger logger = Logger.getLogger(AudienceOfAspectj.class);
    @Pointcut("execution(** com.liutao.aop.PerformanceOfAspectJ.perform(..))")
    public void performance(){}

    @Before("performance()")
    public void silenceCellPhone(){
        logger.info("******* cellPhone silence ************");
    }

    @Before("performance()")
    public void takeSeats(){
        logger.info("******* please take seats ************");
    }

    @AfterReturning("performance()")
    public void applause(){
        logger.info("******* CLAP CLAP CLAP ************");
    }

}

(3)配置java类和测试java类见后面。

2、声明环绕通知

(1)目标方法同上。

(2)通知方法。

package com.liutao.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

/**
 * 演示环绕通知
 * Created by liutao on 2017/3/19.
 */
@Aspect
public class AudienceOfAround {
    Logger logger = Logger.getLogger(AudienceOfAround.class);

    @Pointcut("execution(** com.liutao.aop.PerformanceOfAspectJ.perform(..))")
    public void performance(){}

    @Around("performance()")
    public void watchPerformance(ProceedingJoinPoint joinPoint){
        try {
            logger.info("############## Silencing cell phone ###############");
            logger.info("############## Taking seats ###############");
            joinPoint.proceed();
            logger.info("############## CLAP CLAP CLAP ###############");
        } catch (Throwable throwable) {
            logger.info("############## Demanding a refund ###############");
        }

    }
}
注意:以上通知方法使用了ProceedingJoinPoint作为参数,这样可以调用该类的proceed()方法执行目标方法。

(3)配置文件及测试类见下面。

3、参数处理

(1)目标方法

package com.liutao.aop;

import org.apache.log4j.Logger;
import java.util.List;

/**
 * 演示通知中带有参数的情况
 * Created by liutao on 2017/3/19.
 */
public class BlankDisc {
    private String title;
    private String artist;
    private List<String> tracks;
    private Logger logger = Logger.getLogger(BlankDisc.class);

    public BlankDisc(String title, String artist, List<String> tracks) {
        this.title = title;
        this.artist = artist;
        this.tracks = tracks;
    }

    public void playTrack(int trackNumber){
        logger.info("***********Playing "+title+" by "+artist);
        logger.info("*******Track: "+tracks.get(trackNumber));
    }
}

(2)通知方法。

package com.liutao.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import java.util.HashMap;
import java.util.Map;

/**
 * 演示通知中带有参数的情况
 * Created by liutao on 2017/3/19.
 */
@Aspect
public class TrackCounter {
    private Map<Integer,Integer> trackCounts = new HashMap<Integer, Integer>();

    public Map<Integer, Integer> getTrackCounts() {
        return trackCounts;
    }

    public void setTrackCounts(Map<Integer, Integer> trackCounts) {
        this.trackCounts = trackCounts;
    }

    @Pointcut("execution(* com.liutao.aop.BlankDisc.playTrack(int)) && args(trackNumber)")
    public void trackPlayed(int trackNumber){}

    @Before("trackPlayed(trackNumber)")
    public void countTrack(int trackNumber){
        int currentCount = getPlayCount(trackNumber);
        trackCounts.put(trackNumber,currentCount+1);
    }

    private int getPlayCount(int trackNubmer) {
        return trackCounts.containsKey(trackNubmer) ? trackCounts.get(trackNubmer) : 0;
    }


}
(3)配置和测试类见下面。

3、配置类

package com.liutao.config;

import com.liutao.aop.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by liutao on 2017/3/19.
 */
@Configuration
@EnableAspectJAutoProxy
@ComponentScan
public class AopOfAspectJConfig {
    @Bean
    public AudienceOfAspectj audience(){
        return new AudienceOfAspectj();
    }

    @Bean
    public AudienceOfAround audienceOfAround(){
        return new AudienceOfAround();
    }



    @Bean
    public BlankDisc blankDisc(){
        String title = "country";
        String artist = "jok";
        List<String> tracks = new ArrayList<String>();
        tracks.add("liu");
        tracks.add("guan");
        tracks.add("zhang");
        tracks.add("zhao");
        return new BlankDisc(title,artist,tracks);
        }

    @Bean
    public TrackCounter trackCounter(){
        return new TrackCounter();
    }
        }

4、测试类

package com.liutao.aopTest;

import com.liutao.aop.BlankDisc;
import com.liutao.aop.EncoreableIntroducer;
import com.liutao.aop.PerformanceOfAspectJ;
import com.liutao.aop.TrackCounter;
import com.liutao.application.Application;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

/**
 * Created by liutao on 2017/3/19.
 */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class AopTest {
    @Autowired
    private PerformanceOfAspectJ performanceOfAspectJ;

    @Autowired
    private TrackCounter trackCounter;

    @Autowired
    private BlankDisc blankDisc;

    @Test
    public void testAopOfAspectJ(){
        System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
        System.out.println("performanceOfAspectJ:"+performanceOfAspectJ);
        performanceOfAspectJ.perform();
    }

    @Test
    public void testAround(){
        performanceOfAspectJ.perform();
    }

    @Test
    public void testTrackCounterOfPam(){
        blankDisc.playTrack(1);
        blankDisc.playTrack(2);
        blankDisc.playTrack(2);
        blankDisc.playTrack(1);
        blankDisc.playTrack(2);
        blankDisc.playTrack(3);

        System.out.println(trackCounter.getTrackCounts().get(1));
        System.out.println(trackCounter.getTrackCounts().get(2));
        System.out.println(trackCounter.getTrackCounts().get(3));
    }
}




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值