spring(三)----大概是最简单的面向切面了

面向切面编程,是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  [email protected]
 * 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),握菜刀的人负责分配菜刀需要切哪,然后出问题了去告诉造菜刀的人就行,解耦,责任分明,是公司架构中无限追求的事。。。)

时间: 2024-10-12 13:58:50

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

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

参见:http://blog.csdn.net/fei641327936/article/details/52015121 Mybatis: 实现IOC的轻量级的一个Bean的容器 Inversion of control 控制反转:由容器控制程序之间的关系,不是程序代码操作 Depend Inject 依赖注入 Aspect oriented programming 面向切面编程 Spring能帮助我们根据配置文件创建及组装对象之间的依赖关系: Spring面向切面编程能帮助我们无耦合的实现日

Spring框架深入(二)--AOP面向切面

一.AOP概述 1.AOP:面向切面编程,实现在不增加代码的基础上,增加一些新的功能(公共功能): 2.AOP并不是Spring框架持有的,Spring只是支持AOP编程的框架之一,可以整合第三方框架来实现面向切面编程(如:Aspect): 3.现实的应用场景:使用面向切面编程,AOP框架已经实现了面向切面的很多内容: 4.程序员使用AOP要做的事情: 编写公共功能,切面: 基于AOP框架的配置,直接把核心业务和切面关联起来: 5.Spring中实现AOP的方式有三种: 基于AspectJ注解的

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

第一步:在配置好的ioc容器的基础上,导入面向切面编程所需要的jar包 (本案例用的是spring3.2.4,由于spring3.2.4的官网jar包中不再有依赖包,所以依赖包都是从网上找的) 第二步:配置applicationContext.xml(包括ioc对象配置,以及面向切面编程的相关配置) 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.sp

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

开发过程中很多时候会用到日志.事务等操作,这些操作如果要写在业务代码中会相当麻烦,这时就会用到面向切面编程(AOP),AOP作为一种编程思想,和OOP有着不同的侧重点,面向对象侧重于万事万物皆对象,而面向切面编程则侧重于事务的一个方面.在面向切面编程过程中有几个比较重要的概念:切面.切点.连接点.通知, 通知:描述了切面要完成的工作,例如,要向某个方法注入日志功能,这里的日志功能就是通知:通知分为5种:Before.After.After-returning.After-throwing.Aro

Spring 面向切面编程(AOP)

Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Control – IOC) 理解依赖注入(DI – Dependency Injection) Bean XML 配置(1)- 通过XML配置加载Bean Bean XML 配置(2)- Bean作用域与生命周期回调方法配置 Bean XML 配置(3)- 依赖注入配置 Bean XML 配置(

详解Spring面向切面编程(AOP)三种实现

一.什么是AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入封装.继承.多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合.不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能.日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性.异常处理和透明的持续性也都是如此,这

spring框架学习(三)——AOP( 面向切面编程)

AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 所谓的周边功能,比如性能统计,日志,事务管理等等 周边功能在Spring的面向切面编程AOP思想里,即被定义为切面 在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发 然后把切面功能和核心业务功能 "编织" 在一起,这就叫AOP 原理图 1. 功能分两大类,辅助功能和

Spring面向切面 --- AspectJ --- 简单使用

Spring面向切面 --- AspectJ --- 简单使用 昨天回复说说的时候突然写下了下面的一段话:分享一下: <!--******************************************* 其实经过的记忆是可以进行道德化的篡改的,就像夏目漱石的<我是猫>:但是不管怎么改,真正的事实是由每一个人的碎片拼起来的:经济学里计算成本的是在计算将来的成本而不是过去的成本,就像动漫<未来日记>一样:过去发生的事情总是在影响着将来,但是过去发生的事情却不能充当将来下

Spring(三)--AOP【面向切面编程】、通知类型及使用、切入点表达式

1.概念:Aspect Oriented Programming 面向切面编程 在方法的前后添加方法 2.作用:本质上来说是一种简化代码的方式 继承机制 封装方法 动态代理 -- 3.情景举例 ①数学计算器接口[MathCalculator] int add(int i,int j); int sub(int i,int j); int mul(int i, int j); int div(int i,int j); 因为后面的通知方法需要返回值,所以在这里类型声明为 int 类型 public