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实现就完成了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值