什么是AOP?

AOP(Aspect-OrientedProgramming,面向方面编程)和OOP(Object-Oriented Programing,面向对象编程)思想不同,两者并非对立关系,前者是后者的补充,后者因为前者的补充而减少重复代码,使程序降低模块间的偶合度,增加未来代码的可操作性和可维护性。

为什么要用AOP模式?

如果我们在业务逻辑中需要对对象中的方法的调用进行记录统计等功能时,通常需要在每个类中新增一个方法来完成相应共能,如此以来代码中就会有很多重复的部分,程序也会高度偶合难以维护。

AOP主要功能:

主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等。AOP主要就是为了将这些功能从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码代码中。

下面我们简单的来看一下spring中如何实现AOP编程。

spring中实现AOP可以用注解和配置xml两种模式。

我们先来看一下使用注解方式如何实现。

首先我们需要一个接口,和实现它的类。

接口:

public interface PersonService {
public String getPersonName(Integer id);
public void save(String name);
}

实现类:

public class PersonServiceBean implements PersonService {
@Override
public String getPersonName(Integer id) {
// TODO Auto-generated method stub
return null;
}
@Override
public void save(String name) {
// TODO Auto-generated method stub
System.out.println("您输入的是" + name);
}
}

接着我们需要配置xml文件,需要把业务bean交给spring来管理

xml:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<aop:aspectj-autoproxy proxy-target-class="true"/>
<bean id="myInterceptor" class="cn.qdlg.service.MyInterceptor"></bean>
<bean id="PersonService" class="cn.qdlg.service.impl.PersonServiceBean"></bean>
</beans>

接下来我们需要完成拦截类定义切面和切入点

public class MyInterceptor {
@Pointcut("execution (* cn.qdlg.service.impl.PersonServiceBean.*(..))")
public void anyMethod(){} @Before("anyMethod()")
public void doAccessCheck(String name){
System.out.println("前置通知" + name);
} @AfterReturning("anyMethod() && args(name)")
public void doAfterReturn(String result){
System.out.println("后置通知" + result);
} @After("anyMethod()")
public Object doAfter(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("进入方法");
Object result = pjp.proceed();
System.out.println("最终通知");
return result;
} @AfterThrowing("anyMethod()")
public void doAfterThrowing(Exception e){
System.out.println("例外通知" + e);
} @Around("anyMethod()")
public void doAround(){
System.out.println("环绕通知");
}
}

最后我们可以写一个测试方法,调用被拦截类的方法。

如果是xml配置实现:

需要在配置文件中配置切面和切入点

在原有xml文件中加入以下代码

<aop:config>
<aop:aspect id="asp" ref="myInterceptor">
<aop:pointcut id="mycut" expression="execution(* cn.qdlg.service.impl.PersonServiceBean.*(..))"/>
<aop:before pointcut-ref="mycut" method="doAccessCheck"/>
<aop:after pointcut-ref="mycut" method="doAfter"/>
<aop:after-returning pointcut-ref="mycut" method="doAfterReturn"/>
<aop:around pointcut-ref="mycut" method="doAround"/>
<aop:after-throwing pointcut-ref="mycut" method="doAfterThrowing"/>
</aop:aspect>
</aop:config>

spring中实现AOP用的是JDK代理和CGLIB代理

JDK动态代理只针对实现了接口的类生成代理
CGlib代理针对类实现代理,主要是指定的类生成的一个子类,覆盖其中所有的方法,该类的方法不能声明为final
如果目标没有实现接口,则会默认采用cglib代理

我们来看一下JDK和CGLIB代理如何实现JDK代理

public class JDKProxyFactory implements InvocationHandler{
private Object targetobject; public Object creatProxyFactory(Object targetobject){
this.targetobject = targetobject;
return Proxy.newProxyInstance(this.targetobject.getClass().getClassLoader(),
this.targetobject.getClass().getInterfaces(), this);
} @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
PersonServiceBean bean = (PersonServiceBean) this.targetobject;
Object result = null;
if(bean.getPersonName()!=null){
result = method.invoke(targetobject, args);
}
return result;
}
}

CGLIB代理

public class CGlibProxyFactory implements MethodInterceptor {
public Object targetObject; public Object creatProxyIntance(Object targetObject){
this.targetObject = targetObject ;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());
enhancer.setCallback(this);
return enhancer.create();
} public Object intercept(Object proxy,Method method,Object[] args,
MethodProxy methodproxy) throws Throwable{
PersonServiceBean bean = (PersonServiceBean) this.targetObject;
Object result = null;
if(bean.getPersonName()!=null){
result = methodproxy.invoke(targetObject, args);
}
return result;
}
}

AOP编程,spring实现及JDK,CGLIB实现的更多相关文章

  1. Spring @Trasactionl 失效, JDK,CGLIB动态代理

    @Transaction:  http://blog.csdn.net/bao19901210/article/details/41724355 Spring上下文:  http://blog.csd ...

  2. 【Spring】AOP的代理默认是Jdk还是Cglib?

    菜瓜:你觉得AOP是啥 水稻:我觉得吧,AOP是对OOP的补充.通常情况下,OOP代码专注功能的实现,所谓面向切面编程,大多数时候是对某一类对象的方法或者功能进行增强或者抽象 菜瓜:我看你这个理解就挺 ...

  3. Spring第五篇【cglib、手动实现AOP编程】

    前言 到目前为止,已经简单学习了Spring的Core模块.也会怎么与Struts2框架进行整合了-.于是我们就开启了Spring的AOP模块了-在讲解AOP模块之前,首先我们来讲解一下cglib代理 ...

  4. 使用spring方式来实现aop编程

    1:什么是aop? Aspect Oriented Programming 面向切面编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译 ...

  5. Spring框架--AOP编程

    2 手动实现AOP编程 AOP 面向切面的编程, AOP可以实现"业务代码"与"关注点代码"分离 // 保存一个用户 public void add(User ...

  6. Spring之AOP编程

    一.AOP简介     AOP的英文全称是Aspect Oriented Programming,意为:面向切面编程.     AOP采取横向抽取的机制,取代了传统纵向继承体系的代码复用.AOP常用于 ...

  7. Spring的AOP编程

    1.手动实现AOP编程(代理模式) AOP是面向切面的编程,主要功能就是实现"业务代码"和辅助业务代码的"关注点代码"分离.在一个方法中,出了核心的业务代码,其 ...

  8. Spring入门3.AOP编程

    Spring入门3.AOP编程 代码下载: 链接: http://pan.baidu.com/s/11mYEO 密码: x7wa 前言: 前面学习的知识是Spring在Java项目中的IoC或DJ,这 ...

  9. Spring框架的AOP编程,最通俗的语言解释,易懂易学

    第七章:AOP技术 前言: AOP技术是根据动态代理设计模式进行的技术.动态代理技术分jdk动态代理和cglib动态代理 jdk动态代理特点: (1)继承java.lang.reflect.proxy ...

随机推荐

  1. java学习之反射

    package com.gh.ref; public class Person { private String name; private int age; private char sex; pr ...

  2. Android apk逆向实战

    简介 逆向Android apk其实是一个分析Android apk的一个过程,必须了解Android程序开发的流程.结构.语句分支.解密原理等等. 功能 破解一个注册验证程序(自写一个简单的注册验证 ...

  3. POJ 1692 Crossed Matchings(DP)

    Description There are two rows of positive integer numbers. We can draw one line segment between any ...

  4. 【Maven】运行项目,报ClassNotFound错误

    我们在pom.xml中添加了那些依赖的jar后,一旦在代码中应用.当我们本地调试时,会报ClassNotFound错误,这是为什么?? 因为Tomcat不懂这些配置,你必须把Maven Depende ...

  5. 一天一个类--NIO 之Buffer

    java.nio  --- 定义了 Buffer 及其数据类型相关的子类.其中被 java.nio.channels 中的类用来进行 IO 操作的 ByteBuffer 的作用非常重要. java.n ...

  6. ZOJ 2853 Evolution 【简单矩阵快速幂】

    这道题目第二次看的时候才彻底理解了是什么意思 把题目转化为数学模型分析后就是 有一个初始序列, 有一个进化率矩阵 求的是初始序列 与进化率矩阵进行 m 次运算后, 初始序列最后一位的答案 那么显然,可 ...

  7. 基于visual Studio2013解决C语言竞赛题之0516人来人往

     题目

  8. C#操作Excel(读/写)

    http://www.cnblogs.com/litianfei/archive/2008/03/21/1116906.html 写的很详细 一.操作Excel 首先导出Excel (1)示例: // ...

  9. A Magic Lamp(贪心+链表)

    A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  10. Linux高性能server编程——高级I/O函数

     高级I/O函数 pipe函数 pipe函数用于创建一个管道,实现进程间的通信. #include <unistd.h> int pipe(int pipefd[2]); 通过pipe ...