本博客是总结《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));
}
}