简单实现一个Aop

面试官:你在项目中有使用到spring相关技术,那你简单说说你对Aop的理解!
我:(Aop?Aop是啥?我熟练使用各种Ctrl+C,Ctrl+V,没听说哪里用过Aop啊,ADC我倒是知道!)…Aop…是Spring的一个组件?
面试官:好的,你回去等通知吧,出去把门带一下。
Aop(Aspect Oriented Programming),也许很多人并不陌生,作为面试高频出现的问题,在很多博文博客中都有介绍。但因为其并不高的使用率,总是似懂非懂,经常成为各位coder绊脚石。小编也因为上面的惨痛经历,遂知耻而后勇,决定使用代码的方式,搞明白Aop到底是个什么东西!
搞清楚Aop之前,需要搞清楚几个概念,也就是Aop的相关术语:
1、Target(目标对象):代理的目标对象;
2、paroxy(代理):一个被Aop织入增强后,就产生一个代理结果类。
3、JionPoint(连接点):连接点,指那些被拦截到的点,在Spring中,这些点指的是方法。
4、PointCut(切入点):指我们要对哪些连接点进行拦截定义,即要被增强的额方法。
5、Adcvice(通知):指拦截到连接点之后要做的事情,就叫通知。
6、Aspct(切面):是切入点和通知的结合。
7、Weaving(织入):值增强应用到目标对象来创建新的代理对象的过程。
开始撸代码!
1、创建一个maven工程,并导入以下坐标

		<dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.2</version>
        </dependency>

2、随便创建一个类,并将它交由容器管理

  @Component
public class UserDao {

    public  void  userdao(){

        System.out.println ("这是在Userdao中的一个方法");
    }

}

3、创建一个配置类

@ComponentScan("com.moyu")
@Configuration
@EnableAspectJAutoProxy //项目支持aspectJ的风格
public class AopTestConfig {

}

4、创建一个切面类

@Component
@Aspect//申明为一个切面类
public class AspectConfig {


    @Pointcut("execution(* com.moyu.aoptest.vo.*.*(..))")
    //定义切点方法
    public void pointcuttest(){
    }

    @Around ("pointcuttest()")
    //指定增强的方法在切入点方法之前之后都执行
    public  Object  advice(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println ("=======Around前=======");
        Object proceed = joinPoint.proceed ();
        System.out.println ("=======Around后=======");
       return  proceed;
    }

    @Before ("pointcuttest()")
    //指定增强的方法在切入点方法之前执行
    public  void  advice1() {
        System.out.println ("=====Before=========");
    }

    @After ("pointcuttest()")
    //指定增强的方法在切入点方法之后执行
    public  void  advice2() {
        System.out.println ("=====after=========");
    }

}

5、创建一个测试类

public class AopTest {
    public static void main(String[] args) {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext (AopTestConfig.class);

        UserDao bean = context.getBean (UserDao.class);
        bean.userdao ();

    }
}

运行结果:

=======Around前=======
=====Before=========
这是在Userdao中的一个方法
=======Around后=======
=====after=========

由此,可不可以看到,虽然我们只定义了一个方法,但是在方法的执行执行之前和之后都执行了其他的方法,这就是Aop的一个简单实现。
总结:
1、使用Aop的目标就是,在不修改源码的情况下,对目标方法增强。
2、明确Aop中各个术语,并能理解各个注解的含义。
3、切记不要死记硬背网上长串深奥的概念,面试时多举例,如在日志,事务上的使用等。
4、保持好心态!( ̄︶ ̄)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值