面向切面编程,是spring的一大特点,可以说是spring最独特的特点了(个人认为)。

记得当初学习面向切面编程的时候,可能是面向对象思想根深蒂固了,怎么也理解不了什么叫面向切面。。。

其实对于面向对象学得久的人,刚接触面向切面肯定很难理解,所以辅助记忆很重要。我刚开始记面向切面的时候是这么理解的:

首先,面向对象肯定都熟悉,有不熟悉面向对象的童鞋。。。  建议再去看看java基础。。    然后,还是面相对象,有这么一个对象,需要在这个对象的某一部分增加业务逻辑(切入点),一般什么时候会有切面?  现实中,出现切面的地方一般都会有刀,可以想象一把菜刀,菜刀的面是我们的切面,菜刀上有我们需要注入(还是注入)的方法,然后,我们用菜刀无情的切进对象的切入点(被切对象的方法)。

为什么叫面向切面?  因为当我们要用面向切面的时候,被切的对象往往已经编程完了,不需要动了,我们需要编程,需要修改,需要测试的只是菜刀(切面)而已,所以叫面相切面编程(是不是很容易记住。。)。

这里有我的一个动态代理实现面相切面的一个小例子,有兴趣的童鞋可以看下:http://709002341.iteye.com/admin/blogs/2266317(这是我iteye的博客地址,欢迎大神指点)

下面图文并茂得说一下切面编程的三个步骤:

这是我们的菜刀(切面),首先是面相菜刀(切面)编程:编写好需要切入的各个方法

然后,在配置文件中配置好相应的切入点

然后,一刀下去,程序执行的时候菜刀(切面)就成西瓜(对象)的一部分,被一块执行了。

和现实生活中的切面不同,spring中的切面可以无限使用。

跟前几个例子一样,最后还是用代码说话:

首先说一下场景:见我前几个例子的代码,利用IPrint实现类调用MyBean的print方法打印一个语句。

然后,要实现aop,首先应该编写切面类和切面方法:

package testSpring.business.proxy;

import org.aspectj.lang.annotation.Pointcut;

/**
 *  DynamicProxy :
 * @author xuejupo  jpxue@travelsky.com
 * create in 2016-2-16 下午2:45:26
 */

public class DynamicProxy {

    public void doBefore(){
        System.out.println("doBefore");
    }

    public void doAfterReturning(){
        System.out.println("doAfterReturning");
    }

    public void doAfter(){
        System.out.println("doAfter");
    }

    public void doAfterThrowing(){
        System.out.println("doAfterThrowing");
    }

    public void doAround(){
        System.out.println("doAround");
    }
}

然后,为注册的MyBean定义一个切入点(就是图文的第二步,在xml文件中定义切入点):

<!-- 为userBean定义一个切面 -->
    <bean id="aoc" class="testSpring.business.proxy.DynamicProxy" />
    <aop:config>
        <aop:aspect id="aspet" ref="aoc">
            <aop:pointcut id="cut"
                expression="execution (* testSpring.business.bean.MyBean.*(..))" />
            <aop:before pointcut-ref="cut" method="doBefore" />
            <aop:after-returning pointcut-ref="cut"
                method="doAfterReturning" returning="obj"/>
            <aop:after pointcut-ref="cut" method="doAfter" />
            <aop:after-throwing pointcut-ref="cut" method="doAfterThrowing" />
            <!-- <aop:around pointcut-ref="cut" method="doAround" /> -->
        </aop:aspect>
    </aop:config>

然后执行测试代码:

public void testPrintObject7(){
//        System.out.println(System.getProperty("java.class.path"));
        //读取配置文件(将配置文件中的bean加载进内存)
        ApplicationContext ctx = new ClassPathXmlApplicationContext("/testSpring/resources/applicationContext_proxy.xml");
        //获取的实例
        IPrint bean = (IPrint)ctx.getBean("userBean");
        //调用方法
        bean.printObject();
    }
    

结果:

doBefore
打印对象MyBean:
doAfterReturning
doAfter

上例只是最简单的一个面向切面编程,实际要使用的时候,可能复杂得多(还有注入方式的)。本文只是帮助你理解什么叫面向切面编程,实际使用的时候可以多看看实用教程。

面相切面编程的一般场景是什么? 最主要的一点还是解耦。。。   可见解耦在公司级的编码中是多重要。。。   面相切面编程是将与业务逻辑无关的公共部分抽离开,形成一个横切的关注点(比如权限问题,比如日志问题)。一般情况下,这个横切的关注点在公司里有专人负责,业务逻辑部分的编码人员不需要关心他,公司需要的时候只是配置一下xml文件即可,方便快捷,而且出问题也是切面的负责人负责调试测试,与主逻辑无关。(就像那个图中的菜刀一样,我用菜刀切西瓜还是用菜刀切苹果,菜刀不关心,西瓜也不用关心,握菜刀的人才用关心(公司架构师,或者公司大boss),握菜刀的人负责分配菜刀需要切哪,然后出问题了去告诉造菜刀的人就行,解耦,责任分明,是公司架构中无限追求的事。。。)

spring(三)----大概是最简单的面向切面了的更多相关文章

  1. Spring框架学习笔记(2)——面向切面编程AOP

    介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...

  2. Spring框架使用(控制反转,依赖注入,面向切面AOP)

    参见:http://blog.csdn.net/fei641327936/article/details/52015121 Mybatis: 实现IOC的轻量级的一个Bean的容器 Inversion ...

  3. 简单理解——面向切面编程(AOP)

    在传统的编写业务逻辑处理代码时,我们通常会习惯性地做几件事情:日志记录.事务控制及权限控制等,然后才是编写核心的业务逻辑处理代码.当代码编写完成回头再看时,不禁发现,扬扬洒洒上百行代码中,真正用于核心 ...

  4. 重新学习之spring第二个程序,配置AOP面向切面编程

    第一步:在配置好的ioc容器的基础上,导入面向切面编程所需要的jar包 (本案例用的是spring3.2.4,由于spring3.2.4的官网jar包中不再有依赖包,所以依赖包都是从网上找的) 第二步 ...

  5. Spring企业级程序设计 • 【第3章 面向切面编程】

    全部章节   >>>> 本章目录 3.1 AOP基本概念和术语 3.1.1 AOP概念 3.1.2 AOP的术语解释 3.1.3 通知类型介绍 3.1.4 通过AOP模拟事务操 ...

  6. Spring之注解实现aop(面向切面编程)

    1:Aop(aspect object programming)面向切面编程,名词解释:    1.1:功能:让关注点代码与业务逻辑代码分离    1.2:关注点        重复代码就叫做关注点  ...

  7. spring入门(四)【面向切面编程】

    开发过程中很多时候会用到日志.事务等操作,这些操作如果要写在业务代码中会相当麻烦,这时就会用到面向切面编程(AOP),AOP作为一种编程思想,和OOP有着不同的侧重点,面向对象侧重于万事万物皆对象,而 ...

  8. Spring 面向切面编程(AOP)

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

  9. 03-spring框架—— AOP 面向切面编程

    3.1 动态代理 动态代理是指,程序在整个运行过程中根本就不存在目标类的代理类,目标对象的代理对象只是由代理生成工具(不是真实定义的类)在程序运行时由 JVM 根据反射等机制动态生成的.代理对象与目标 ...

随机推荐

  1. (1) css的核心基础

     css的核心基础 1.css的基本语法在具体使用css之前,请各位兄弟姐妹先思考一个生活中的问题,一般情况下我们是如何描述一个人的呢? 小明{ 民族:汉族: 性格:温柔: 性别:男: 体重:68kg ...

  2. 获取oracle 表字段,表名,以及主键之类等等的信息

    数据库版本号:select * from v$version 数据库名:select * from v$instance 注意: 我在C#项目中查询语句的时候报“ORA-00911: 无效字符” 的错 ...

  3. Android Studio 错误 Duplicate files copied in APK META-INF/LICENSE.txt

    1 .Duplicate files copied in APK META-INF/LICENSE.txt   android { packagingOptions { exclude 'META-I ...

  4. Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]

    在Android studio中想要运行程序,点击运行后程序安装失败,报出如下异常: 原因:在manifest中设置了 .android:sharedUserId="android.uid. ...

  5. js页面文字选中后分享到新浪微博实现

    demo您可以狠狠地点击这里:js文字选中分享到新浪微博demo 方法与代码 选中即分享的功能看上去比较高级,其实实现是相当简单的.其中的会让人头大,一般人也不感兴趣的原理这里就直接跳过.这个js文字 ...

  6. Codeforces Round #306 (Div. 2) A. Two Substrings 水题

    A. Two Substrings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/550/pro ...

  7. HDU 1504 Disk Tree

    转载请注明出处:http://blog.csdn.net/a1dark 分析:查了一下这题.发现网上没有什么关于这道题的解题报告.其实题目意思挺好懂的.就是给你一些文件的目录结构.然后让你把它们组合在 ...

  8. VM参数简介

    http://www.cnblogs.com/yuzhaoxin/p/4083612.html block_dump Linux 内核里提供了一个 block_dump 参数用来把 block 读写( ...

  9. 堆排序-C语言实现

    堆排序 堆排序是利用堆的性质进行的一种选择排序.下面先讨论一下堆. 1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]<=key[2i+1]&&Key[i ...

  10. 重新组织 vs 重新生成索引

    索引是数据库引擎中针对表(有时候也针对视图)建立的特别数据结构,用来帮助查找和整理数据.索引的重要性体现在能够使数据库引擎快速返回查询 结果.当对索引所在的基础数据表进行修改时(包括插入.删除和更新等 ...