跳到正文
Arlen

在搭建一个Spring+SpringMVC的项目时,在web.xml中你肯定会先配置`ContextLoaderListener`,然后再配`DispatcherServlet`,并且你肯定会有疑惑这俩东西干嘛的?我们知道,Web容器启动,他有一个全局的上下文,即`ServletContext`,那么这三者有什么关系呢?

编码过程中,经常会遇到泛型,然后通用的一些方法,想用反射获取到泛型的实际类型,之前一直以为没办法,都是用注解在变量前边指定的,今天查了下,还是有方法的。

Mybatis generator 插件会生成一堆Example类,之前一直没有在意,直到最近写generator的插件时,才去探了一下究竟。然后发现,其用编程式实现SQL 的动态拼接,很是方便,比自己一直去在SqlMap中写sql方便太多了。

因为之前写了一个字典项填充插件,需要对select出来的对象填充字典项的中英文字段,考虑到这种东西应该对数据访问层就透明,必然不能放到service里去做。那就想到了动态代理来做。Spring框架中AOP是绝佳选择。但是问题来了,同样的Pointcut表达式,service能拦截,但是dao的接口就不能拦截,纠结了一天。如果要看怎么解决,直接看问题解决即可。

基本概念

  1. Aspect,中译为切面,即要让代理实现的功能的统称。如果没有AOP,而是用自己写的动态代理,则可以将自己写的动态代理的.java文件看成Aspect。比如,CacheProxy,可以叫做缓存切面。为什么叫切面,是因为,这么一个代理可以切入到任何方法中。
  2. Joinpoint,中译为连接点,即在切面的整个流程中(假如一个代理(切面)中有三个方法被切入执行),目标对象的方法被调用的点(也即PointCut所指定的点)
  3. Pointcut,中译为切点,即告诉切面,哪些点是要切入执行(被代理代理执行)的。就代码中的AspectJ execution表达式,看成正则表达式,也即一个规则,被这个规则所匹配到的点叫做Joinpoint
  4. Advice,中译为通知,分为好几种,around, before和after等。即切面在切点执行连接点的前后、前 和 后,要通知的执行事件。相当于自己的动态代理中,方法执行前、执行后所要执行的方法。
  5. Target Object,中译为目标对象,即被切入的对象。就是动态代理被代理的对象。
  6. AOP Proxy,AOP创建的代理对象,即运行时为切面中Advice的执行所创建的代理对象。通俗点讲就是运行时的.class对象
  7. Weaving,中译为织入。即将切面织入到目标对象中去执行

Aspect

声明切面

@Aspect
public class DictionaryAspect {
}

注意 Aspect除了加@Aspect注解外,必须得确保Spring可以找的到该Component。也就是要么加@Component注解,要么在Srping的配置文件中配置bean。