1、创建一个spring boot项目
见上上篇,在这里不再重复
然后在pom.xml中添加依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectj-tools</artifactId>
<version>1.0.6</version>
</dependency>
2、生成一个接口
public interface Flyable {
void fly();
}
3、生成一个接口的实现类
注意,这里要运用切面的话,需要进行注解 @Component 表示这是一个bean,由Spring进行管理 加入到IoC容器
@Component
public class Eagle implements Flyable {
@Override
public void fly() {
System.out.println(“老鹰在飞翔…”);
}
public void fly(String name) {
System.out.println(“老鹰在飞翔…”+name);
}
}
4、创建切面
其中,@Aspect 注解的意思是表达此类为一个切面
@Pointcut 表示切入点,即在括号内符合条件的,会调用下面的方法
@Before,@After,@Around 分别代表方法前,后,及环绕方法,看后面的执行结果,更直观一些
@Aspect
@Component
public class AspectDemo {
public AspectDemo(){
}
@Pointcut("execution(* *.fly(..))")
public void pointFly(){
}
@Before("pointFly()")
public void beforeFly(){
System.out.println("准备起飞...");
}
@After("pointFly()")
public void afterFly(){
System.out.println("准备降落...");
}
@Around("pointFly()")
public void aroundFly(ProceedingJoinPoint joinPoint) throws Throwable{
Class<?> aclass = joinPoint.getTarget().getClass();//先获取被织入增强处理的目标对象,再获取目标类的clazz
String name = joinPoint.getSignature().getName();//先获取目标方法的签名,再获取目标方法的名
Class[] parameterTypes = ((MethodSignature)joinPoint.getSignature()).getParameterTypes();//获取目标方法参数类型
Method method = aclass.getMethod(name, parameterTypes);//获取目标方法
System.out.println("环绕立体");
long starttime = System.currentTimeMillis();
Object proceed = joinPoint.proceed();//执行方法
long exctime = System.currentTimeMillis() - starttime;
System.out.println("执行时间:"+exctime);
}
}
5、调用实现类
@RequestMapping("/aspect")
public void aspect(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Eagle eagle = context.getBean(Eagle.class);
eagle.fly("--老鹰老鹰--");
}
控制台调用,后端打印日志: