1、 AOP概术
1. 什么是AOP的技术?
* 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程。
* AOP是一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构。
* 可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
* AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
* 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
2. AOP:面向切面编程.(思想.---解决OOP遇到一些问题)
3. AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存、异常处理等)
2、 Spring框架的底层实现
Srping框架的AOP技术底层也是采用的代理技术,代理的方式提供了两种
1. 基于JDK的动态代理
* 必须是面向接口的,只有实现了具体接口的类才能生成代理对象
2. 基于CGLIB动态代理
* 对于没有实现了接口的类,也可以产生代理,产生这个类的子类的方式
Spring的传统AOP中根据类是否实现接口,来采用不同的代理方式
1. 如果实现类接口,使用JDK动态代理完成AOP
2. 如果没有实现接口,采用CGLIB动态代理完成AOP
1,JDK动态代理
使用Proxy类来生成代理对象的一些代码如下:
public staticUserDao getProxy(final UserDao dao){
UserDaoproxy = (UserDao) Proxy.newProxyInstance(dao.getClass().getClassLoader(),dao.getClass().getInterfaces(), new InvocationHandler() {
@Override
publicObject invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 做日志的输出
if("save".equals(method.getName())){
System.out.println("记录日志了....");
}
return method.invoke(dao, args);
}
});
returnproxy;
}
2,CGLIB动态代理
引入
CBLIB
的开发包
*
如果想使用
CGLIB
的技术来生成代理对象,那么需要引入
CGLIB
的开发的
jar
包,在
Spring
框架核心包中已经引入了
CGLIB
的开发包了。所以直接引入
Spring
核心开发包即可!
编写相关的代码
public static OrderDaoImpl getProxy(){
//
创建
CGLIB
核心的类
Enhancer enhancer = new Enhancer();
//
设置父类
enhancer.setSuperclass(OrderDaoImpl.class);
//
设置回调函数
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
if("save".equals(method.getName())){
//
记录日志
System.out.println("
记录日志了
...");
}
return methodProxy.invokeSuper(obj, args);
}
});
//
生成代理对象
OrderDaoImpl proxy = (OrderDaoImpl) enhancer.create();
return proxy;
}
3、 AOP名词解释
* Joinpoint(连接点) -- 所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.
* Pointcut(切入点) -- 所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.
* Advice(通知/增强) -- 所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
* Introduction(引介) -- 引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
* Target(目标对象) -- 代理的目标对象
* Weaving(织入) -- 是指把增强应用到目标对象来创建新的代理对象的过程.
* Proxy(代理) -- 一个类被AOP织入增强后,就产生一个结果代理类
* Aspect(切面) -- 是切入点和通知的结合
* spring采用动态代理织入,而AspectJ采用编译期织入和类装在期织入。
4、 AspectJ概术
* AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。
* Spring为了简化AOP开发引入了AspectJ作为自身AOP开发
* AspectJ是一个基于Java语言的AOP框架
* Spring2.0以后新增了对AspectJ切点表达式支持
* @AspectJ 是AspectJ1.5新增功能,通过JDK5注解技术,允许直接在Bean类中定义切面
* 新版本Spring框架,建议使用AspectJ方式来开发AOP
5、 基于AspectJ开发AOP
a. XML 方式
1. 步骤一:引入具体的开发的jar包
* 先引入Spring框架开发的基本开发包,还需要引入AOP的开发包(AOP联盟和AOP的开发包)
* 再引入AspectJ的开发包
* 引入Spring框架传统的AOP的开发包 -- spring-aop-3.2.0.RELEASE.jar
* Spring支持AspectJ的包 --spring-aspects-3.2.0.RELEASE.jar
* AspectJ本身jar包 --com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
* 引入AOP联盟的开发包 --com.springsource.org.aopalliance-1.0.0.jar
2. 步骤二:创建Spring的配置文件,引入具体的AOP的schema约束
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd">
3. 步骤三:编写具体的实现类代码
* com.spring.demo2
* BookDaoImpl
4. 步骤四:将目标类配置到Spring中
<!-- 目标类-->
<bean id="bookDao" class="com.itheima.demo3.BookDaoImpl"/>
5. 步骤五:定义切面
* 编写代码
public class LogAspect {
public void saveLog(){
System.out.println("记录日志...");
}
}
* 配置切面类
<bean id="logAspect"class="cn.itcast.demo2.LogAspect"/>
6. 步骤七:在配置文件中完成aop的配置
<!-- 配置AOP-->
<aop:config>
<!-- 配置切面:切入点和通知组成 -->
<aop:aspectref="logAspect">
<!-- 定义通知类型,前置通知 -->
<aop:beforemethod="saveLog" pointcut="execution(public voidcn.itcast.demo1.UserDaoImpl.save())"/>
</aop:aspect>
</aop:config>
8. 完成测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo3 {
@Resource(name="bookDao")
public BookDaoImpl bookDao;
@Test
public void run1(){
bookDao.save();
}
}