AOP实现
本文介绍AOP基于aspectJ和注解形式的实现,至于什么是aop,那啥请自行百度。
在aop的实现中有两种方式:
1、基于注解的形式
2、基于xml的形式
两种都可以,我习惯于用注解的方式来实现。基本思路,比如说现在你在加事务的时候,不用spring的事务注解,用编程式事务。所以要自定义一个注解,然后写一个注解的handler,handler里面就定义切点,环绕通知等等,然后切点用@annotation的方式,当然也可以用execution的方式,简单的理解就是在你用到这个自定义注解的地方,就会把它捕捉到,进而获取被使用的方法的信息,以及干你想让它干的事情。
首先要在你的pom文件里面引入以下依赖:
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
自定义注解(写法自行百度):
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface AnnoDemo {
String myName() default "1";
boolean isSuccess() default true;
}
注解handler,用来编写aop的一些东西:
@Aspect
@Configuration
public class AnnoDemoHandler {
private static final String FIRST_NAME = "给我一个机会";
private static final String SECEND_NAME = "我想做一个好人";
//切入点,使用到这个注解的地方就执行环绕
@Pointcut("@annotation(com.web.main_web.common.AnnoDemo)")
public void serveCut(){
}
//前置通知
@Before("serveCut()")
public void before(){
System.out.println("我是前置通知----\n");
}
//后置通知
@After("serveCut()")
public void after(){
System.out.println("来了老弟!我是后置通知\n");
}
//环绕通知 ProceedingJoinPoint只能用于环绕通知
@Around("serveCut()")
public void aopTest(ProceedingJoinPoint joinPoint){
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
AnnoDemo annoDemo = method.getAnnotation(AnnoDemo.class);
System.out.println("方法名:-------------\n"+method.getName());
Object[] args = joinPoint.getArgs();
Object currentClass = joinPoint.getThis();
System.out.println("args:"+args.toString()+"--currentClass:"+currentClass+"\n");
if(annoDemo != null){
System.out.println("我用了你的注解了,你说咋滴---"+FIRST_NAME);
if(annoDemo.isSuccess() && !"1".equals(annoDemo.myName())){
System.out.println("我的名字我自己定---"+SECEND_NAME);
}
}else{
System.out.println("我不需要注解");
}
}
}
@Pointcut("@annotation(com.web.main_web.common.AnnoDemo)")就是以我们自定义注解作为切入点。一般的话我们要干的事情都是在环绕通知的方法里面编写的。
然后写一个类来测试一下:
@Configuration
public class Demo1 {
@AnnoDemo(myName = "Jack")
public void add(int a,int b){
System.out.println(a+b);
}
@AnnoDemo
public void pass(int a,int b){
System.out.println(a-b);
}
public void end(int a,int b){
System.out.println(a*b);
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class MainWebApplicationTests {
@Autowired
private Demo1 demo11;
@Test
public void fun(){
demo11.add(10,5);
demo11.end(10,5);
demo11.pass(10,5);
}
}
运行结果:
通过这个截图就可以知道:我们的方法上面使用这个注解的地方,就被捕捉到了。就能使用handler的方法,一个简单的aop实现就完成了。