面试官:你在项目中有使用到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、保持好心态!( ̄︶ ̄)