需要的Jar包(String3.2)
com.springsource.net.sf.cglib-2.2.0.jar // 作用于cglib方式的动态代理
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
spring-aop-3.2.0.RELEASE.jar

五种增强模式

1、前置增强【before】,在业务代码之前执行增强的服务代码

示例代码如下:
AopUtil.java

// 服务类定义                                      
public class AopUtil {                             
    // 增强函数                                    
    public void showLog(){                         
        System.out.println("调用服务类功能成功!");
    }                                              
}

 

Bean.java

// 业务类实现                                          
public class Bean {                                    
    // 具体业务功能实现                                
    public void callBean(){                            
        System.out.println("调用Bean业务类功能成功!");
    }                                                  
}

配置文件 spring.xml

<?xml version="1.0" encoding="UTF-8"?>                                         
<beans                                                                         
    xmlns="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/beans                        
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
                                                                               
10               http://www.springframework.org/schema/aop                         
11                 http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> 
12                                                                                 
13       <bean id="beanID"  class="aop.xml.Bean" ></bean>                          
14       <bean id="utilID"  class="aop.xml.AopUtil"></bean>                        
15                                                                                 
16       <aop:config proxy-target-class="true">                                    
17           <aop:pointcut expression="execution(public *  *.*(..))" id="pcID"/>   
18                                                                                 
19           <aop:aspect ref="utilID" >                                            
20               <aop:before method="showLog"  pointcut-ref="pcID" />              
21           </aop:aspect>                                                         
22       </aop:config>                                                             
23                                                                                 
24   </beans>

TestSpring.java

// 程序入口                                                          
public class TestSpring {                                            
    public static void main(String[] args) {                         
        ApplicationContext ac = new ClassPathXmlApplicationContext(  
                new String[] { "aop/xml/spring.xml" });              
        Bean bean = (Bean) ac.getBean("beanID");                     
        bean.callBean();                                             
    }                                                                
}

2、后置增强【after】,在业务代码之后执行执行增强的服务代码,与前置增强区别仅在于XML文件中对aop的配置

<aop:config proxy-target-class="true">                                     
        <aop:pointcut expression="execution(public *  *.*(..))" id="pcID"/>
                                                                           
        <aop:aspect ref="utilID" >                                         
            <aop:after method="showLog"  pointcut-ref="pcID" />            
        </aop:aspect>                                                      
</aop:config>

3、正常返回后增强【after-returning】,业务代码正确执行后才会执行服务代码,也就是说若业务代码如果有异常,服务代码就不会执行

<aop:config proxy-target-class="true">                                     
        <aop:pointcut expression="execution(public *  *.*(..))" id="pcID"/>
                                                                           
        <aop:aspect ref="utilID" >                                         
            <aop:after-returning method="showLog"  pointcut-ref="pcID" />  
        </aop:aspect>                                                      
</aop:config>

4、异常后增强【after-throwing】,与after-returning的执行过程相反

<aop:config proxy-target-class="true">                                     
        <aop:pointcut expression="execution(public *  *.*(..))" id="pcID"/>
                                                                           
        <aop:aspect ref="utilID" >                                         
            <aop:after-throwing method="showLog"  pointcut-ref="pcID" />   
        </aop:aspect>                                                      
</aop:config>

5、方法环绕增强【around】

<aop:config proxy-target-class="true">                                            
        <aop:pointcut expression="execution(public *  *.callBean(..))" id="pcID"/>
                                                                                  
        <aop:aspect ref="utilID" >                                                
            <aop:around method="writeLog"  pointcut-ref="pcID" />                 
        </aop:aspect>                                                             
</aop:config>
// 服务类定义
public class AopUtil {
   
    public void writeLog(ProceedingJoinPoint point) throws Throwable{
        System.out.println("调用服务类功能【writeLog】成功!");
        point.proceed();
    }
}

方法环绕增强与前面四种增强的主要区别在于,业务代码调用的控制在服务类的增强函数中 point.proceed()

XML方式配置stringAop总结:
确定动态代理方式JDK还是CGILIB有proxy-target-class属性字段的值确定,false表示采用JDK自带的动态代理,true表示采用 CGLIB动态代理;确定切入点即业务类中实现的业务方法,由属性值aop:pointcut expression确定,id=”pcID”建立业务方法的ID值execution属性值格式:
execution(修饰符 返回值 包名.类名.方法名(参数) 异常),其中修饰符、包名、类名、异常可以省略也支持通配符*,返回类型、方法名、参数不能省略但支持通配符*;
业务方法与服务方法建立关系由aop:aspect配置确定,ref=”utilID”指定服务类对象,
<aop:增强方式 method=增强方法 pointcut-ref=业务方法ID值 />

 

注解方式实现stringAop示范例代码:

spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans                                                                                
    xmlns="http://www.springframework.org/schema/beans"                               
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                             
    xmlns:aop="http://www.springframework.org/schema/aop"                             
    xmlns:context="http://www.springframework.org/schema/context"                     
                                                                                      
    xsi:schemaLocation="                                                              
            http://www.springframework.org/schema/beans                               
10               http://www.springframework.org/schema/beans/spring-beans-2.5.xsd         
11                                                                                        
12               http://www.springframework.org/schema/aop                                
13                 http://www.springframework.org/schema/aop/spring-aop-3.0.xsd           
14                                                                                        
15                 http://www.springframework.org/schema/context                          
16                 http://www.springframework.org/schema/context/spring-context-3.0.xsd" >
17                                                                                        
18       <!-- 打开注解开关, 开关打开后才能解析@符号表示的注解 -->                        
19       <context:annotation-config />                                                    
20       <!-- 扫描指定包下的注解,也就是指定需解析注解的路径 -->                          
21       <context:component-scan base-package="annotation"></context:component-scan>      
22       <!-- 告诉springAop,产生业务类的动态代理对象,并切入到对应服务类方法中 -->        
23       <aop:aspectj-autoproxy/>                                                         
24   </beans>

Bean.java 

// 业务类实现                                              
//@Component表示业务Bean实例化                             
@Component(value="beanID")                                 
public class Bean {                                        
    // 具体业务功能实现,通过@Pointcut注解注册切入点       
    @Pointcut (value="execution(public *  *.callBean(..))")
    public void callBean(){                                
        System.out.println("调用Bean业务类功能成功!");    
    }                                                      
10   }

AopUtil.java

// 服务类定义                                                                 
//@Aspect表示AopUtil为切面,@Component(value="aopUtilID")对AopUtil类进行实例化
@Aspect                                                                       
@Component(value="aopUtilID")                                                 
public class AopUtil {                                                        
    // @Before确定为增强模式为前置增强,value的值表示增强的业务函数           
    @Before (value="annotation.Bean.callBean()")                              
    public void writeLog(){                                                   
        System.out.println("调用服务类功能【writeLog】成功!");               
10       }                                                                        
11  }

TestSpring.java   // 程序入口

public class TestSpring {                                          
    public static void main(String[] args) {                       
        ApplicationContext ac = new ClassPathXmlApplicationContext(
                new String[] { "annotation/spring.xml" });         
        Bean bean = (Bean) ac.getBean("beanID");                   
        bean.callBean();                                           
    }                                                              
}

注解说明:
@Component(value=自定义ID名称)作用于需实例化的类,并将实例化后的类对象加入Bean工厂;
@Aspect 指定作用于springAop中的切面类;
@Before (value="业务方法名")指定springAop中增强模式及需要增强的业务方法,业务方法名需带包名;
@Pointcut (value="execution表达式)") 指定springAop切入点业务方法;
@Resource(name="自定义ID名称")在Bean工厂中查找对应的ID名称对象,并注入到修饰的方法中,例子如下:

private Unit unit;                  
    @Resource(name="unitID")        
    public void setUnit(Unit unit) {
        this.unit = unit;                                  
}

Spring笔记(四)SpingAOP的更多相关文章

  1. Spring笔记四

    Spring-04 1.Spring整合Junit ①导入依赖 <!-- junit --> <dependency> <groupId>junit</gro ...

  2. Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven)

    Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven) 本篇和 Spring 没有什么关系,只是学习 Spring,必备一些知识,所以放在这里了. 本篇内容: (1)M ...

  3. Spring笔记(6) - Spring的BeanFactoryPostProcessor探究

    一.背景 在说BeanFactoryPostProcessor之前,先来说下BeanPostProcessor,在前文Spring笔记(2) - 生命周期/属性赋值/自动装配及部分源码解析中讲解了Be ...

  4. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  5. 《MFC游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9327377 作者:七十一雾央 新浪微博:http:// ...

  6. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  7. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  8. Java学习笔记四---打包成双击可运行的jar文件

    写笔记四前的脑回路是这样的: 前面的学习笔记二,提到3个环境变量,其中java_home好理解,就是jdk安装路径:classpath指向类文件的搜索路径:path指向可执行程序的搜索路径.这里的类文 ...

  9. Java加密与解密笔记(四) 高级应用

    术语列表: CA:证书颁发认证机构(Certificate Authority) PEM:隐私增强邮件(Privacy Enhanced Mail),是OpenSSL使用的一种密钥文件. PKI:公钥 ...

随机推荐

  1. mysql存储过程讲解

    1.数据库存储过程:简单滴说,存储过程就是存储在数据库中的一个程序. 2..数据库存储过程作用: 第一:存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快. 第二:存储过程可以接受参数.输出参 ...

  2. 在VS中手工创建一个最简单的WPF程序

    如果不用VS的WPF项目模板,如何手工创建一个WPF程序呢?我们来模仿WPF模板,创建一个最简单的WPF程序. 第一步:文件——新建——项目——空项目,创建一个空项目. 第二步:添加引用,Presen ...

  3. MVC-各种传值方式

    [转自]:QLeelulu示例一:ViewData传值.HomeController.cs Co de: public ActionResult Index(){     ViewData[" ...

  4. 【BZOJ】1012: [JSOI2008]最大数maxnumber 树状数组求区间最值

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1012 题意:维护一个数列,开始时没有数值,之后会有两种操作, Q L :查询数列末 ...

  5. CF Rook, Bishop and King

    http://codeforces.com/contest/370/problem/A 题意:车是走直线的,可以走任意多个格子,象是走对角线的,也可以走任意多个格子,而国王可以走直线也可以走对角线,但 ...

  6. POJ 3352 Road Construction (边双连通分量)

    题目链接 题意 :有一个景点要修路,但是有些景点只有一条路可达,若是修路的话则有些景点就到不了,所以要临时搭一些路,以保证无论哪条路在修都能让游客到达任何一个景点 思路 :把景点看成点,路看成边,看要 ...

  7. php访问类静态属性

    在类的外部,如果要使用到类的静态变量,则可以使用 :: 操作符. <?php class A { static $x = 10; function test() { echo self::$x; ...

  8. 在8086中,[ idata],[bx]表示内存单元时。可能是一个字节,也可能是一个字。

    可能表示一个字节,也可能表示一个字.主要由指令中另一个计算对象决定.如al表示一个字节.ax就表示一个字. 这个区别主要体现在循环中,偏移地址的循环变量是加1还是加2,al是偏移地址加1,ax是偏移地 ...

  9. IIS虚拟目录实现与文件服务器网络驱动器映射共享

    这篇文章转载别人,想原创作者致敬! 我本人也遇到同样的问题,故转载记录. 本文重点描述如何使用IIS访问共享资源来架设站点或执行 ASP.Net 等脚本. 通常情况下,拥有多台服务器的朋友在使用IIS ...

  10. easyui源码翻译1.32--NumberBox(数值输入框)

    前言 扩展自$.fn.validatebox.defaults.使用$.fn.numberbox.defaults重写默认值对象.下载该插件翻译源码 数值输入框是用来限制用户只能输入数值型数据的.他可 ...