Spring 对 AOP 的支持

1、AOP概念

  首先,AOP是对OOP的一个补充。它考虑的是“横切性”问题。横切性问题即可以理解为我们同一层类的问题(例如:Service层)。

  它的理念是,把遍历在系统各个角落具有横切性的独立的服务,抽出来放到一个地方,然后等到运行时,再放进去,考虑的是“横向”的东西。将横切性关注的东西给抽出来,会使代码大大减少,更加简洁,更加有复用性。

下图展示AOP中的基本概念:

  

基础概念不多说,从上图可以看出SpringAOP的实现的过程:

  ?  找到横切性性关注点(发现横切性问题,具体实现为Advice)

  ?  编写切入点(Pointcut),即指定Advice的方法的作用域

  ?  将Advice织入(Weave)目标对象(TargetObject)的Joinpoint

  织入(Weave)是动态的,默认采用的方式是JDK的动态代理,当然也可以采用CGLIB代理。

  可简单地表示为下图:

  

2、Spring 对 AOP 的支持—采用Annotation方式

 依赖包配置:

*SPRING_HOME/dist/spring.jar

*SPRING_HOME/lib/log4j/log4j-1.2.14.jar

*SPRING_HOME/lib/jakarta-commons/commons-logging.jar

*SPRING_HOME/lib/aspectj/*.jar  --(要使用aspectj提供的相关的注解)

 源码

  interface UserManager

package com.bjpowernode.spring;

public interface UserManager {
	public void addUser(String userName, String password);
}

  class UserManagerImpl  

package com.bjpowernode.spring;

public class UserManagerImpl implements UserManager {

	public void addUser(String username, String password) {
		System.out.println("---------UserManagerImpl.add()--------");
	}
}

  *class  SecurityHandler(将横切性关注点模块化,建立相关的类)

package com.bjpowernode.spring;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class SecurityHandler {

	/**
	 * 定义Pointcut,Pointcut的名称为addAddMethod(),此方法没有返回值和参数 该方法就是一个标识,不进行调用
	 */
	@Pointcut("execution(* add*(..))")
	private void addAddMethod() {
	};

	/**
	 * 定义Advice,表示我们的Advice应用到哪些Pointcut订阅的Joinpoint上
	 */
	@Before("addAddMethod()")
	// @After("addAddMethod()")
	private void checkSecurity() {
		System.out.println("");
		System.out.println("-------checkSecurity-------");
	}
}

  为所有的方法名中带add的方法,执行之前都加入checkSecurity()服务。

  Spring配置文件—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:aop="http://www.springframework.org/schema/aop"
	     xmlns:tx="http://www.springframework.org/schema/tx"
	     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
	<!-- 启用AspectJ对Annotation的支持 -->
	<aop:aspectj-autoproxy/>  

	<bean id="userManager" class="com.bjpowernode.spring.UserManagerImpl"/>

	<bean id="securityHandler" class="com.bjpowernode.spring.SecurityHandler"/>
</beans>

  classClient—客户端

package com.bjpowernode.spring;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Client {
	public static void main(String[] args) {

		BeanFactory factory = new ClassPathXmlApplicationContext(
				"applicationContext.xml");
		System.out.print(factory);
		UserManager userManager = (UserManager) factory.getBean("userManager");
		userManager.addUser("张三", "123");
	}

}

  运行结果:

-------checkSecurity-------
---------UserManagerImpl.add()--------

3、Spring 对 AOP 的支持—采用"配置文件"方式

 与上面实现相同的效果。

  * 依赖包配置采用上面的“采用Annotation方式”即可

  * 直接看源码:

  interface  UserManager与上面相同

  class  UserManagerImpl与上面相同

  class  SecurityHandler(将横切性关注点模块化,建立相关的类):

package com.bjpowernode.spring;

public class SecurityHandler {

	private void checkSecurity() {
		System.out.println("");
		System.out.println("-------checkSecurity-------");
	}
}

  *Spring配置文件—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:aop="http://www.springframework.org/schema/aop"
	     xmlns:tx="http://www.springframework.org/schema/tx"
	     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

	<bean id="userManager" class="com.bjpowernode.spring.UserManagerImpl"/>
	<bean id="securityHandler" class="com.bjpowernode.spring.SecurityHandler"/>
	<aop:config>
		<aop:aspect id = "securityAspect" ref="securityHandler">
			<!-- 以Add为开头的方法
			<aop:pointcut id="addAddMethod" expression="execution(* add*(..))"/>
			 -->
			<!--  com.bjpowernode.spring包下所有类的所有方法
			<aop:pointcut id="addAddMethod" expression="execution(* com.bjpowernode.spring.*.*(..))"/>
			-->
			<!-- com.bjpowernode.spring包下所有类的所有add与del方法 -->
			<aop:pointcut id="addAddMethod" expression="execution(* com.bjpowernode.spring.*.add*(..))||execution(* com.bjpowernode.spring.*.del*(..))"/>
			<!-- Advice,配一个Pointcut -->
			<aop:before method="checkSecurity" pointcut-ref="addAddMethod"/>
		</aop:aspect>
	</aop:config>
</beans>

  主要是在aspect节中,将Advice与Poincut联系起来

  classClient—客户端也与上面相同

  运行结果正确:

-------checkSecurity-------
---------UserManagerImpl.add()--------

4、总结

  做AOP,重点是,发现Aspect(切面),并在“运行时”切入进去。织入过程,默认采用JDK的动态代理。动态灵活,但比较慢;静态比较快(可以预编译),但不灵活。Spring的AOP可以针对pojo对象提供声明式服务,如声明式事务; Ejb里面的SessionBean也可以提供声明式事务。

时间: 2024-10-16 19:39:35

Spring 对 AOP 的支持的相关文章

spring的AOP

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

spring(4)面向切面的Spring(AOP)

[0]README 1)本文部分文字描述转自:"Spring In Action(中/英文版)",旨在review  "spring(4)面向切面的Spring(AOP)" 的相关知识: 2)在软件开发中,散布于应用中多处的功能被称为横切关注点.通常来讲,这些横切关注点从概念上是与应用的业务逻辑相分离的(但是往往会直接嵌入到应用的业务逻辑中).把这些横切关注点与业务逻辑相分离正是面向切面编程(AOP)所要解决的问题:(干货--引入横切关注点及其所要解决的问题) 3)

Spring(五)AOP简述

一.AOP简述 AOP全称是:aspect-oriented programming,它是面向切面编号的思想核心, AOP和OOP既面向对象的编程语言,不相冲突,它们是两个相辅相成的设计模式型 AOP技术弥补了面向对象编程思想的不足,spring aop是实现aop的一种技术,srping aop是spring框架中某个子框架或者子功能所依赖的核心. SPring的容器并不依赖于AOP 这意味着程序员可以自己选择是否使用aop技术,aop提供强大的中间件解决方案,这使用spring ioc容器更

Spring框架Aop详解

一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnblogs.com/xrq730/p/4919025.html AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入封装.继承.多态等概念来建立一种对象层次

8 -- 深入使用Spring -- 4... Spring的AOP

8.4 Spring的AOP AOP(Aspect Orient Programming),也就是面向切面编程,最为面向对象编程的一种补充. AOP和OOP互为补充,面向对象编程将程序分解成各个层次的对象,而面向切面编程将程序运行过程分解成各个切面.可以这样理解:面向对象编程是从静态角度考虑程序结构,而面向切面编程则是从动态角度考虑程序运行过程. 8.4.1 为什么需要AOP 8.4.2 使用AspectJ实现AOP 1.下载和安装AspectJ 2.AspectJ使用入门 8.4.3 AOP的

Spring之AOP基本概念及通过注解方式配置AOP

为什么使用AOP 传统方法 AOP前前奏 首先考虑一个问题,假设我们要设计一个计算器,有如下两个需求: - 在程序运行期间追踪正在放生的活动 - 希望计算器只能处理正数的运算 通常我们会用如下代码进行实现: 定义一个接口: public interface ArithmeticCalculator { int add(int i, int j); int sub(int i, int j); int mul(int i, int j); int div(int i, int j); } 实现类(

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的AOP详解 一.AOP基础 1.1AOP是什么 考虑这样一个问题:需要对系统中的某些业务做日志记录,比如支付系统中的支付业务需要记录支付相关日志,对于支付系统可能相当复杂,比如可能有自己的支付系统,也可能引入第三方支付平台,面对这样的支付系统该如何解决呢? 传统解决方案 1.日志部分定义公共类LogUtils,定义logPayBegin方法用于记录支付开始日志, logPayEnd用于记录支付结果 logPayBegin(long userId,long money) logPay