AOP主要概念:
Cross Cutting Concern(横切关注点)
是一种独立服务,遍布在系统的处理流程之中(可以理解可以单独抽取出的服务)
Aspect(横切面)
对横切性关注点的模块化(可以简单理解成一个java类)
Advice(就简单理解成方法吧)
对横切性关注点的具体实现(在Spring 中可以理解为横切面的具体方法)
Pointcut(切入点)
它定义了Advice应用到哪些JoinPoint上,对Spring来说是方法调用
JoinPoint(加入点)
Advice在应用程序上执行的点或时机,Spring只支持方法的JoinPoint,这个点也可以使属性修改,如:Aspecj可以支持
Weave(织入)
将Advice应用到Target Object上的过程叫织入,Spring支持的是动态织入
Target Object(目标对象)
Advice被应用的对象
Proxy
Spring AOP默认使用JDK的动态代理,它的代理是运行时创建,也可以使用CGLIB代理
Introduction
可以动态的为类添加方法
要想用好Spring 的AOP 首先就要好好理解前面的几个概念,在自己的脑子里有一种如何实现aop的流程。先找到有哪些独立服务把它当成横切关注点抽取出来,然后模块化它关注点使其成为一个java类即关注面,这个java类中具体的实现方法就是Advice,然后确定Advice的切入带你和加入点,应用到目标对象即可。
实现AOP使用注解的方式比较简单和方便,推荐使用。
1.在横切面上加入@Aspect
2.在具体的Adivce(方法)上加入@Before or @After
3.在主配置文件中配置实用注解方式的参数
可以在Advice方法参数中加入JoinPoint来获相关的参数信息
写注解时候可能要用到切入点表达式(比较简单参考文档)
举例:execution(public voidcom.xuyi.aop.UserManager.addUser(..));
即execution(返回类型 包名.类名 方法名(参数列表))
当然其实可以用*代表通配符、参数列表可以使用(..) 即两点表示不定参数
开发步骤:(基于注解的AOP实现)
1.Spring 的依赖jar 包导入(别忘记AOP 和AspectJ )
2.将横切关注点模块化,建立一个java类
3.采用注解指定该java类为Aspect
4.采用注解定义Advice(模块化类的方法) 和Pointcut ;可以合在一起写
5.配置文件中配置启用AspectJ对Annotation的支持,并且将目标类和Aspect类配 置到IOC容器中。
6.开发客户端试用
spring对AOP的支持
1、如果目标对象实现了接口,在默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,也可以强制使用CGLIB生成代理实现AOP
3、如果目标对象没有实现接口,那么必须引入CGLIB,spring会在JDK的动态代理和CGLIB代理之间切换
如何强制使用CGLIB生成代码?
* 加入CGLIB库,SPRING_HOME/lib/cglib/*.jar
* 加入如下配置,强制使用CGLIB代理
JDK动态代理和CGLIB代理的区别?
* JDK动态代理对实现了接口的类进行代理
* CGLIB代理可以对类代理,主要对指定的类生成一个子类,因为是继承
我们的目标最好不要使用final声明
了解即可
Spring中通常配置的是服务类、无状态类。
其实要使用AOP是很简单的,对于AOP我们更应该掌握它的思想。
实际开发中我们自己去编写AOP的机会是很少的,通常我们都是在Spring中配置好声明式事务之后,我们就不会再管事务的事情了。
Hibernate的openSession和getCurrentSesion的区别:在需要使用事务的时候尽量使用使用后一个,需要配置Thred.