Spring(五)AOP简述

一、AOP简述

AOP全称是:aspect-oriented programming,它是面向切面编号的思想核心,

AOP和OOP既面向对象的编程语言,不相冲突,它们是两个相辅相成的设计模式型

AOP技术弥补了面向对象编程思想的不足,spring aop是实现aop的一种技术,srping aop是spring框架中某个子框架或者子功能所依赖的核心。

SPring的容器并不依赖于AOP

这意味着程序员可以自己选择是否使用aop技术,aop提供强大的中间件解决方案,这使用spring ioc容器更加的完善

二、一些术语

2.1、术语

  • Cross-cutting concern:系统层面上的服务穿插到业务逻辑的处理流程之中
  • Aspect:当需要时,将其放到应用程序之上,不需要时,将其从应用程序中脱离出来
  • Advcie:是Aspect具体的实现,advice包括cross-cutting conerns的行为或者所提供的服务
  •  Joinpoint:Aspect在应用程序执行时加入业务流程的时机
  • Pointcut:指定某个aspect在那些joinpoint时被穿插至应用程序之上
  • Target:一个advice被应用的对象或者目标对象
  • Instruction:为已经编写,编译完成的类,在执行时期动态的加入一些方法而不用修改或者增加任何代码
  • Weave:被应用 到对象之上的过程

2.2、Spring对AOP的支持

纯Java语言来编写

定义pointcutes可以使用配置文件

不支持属性成员的jointpoints.(spring 设计思想认为支持属性成员的jointpoints会破坏对象的封装性)

三、Spring创建Advice

3.1、Before Advice

目标对象的方法执行之前被调用

通过实现MethodBeforeAdvice接口来实现

MethodBeforeAdvice 继承自BeforeAdvice,而BeforeAdvice又继承Advice接口,before方法会在目标对象target所指定的方法执行之前被调用执行。before返回值为void 没有返回返回值,在before方法执行完成之后,才开始执行目标对象的方法.

3.2、实例

package com.pb;
/**
 * 接口
 * @author Administrator
 *
 */
public interface IHello {

    public void sayHello(String str);

}
package com.pb;
/**
 * 接口实现类
 * @author Administrator
 *
 */
public class Hello implements IHello {

    @Override
    public void sayHello(String str) {
        System.out.println("Hello    "+str);

    }

}

代理类

package com.pb;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;
/**
 * 在方法执行前调用
 * @author Administrator
 *实现了MethodBeforeAdvcie接口
 */
public class SayHelloBeforeAdvice implements MethodBeforeAdvice {

    @Override
    public void before(Method arg0, Object[] arg1, Object arg2)
            throws Throwable {
        System.out.println("====在方法执行前调用======");

    }

}

applicationContext.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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

<!-- 建立目标对象实例 -->
<bean id="hello" class="com.pb.Hello"/>
<!--  设定Advice实例-->
<bean id="sayBeforeAdvice" class="com.pb.SayHelloBeforeAdvice" />
<!-- 建立代理对象 -->
<bean id="hellProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 设置代理接口 -->
<property name="proxyInterfaces">
<value>com.pb.IHello</value>
</property>
<!--  设置目标对象实例-->
<property name="target">
<ref local="hello"/>
</property>
<!--  设定Advice实例-->
<property name="interceptorNames">
<list>
<value>sayBeforeAdvice</value>
</list>
</property>
</bean>

</beans>

测试类

package com.pb;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 测试类
 * @author Administrator
 *
 */
public class Test {

    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        IHello iHello=(IHello) context.getBean("hellProxy");
        iHello.sayHello("AOP");

    }

}

结果:

====在方法执行前调用======
Hello    AOP

3.3、After Advice

在目标对象方法执行之后被调用

通过实现AfterReturningAdvice接口来实现

在以上代码上增加

package com.pb;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;
/*
 * 在方法执行完后调用
 * 实现 AfterRetruningAdvice接口
 */
public class SayAfterAdvice implements AfterReturningAdvice {

    @Override
    public void afterReturning(Object arg0, Method arg1, Object[] arg2,
            Object arg3) throws Throwable {
        System.out.println("=========在方法执行完后调用=======");

    }

}

applicationContext.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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

<!-- 建立目标对象实例 -->
<bean id="hello" class="com.pb.Hello"/>
<!--  设定beforAdvice实例-->
<bean id="sayBeforeAdvice" class="com.pb.SayHelloBeforeAdvice" />
<!-- 设定AfterAdvice实例 -->
<bean id="sayAfterAdvice" class="com.pb.SayAfterAdvice" />
<!-- 建立代理对象 -->
<bean id="hellProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 设置代理接口 -->
<property name="proxyInterfaces">
<value>com.pb.IHello</value>
</property>
<!--  设置目标对象实例-->
<property name="target">
<ref local="hello"/>
</property>
<!--  设定Advice实例-->
<property name="interceptorNames">
<list>
<value>sayBeforeAdvice</value>
<value>sayAfterAdvice</value>
</list>
</property>
</bean>
</beans>

测试类不变,结果:

====在方法执行前调用======
Hello    AOP
=========在方法执行完后调用=======

3.4、Around Advice

在方法执行之间和之后来执行相应的操作

要实现接口MethodInterceptor接口

package com.pb;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class SayAroundAdvice implements MethodInterceptor {

    @Override
    public Object invoke(MethodInvocation arg0) throws Throwable {
        System.out.println("=========在方法执行之前做点事情");
        Object result=arg0.proceed();
        System.out.println("在方法执行之后做点事情=========");
        return result;
    }

}

配置文件

<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

<!-- 建立目标对象实例 -->
<bean id="hello" class="com.pb.Hello"/>
<!--  设定beforAdvice实例-->
<bean id="sayBeforeAdvice" class="com.pb.SayHelloBeforeAdvice" />
<!-- 设定AfterAdvice实例 -->
<bean id="sayAfterAdvice" class="com.pb.SayAfterAdvice" />
<!-- 设定AroundAdvice实例 -->
<bean id="sayRoundAdvice" class="com.pb.SayAroundAdvice" />
<!-- 建立代理对象 -->
<bean id="hellProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 设置代理接口 -->
<property name="proxyInterfaces">
<value>com.pb.IHello</value>
</property>
<!--  设置目标对象实例-->
<property name="target">
<ref local="hello"/>
</property>
<!--  设定Advice实例-->
<property name="interceptorNames">
<list>
<!-- <value>sayBeforeAdvice</value>
<value>sayAfterAdvice</value> -->
<value>sayRoundAdvice</value>
</list>
</property>
</bean>

</beans>

3.5、THrowsAdvice

异常发生的时候,通知某个服务对象做处理

实现ThrowsAdvice接口

package com.pb;

import java.lang.reflect.Method;

import org.springframework.aop.ThrowsAdvice;

public class SayThowsAdvice implements ThrowsAdvice {

    public void afterThrowing(Method method,Object[] objs,Object target,Throwable ta){
        System.out.println("异常发生: "+ta+" 抛出异常的是: "+method);
    }
}

四、基于XML Schema

简化代码实现

容易对应程序进行维护

所有元素都定义在<aop:config>中

五、基于Annotation

以注解的方式对Java普通类进行标注

时间: 2024-08-05 10:52:53

Spring(五)AOP简述的相关文章

Spring框架第五篇之Spring与AOP

一.AOP概述 AOP(Aspect Orient Programming),面向切面编程,是面向对象编程OOP的一种补充.面向对象编程是从静态角度考虑程序的结构,而面向切面编程是从动态角度考虑程序运行过程. AOP底层就是采用动态代理模式实现的,采用了两种代理:JDK的动态代理与CGLIB的动态代理. 面向切面编程,就是将交叉业务逻辑封装成切面,利用AOP容器的功能将切面织入到主业务逻辑中.所谓交叉业务逻辑是指,通用的.与主业务逻辑无关的代码.如安全检查.事务.日志等. 若不是用AOP,则会出

跟着刚哥学习Spring框架--AOP(五)

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

Spring实现AOP的4种方式(转)

转自:http://blog.csdn.net/udbnny/article/details/5870076 Spring实现AOP的4种方式 先了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法被调用时.异常被抛出时等等.3.切入点(Pointcut)通知定义了切面要发生的“故事”和时间,那么切入点就定义了“故事”发生的

Spring实现AOP的4种方式

来自:http://blog.csdn.net/udbnny/article/details/5870076 先了解AOP的相关术语: 1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法被调用时.异常被抛出时等等.3.切入点(Pointcut)通知定义了切面要发生的“故事”和时间,那么切入点就定义了“故事”发生的地点,例如某个类或方法的名称,S

spring的AOP

最近公司项目中需要添加一个日志记录功能,就是可以清楚的看到谁在什么时间做了什么事情,因为项目已经运行很长时间,这个最初没有开来进来,所以就用spring的面向切面编程来实现这个功能.在做的时候对spring的AOP还比较陌生,事后通过网上学习对其有了较好的了解. AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入封装.继承.多态等概念来建立一种对象

Spring的AOP AspectJ切入点语法详解(转)

一.Spring AOP支持的AspectJ切入点指示符 切入点指示符用来指示切入点表达式目的,在Spring AOP中目前只有执行方法这一个连接点,Spring AOP支持的AspectJ切入点指示符如下: execution:用于匹配方法执行的连接点: within:用于匹配指定类型内的方法执行: this:用于匹配当前AOP代理对象类型的执行方法:注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配: target:用于匹配当前目标对象类型的执行方法:注意是目标对象的类型匹配,

【SSH进阶之路】Spring的AOP逐层深入——采用注解完成AOP(七)

上篇博文[SSH进阶之路]Spring的AOP逐层深入--AOP的基本原理(六),我们介绍了AOP的基本原理,以及5种通知的类型, AOP的两种配置方式:XML配置和Aspectj注解方式. 这篇我们使用注解方式来实现一个AOP,我们先看一下项目的目录. 我们采用的是JDK代理,所以首先将接口和实现类代码附上: package com.tgb.spring; public interface UserManager { public void addUser(String userName,St

Spring框架 AOP(三)

AOP理论概述 Aspect Oriented Programming 面向切面编程 业界 AOP 实际上 OOP (面向对象编程 ) 延伸 -- OOP编程语言. AOP设计思想 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视.事务管理.安全检查.缓存) 横向抽取代码复用,基于代理技术,在不修改原有对象代码情况下,对原有对象方法功能进行增强! ---- AOP 思想 Spring框架如何实现AOP Spring1.2 版本开始 开始支持AOP技术 (传统Spring AOP

AOP、静态代理、JDK动态代理、CGLIB动态代理、Spring实现AOP、IOC+AOP

一.为什么需要代理模式 假设需实现一个计算的类Math.完成加.减.乘.除功能,如下所示: 1 package com.zhangguo.Spring041.aop01; 2 3 public class Math { 4 //加 5 public int add(int n1,int n2){ 6 int result=n1+n2; 7 System.out.println(n1+"+"+n2+"="+result); 8 return result; 9 } 1