重新学习之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.springframework.org/schema/beans"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xmlns:aop="http://www.springframework.org/schema/aop"
 5         xmlns:tx="http://www.springframework.org/schema/tx"
 6         xsi:schemaLocation="
 7             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 8             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
 9             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
10
11     <!--
12         lazy-init:true 懒加载,初始ioc化容器的时候,不建立对象
13         lazy-init:false(默认) 不懒加载,初始化ioc容器的时候,就讲applicationContext.XML中所有配置的类的对象创建,并建立关系
14         scope:prototype每次取对应id的类的对象,都新创建一个
15         scope:singleton(默认)类似于单例模式,只要容器初始化一个类对象,以后所有的取用,都是取这一个
16       -->
17
18       <!-- 通过setter方法,依赖注入对象。控制反转 -->
19     <bean id="userDao" class="com.bjsxt.shang.dao.UserDao" lazy-init="default" scope="singleton"></bean>
20     <bean id="MyAction" class="com.bjsxt.shang.action.MyAction" lazy-init="default" scope="prototype">
21         <property name="userDao" ref="userDao"></property>
22     </bean>
23
24
25     <!-- 定义一个切面(连接点,切入点,通知) -->
26     <bean id="log" class="com.bjsxt.shang.aop.LogTextAop"></bean>
27     <aop:config >
28         <!-- 切入点,将dao包下所有有参数或无参数传入的,有返回值或无返回值类型的公共方法,进行代理。 -->
29         <aop:pointcut expression="execution(public * com.bjsxt.shang.dao.*.*(..))" id="logCut"/>
30         <aop:pointcut expression="execution(public String com.bjsxt.shang.dao.*.*(..))" id="logCut2"/>
31         <aop:pointcut expression="execution(public * com.bjsxt.shang.dao.*.find*(..))" id="logCut3"/>
32         <!-- 通知,也就是代理对象中增强功能代码的编写 -->
33         <aop:aspect ref="log">
34             <!-- 代理,是为了抽出一些通用需求的功能,因此该属性指定的代理时调用增强功能的方法 -->
35             <!-- 连接点执行前或后,执行通用的代码 -->
36             <aop:before method="beforeRun1" pointcut-ref="logCut"/>
37             <aop:after method="afterRun2" pointcut-ref="logCut2"/>
38             <!-- 环绕通知,有参数的传递,可对参数传递进行处理 -->
39             <aop:around method="aroundRun" pointcut-ref="logCut3"/>
40         </aop:aspect>
41     </aop:config>
42
43
44
45 </beans>

第三步:在appliactionContext.xml中指定的面向切面编程的代理切面类。

 1 package com.bjsxt.shang.aop;
 2
 3 import java.util.Date;
 4
 5 import org.aspectj.lang.ProceedingJoinPoint;
 6
 7 import com.alibaba.fastjson.JSONObject;
 8 /**
 9  * 面向切面编程,是对一个集合的方法(切入点切中的符合表达式的所有方法)进行代理,也就是说在执行这些集合中的方法时,会执行该代理切面类中的相关指定方法,做到日志记录,增强功能,等等效果。
10  * 而且属于热插拔式的。像usb一样,可去掉,可插入。而不影响项目的主要功能
11 * @ClassName: LogTextAop
12 * @Description: TODO(这里用一句话描述这个类的作用)
13 * @author 尚晓飞
14 * @date 2014-8-29 下午2:55:38
15 *
16  */
17 public class LogTextAop {
18     /**
19      * 连接点(方法)执行前执行该方法
20     * @Title: beforeRun1
21     * @Description: TODO(这里用一句话描述这个方法的作用)
22     * @return void    返回类型
23     * @author 尚晓飞
24     * @date 2014-8-29 上午11:08:41
25      */
26     public void beforeRun1(){
27         System.out.println("LogTextAop.beforeRun1()连接点执行前,我执行了该方法。aop-----前---------");
28     }
29     /**
30      * 连接点(方法)执行后执行该方法
31     * @Title: afterRun2
32     * @Description: TODO(这里用一句话描述这个方法的作用)
33     * @return void    返回类型
34     * @author 尚晓飞
35     * @date 2014-8-29 下午1:47:40
36      */
37     public void afterRun2(){
38         System.out.println("LogTextAop.afterRun2()连接点执行后,我执行了该方法、aop-----后--------");
39     }
40
41     /**
42      * 连接点(方法)执行前后都会执行的方法
43     * @Title: aroundRun
44     * @Description: TODO(这里用一句话描述这个方法的作用)
45     * @param pjp
46     * @return
47     * @return Object    返回类型
48     * @author 尚晓飞
49     * @date 2014-8-29 下午2:05:39
50      */
51     public Object aroundRun(ProceedingJoinPoint pjp){
52         //获取委托类方法传入的参数
53         Object[] objs=pjp.getArgs();
54         //获取委托类方法的名字
55         String methdoName=pjp.getSignature().getName();
56         //获取委托类的一个对象
57         Object object=pjp.getTarget();
58
59         //生成一个jsonobject对象
60         JSONObject jsonObject=new JSONObject();
61
62         try {
63                 if(!methdoName.startsWith("find")){
64                     System.out.println("LogTextAop.aroundRun(连接点执行前执行----aop-around---前)");
65                         Object obj=pjp.proceed();
66                     System.out.println("LogTextAop.aroundRun(连接点执行后执行----aop-around---后)");
67                     return obj;
68
69                 }else{
70                     System.out.println("LogTextAop.aroundRun(连接点执行前执行----aoparound---前)");
71                     System.out.println("LogTextAop.aroundRun(操作时间)"+new Date().toLocaleString());
72                     System.out.println("LogTextAop.aroundRun(操作类型)"+methdoName);
73                     System.out.println("LogTextAop.aroundRun(操作内容)"+jsonObject.toJSONString(objs));
74                     Object obj=pjp.proceed();
75                     System.out.println("LogTextAop.aroundRun(连接点执行后----aoparound----后)");
76                     return obj;
77                 }
78         } catch (Throwable e) {
79             e.printStackTrace();
80         }
81         return null;
82     }
83
84 }

第四步:测试面向切面编程的demo(省去了action,dao包下的类的源代码)

 1 package com.bjsxt.shang.test;
 2
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5
 6 import com.bjsxt.shang.action.MyAction;
 7 import com.bjsxt.shang.dao.UserDao;
 8
 9 public class Test {
10     public static void main(String[] args) {
11
12
13
14                 //官方推荐,建立xml文件,配置程序中对象,和建立对象间关系的是applicationContext.xml
15                 //平民版的xml是 beans.xml controller.xml dao.xml service.xml
16                 //获取解析,并依赖注入applicationContext.XML文件的ioc容器
17                 //ApplicationContext acIoc=new ClassPathXmlApplicationContext("applicationContext.xml");
18                 ApplicationContext ioc=new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
19
20
21                 //获取所有的ioc容器
22                 //BeanFactory是所有Spring Ioc容器的父接口
23                 //BeanFactory beanFactory=new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
24
25                 UserDao dao=(UserDao)ioc.getBean("userDao");
26                 UserDao dao1=(UserDao) ioc.getBean("userDao");
27                 //测试IOC容器中生成的对象是不是单例的。
28                 System.out.println(dao==dao1);
29
30                 MyAction userAction=(MyAction) ioc.getBean("MyAction");
31                 //userAction.add();
32                 //userAction.lang();
33                 userAction.ds();
34     }
35
36 }

测试截图

AOP介绍
   Aspect Oriented Programing 面向切面编程
    (1)如果说面向对象编程是关注将需求功能划分为不同的并且相对独立,封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系的话;
    (2)面向方面编程则是希望能够将通用需求功能从不相关的类当中分离出来,能够使得很多类共享一个行为,一旦发生变化,不必修改很多类,而只需要修改这个行为即 可。
  AOP主要应用于日志记录,性能统计,安全控制,事务处理等方面。
     (1)前面我们讲的struts2中的拦截器,就是AOP的一种实现!

AOP的内部实现都是通过动态代理来实现。动态代理有两种常见的方式:
  1.    JDK提供的代理生成方式(Proxy,  InvocationHandle)
  2.    cglib 类库(spring和hibernate使用它)

AOP基本概念
}    连接点(Joinpoint)
?     在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 总是 代表一个方法的执行。
}    切入点(Pointcut)
?    匹配连接点(Joinpoint)的断言(是一种连接点的条件,判断特征)。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
    -->public void com.bjsxt.dao.userDao.*.*()
              :所有userDao包下的无返回值,无参数传入的,公共方法
    -->public *()
              :所有的公共方法
    -->public void com.bjsxt.dao.userDao.*.(..)
              :所有userDao包下的有参传入的无返回值的,公共的方法。
}    通知(Advice)
?    在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。
增强功能的代码编写区 。如日志记录,访问控制,增强功能。
}    切面(Aspect)
?    一个关注点的模块化,这个关注点可能会横切多个对象。
包含了:连接点、切入点、通知。可以通过@Aspect定义为一个类
}    目标对象(Target Object)
     说白话就是----》委托类
?    被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做被通知(advised) 对象。
}    织入(Weaving)
        制作代理类,和代理对象的过程
?    把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。

通知的类型
}    前置通知(Before advice)
?    在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
}    返回后通知(After returning advice)
?    在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。
}    抛出异常后通知(After throwing advice)
?    在方法抛出异常退出时执行的通知。
}    后通知(After (finally)advice)
?    当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
}    环绕通知(Around Advice)
?    包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。

时间: 2024-08-14 21:41:16

重新学习之spring第二个程序,配置AOP面向切面编程的相关文章

Spring(二):AOP(面向切面编程),Spring的JDBC模板类

1 AOP概述 1.2 什么是AOP 在软件业,AOP为Aspect Oriented Programmig的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. AOP解决了OOP遇到一些问题,采取横向抽取机制,取代了传统

深入探索spring技术内幕(七): 配置Spring AOP面向切面编程

一. AOP一些概念 Aspect( 切面 ): 指横切性关注点的抽象即为切面, 它与类相似, 只是两者的关注点不一样, 类是对物体特征的抽象, 而切面横切性关注点的抽象. joinpoint( 连接点 ): 指那些被拦截到的点. 在spring中, 这些点指的是方法, 因为spring只支持方法类型的连接点, 实际上joinpoint还可以是field或类构造器) Pointcut( 切入点 ): 指我们要对那些joinpoint进行拦截的定义. Advice( 通知 ): 指拦截到joinp

浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~

简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring框架的,这就说明你有权选择是否要用AOP来完成一些业务. AOP面向切面编程,通过另一种思考的方式,来弥补面向对象编程OOP当中的不足,OOP当中最重要的单元是类,所以万物皆对象,万物皆是 对象类.而在AOP的模块单元中,最基础的单元是切面,切面对切点进行模块化的管理. 最后再提一句:Spring当

sprint.net(2) AOP面向切面编程,spring.net的环绕通知;Spring.net的AOP通知的四种类型

AOP 有点类似于我们MVC里面的Filter过滤器,例如在MVC里面,如果给一个Action上打一个标签,就可以在这个Action执行之前或者之后,额外的执行一个方法,这个就相当于是面向切面编程. 无侵入式的. (也就是在不改变原来的代码的情况下,来跳转到一个其他的方法,执行完毕后回到主方法..),但是spring.net的AOP更牛叉,只需要在xml里面配置,就可以了,不需要在方法上面打特性的标签,也不需要继承什么类(例如MVC的过滤器是继承了ActionFilterAttribute) 主

spring入门-AOP 面向切面编程

AOP 面向切面编程 在日常开发中最后将业务逻辑定义在一个专门的service包下,而实现定义在service包下的impl包中, 服务接口以IXXXService形式,而服务实现就是XXXService,这就是规约设计 步骤: 1.E:\Users\WorkSpaces\KmwalletApp\spring\aop\test\HelloWorldService.java 继承(implements)xx接口 2.E:\Users\WorkSpaces\KmwalletApp\spring\ao

Spring:AOP, 面向切面编程

AOP概述 什么是AOP, 面向切面编程 AOP为Aspect Oriented Programming的缩写, 意为:面向切面编程, 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP是OOP的延续, 是函数式编程的一种衍生范型. 利用AOP可以对业务逻辑的各个部分进行隔离, 从而使得业务逻辑各部分之间的耦合度降低, 提高程序的可重用性, 同时提高了开发的效率. - 传统开发模型: 纵向的编程.  面向切面编程: 纵横配合的编程. AOP的作用及优势 作用: 在程序运行期

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

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

spring AOP面向切面编程学习笔记

一.面向切面编程简介: 在调用某些类的方法时,要在方法执行前或后进行预处理或后处理:预处理或后处理的操作被封装在另一个类中.如图中,UserService类在执行addUser()或updateUser方法前开启事务,执行完后要提交事务:而几乎所有数据库操作都是如此,那么就可以将事务操作的方法提取出封装到一个类里.然后再利用代理类进行处理(目标类方法增强),返回代理类对象 二.AOP相关术语 Target:目标类,需要被增强的类. JoinPoint:连接点,目标类上需要被增强的方法.(这些方法

从源码入手,一文带你读懂Spring AOP面向切面编程

之前<零基础带你看Spring源码--IOC控制反转>详细讲了Spring容器的初始化和加载的原理,后面<你真的完全了解Java动态代理吗?看这篇就够了>介绍了下JDK的动态代理. 基于这两者的实现上,这次来探索下Spring的AOP原理.虽然AOP是基于Spring容器和动态代理,但不了解这两者原理也丝毫不影响理解AOP的原理实现,因为大家起码都会用. AOP,Aspect Oriented Programming,面向切面编程.在很多时候我们写一些功能的时候,不需要用到继承这么