AOP编程,spring实现及JDK,CGLIB实现
什么是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实现的更多相关文章
- Spring @Trasactionl 失效, JDK,CGLIB动态代理
@Transaction: http://blog.csdn.net/bao19901210/article/details/41724355 Spring上下文: http://blog.csd ...
- 【Spring】AOP的代理默认是Jdk还是Cglib?
菜瓜:你觉得AOP是啥 水稻:我觉得吧,AOP是对OOP的补充.通常情况下,OOP代码专注功能的实现,所谓面向切面编程,大多数时候是对某一类对象的方法或者功能进行增强或者抽象 菜瓜:我看你这个理解就挺 ...
- Spring第五篇【cglib、手动实现AOP编程】
前言 到目前为止,已经简单学习了Spring的Core模块.也会怎么与Struts2框架进行整合了-.于是我们就开启了Spring的AOP模块了-在讲解AOP模块之前,首先我们来讲解一下cglib代理 ...
- 使用spring方式来实现aop编程
1:什么是aop? Aspect Oriented Programming 面向切面编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译 ...
- Spring框架--AOP编程
2 手动实现AOP编程 AOP 面向切面的编程, AOP可以实现"业务代码"与"关注点代码"分离 // 保存一个用户 public void add(User ...
- Spring之AOP编程
一.AOP简介 AOP的英文全称是Aspect Oriented Programming,意为:面向切面编程. AOP采取横向抽取的机制,取代了传统纵向继承体系的代码复用.AOP常用于 ...
- Spring的AOP编程
1.手动实现AOP编程(代理模式) AOP是面向切面的编程,主要功能就是实现"业务代码"和辅助业务代码的"关注点代码"分离.在一个方法中,出了核心的业务代码,其 ...
- Spring入门3.AOP编程
Spring入门3.AOP编程 代码下载: 链接: http://pan.baidu.com/s/11mYEO 密码: x7wa 前言: 前面学习的知识是Spring在Java项目中的IoC或DJ,这 ...
- Spring框架的AOP编程,最通俗的语言解释,易懂易学
第七章:AOP技术 前言: AOP技术是根据动态代理设计模式进行的技术.动态代理技术分jdk动态代理和cglib动态代理 jdk动态代理特点: (1)继承java.lang.reflect.proxy ...
随机推荐
- ARPU_百度百科
ARPU_百度百科 ARPU
- onmouseover和onmouseout的烦恼
一个DIV层,当鼠标移进的时候会触发onmouseover,移出的时候会触发onmouseout. 非常easy的逻辑,这也是我们想要的!但随之烦恼也就来了:onmouseover并不会仅仅在移进 ...
- 制作Orcad的变种BOM(Variant BOM)
通常在Orcad中画的原理图并不仅仅是用于一款产品.比如一个控制器原理图,可能相应着很多款子产品线,而这些子产品线之间的差别就是通讯口组件不同,少焊几个芯片,或者仅仅是少焊几个电阻. 可是这样交付生产 ...
- java的数据类型,几个java小程序
1:求圆的面积 还好看了c++,不然直接看这课件还真是看不懂……加油吧 要从键盘读入数据可以用Scanner类的nextlnt()或者nextDouble()方法,首先创建Scanner类的一个实例, ...
- POJ 1562(L - 暴力求解、DFS)
油田问题(L - 暴力求解.DFS) Description The GeoSurvComp geologic survey company is responsible for detecting ...
- 一致性算法--Paxos
分布式一致性算法--Paxos Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法.Paxos算法解决的问题是一个分布式系统如何就某个值(决议) ...
- uva 816 - Abbott's Revenge(有点困难bfs迷宫称号)
是典型的bfs,但是,这个问题的目的在于读取条件的困难,而不是简单地推断,需要找到一种方法来读取条件.还需要想办法去推断每一点不能满足条件,继续往下走. #include<cstdio> ...
- iOS viewController添加导航条以及返回跳转选择
给单独的viewcontroller或者在Appdelegate的主页面添加导航条,只要在viewcontroller上添加navigationcontroller,在添加此navigationcon ...
- swift 关于 toolbar 学习笔记
import UIKit class ViewController: UIViewController { @IBOutlet weak var toolBar: UIToolbar! @IBOutl ...
- 再造 “手机QQ” 侧滑菜单(三)——视图联动
代码示例:https://github.com/johnlui/SwiftSideslipLikeQQ 本 文中,我们将一起使用 UINavigationController 来管理主视图,并实现点击 ...