`
huangyongxing310
  • 浏览: 495811 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Spring AOP(面向方面编程)

阅读更多
Spring AOP(面向方面编程)

动态代理实现思路:
1.就是在运行时,动态生成一个类文件(被代理对象子类),在被代理对象要插入(织入)的地方加入代理的代码。
2.再编译这这个类文件生成一个类,并生成一个实例返回。
3.当运行实例时就可以运行你的代理代码了



AOP知识点:
1.AOP(Aspect-OrientedProgramming)面向方面编程,与OOP(面向对象)完全不同,使用AOP编程系统被分为方面或关注点,而不是OOP中的对象。
2.聚合就是一个类初始化时传入另一个类,类里面对传入这个类进行操作(一个类里面调用另一个对象)
3.JDK动态代理,实现了接口的类(没有实现接口的类是不行的)
4.CGLIB动态代理,针对类来实现代理,对指定目标类产生一个子类,通过方法拦截(intercept)所有父类方法的调用
5.AOP则将这些代码整理起来,将解决某个切面问题的代码单独的放在某个java文件中,然后再动态织入到程序中。



AOP中的术语:
1.Aspect:(方面)把散落在系统各处与横切关注点相关的重复代码抽取出来归整到一处形成一个模块,我们称为方面。就是一个java,里面实现了要在切入点执行的代码。
2.Joinpoint:(连接点),程序运行过程中的某一点.比如方法调用、属性访问、异常抛出。就是插入代理代码的位置。
3.Pointcut:(切入点), 一组连接点(类似于过滤器的匹配规则 )
4.Advice:(增强), 在不修改原有代码的前提下,为某一个对象增加新的功能,就是Aspect中的方法代码,要加入什么功能。
5.Weave:(织入),将方面加入到(拦截器)方法中为对象增加额外功能的过程称为织入,就是加入代理代码到被代理代码中的过程
6.Proxy:(代理对象),就是通过何种方式进行完成这种代码织入的
7.Target:(目标对象),需要被增强功能的对象称之为目标对象,也被称为被增强或被代理对象。



AOP织入位置:
1.before:在某连接点(JoinPoint)之前执行。(多个时名字排序先的织入到最里面,就是名字排序先的先运行)
2.after:当某连接点退出的时候执行(不论是正常返回还是异常退出),每次都在finally退出时的点织入(多个时名字排序先的织入到最里面,就是名字排序先的先运行)
3.AfterReturning:在某连接点正常完成后执行,不包括抛出异常的情况。(执行完after才到AfterReturning),每次都在Return前的点织入(多个时名字排序先的织入到最里面,就是名字排序先的先运行)
4.afterThrowing:在方法抛出异常退出时执行。after先于afterThrowing执行,每次都在Exception退出时的点织入(多个时名字排序先的织入到最里面,就是名字排序先的先运行)
5.Around:包围一个连接点的通知,在方法执行前后和抛出异常时执行,相当于综合了以上三种;(多个时名字排序先的织入到最里面,就是名字排序先的先运行)
6.Around先于before织入,所以先运行Around再到before
7.Around先于after织入,所以先运行Around再到after


类似于这样:
AroundA
AroundB
beforeA;
beforeB;
try {
	AfterReturningA;
	AfterReturningB;
	Target
	AroundB
	AroundA
	AfterReturningA;
	AfterReturningB;
} catch (Exception e) {
	afterThrowingA;
	afterThrowingB;
}finally {
	afterA;
	afterB;
}



例子:
package com.SpringAop;

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

import com.SpringAop.Object.ObjectTest;

//@RunWith(BlockJUnit4ClassRunner.class)
public class SpringAopMain {
	public static void main(String[] args) {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");

		System.out.println("Start");
		ObjectTest objectTest = (ObjectTest) applicationContext.getBean("objectTest");
		objectTest.objectTest();
	}
}



package com.SpringAop.Proxy;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component	//定义组件
@Aspect		//注解定义一个Pointcut(切面或切入点)
public class ProxyAop {
	// 定义一个Pointcut(切入点)这样后面就不用每个都写"execution(* com.xing..*.*(..))"
	@Pointcut("execution(* com.SpringAop..*.*(..))")
	public void pointCut() {
	};

	@AfterReturning("pointCut()")
	public void afterReturning() {
		System.out.println("ProxyAop pointCut afterReturning");
	}

	@AfterThrowing("pointCut()")
	public void cfterThrowing() {
		System.out.println("ProxyAop pointCut afterThrowing");
	}

	@Before("pointCut()")
	public void beforec() {
		System.out.println("ProxyAop pointCut before");
	}

	@After("pointCut()")
	public void after() {
		System.out.println("ProxyAop pointCut after");
	}

	@Around("pointCut()")
	public Object around(ProceedingJoinPoint pjp) throws Throwable {
		System.out.println("ProxyAop pointCut around pjp.proceed before");
		Object obj = pjp.proceed();
		System.out.println("ProxyAop pointCut around pjp.proceed after");
		System.out.println("ProxyAop pointCut Around Object ==  " + obj);
		return obj;
	}

}



package com.SpringAop.Object;

import org.springframework.stereotype.Service;

@Service("objectTest")
public class ObjectTest {
	public void objectTest() {
		System.out.println("objectTest");
		// throw new RuntimeException();
	}
}


<?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:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:task="http://www.springframework.org/schema/task"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/task
		http://www.springframework.org/schema/task/spring-task-3.2.xsd
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

	<context:annotation-config />
	<context:component-scan base-package="com.SpringAop" />

	<!-- AOP注解解析引入 -->
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

</beans>




参考原文:http://www.cnblogs.com/yangyquin/p/5462488.html
参考原文(拦截点配置):http://www.blogjava.net/supercrsky/articles/174368.html
分享到:
评论

相关推荐

    Spring AOP面向方面编程原理Spring AOP面向方面编程原理

    ### Spring AOP面向方面编程原理详解 #### 一、引言与定义 Spring AOP(Aspect Oriented Programming)是Spring框架中的一个核心组件,用于实现面向切面编程。AOP是一种编程范式,旨在将横切关注点(Cross-cutting...

    Spring AOP面向方面编程原理:AOP概念

    ### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)逐渐暴露出难以应对某些横切关注点(cross-cutting concerns)的问题。为了解决这一挑战,面向方面编程...

    java Spring aop面向方面编程.rar

    Java Spring AOP(面向方面编程)是Spring框架中的一个重要特性,它允许开发者通过定义切面来模块化横切关注点,如日志、事务管理、性能监控等。这些关注点通常会分散在应用程序的各个部分,AOP提供了一种集中处理...

    spring AOP切面编程

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它扩展了传统的面向对象编程,使得开发者可以方便地实现横切关注点,如日志、事务管理、性能监控等。在Spring中,AOP通过代理...

    SpringAOP切面编程依赖jar包.rar

    学习Spring开发的AOP面向切面编程时所需要的jar包,包括com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

    JAVA Spring AOP面向切面编程笔记

    JAVA Spring AOP面向切面编程笔记

    小马哥讲 Spring AOP 编程思想 - API 线索图.pdf

    在讨论Spring AOP(面向切面编程)时,首先需要理解几个核心概念。Spring AOP 是Spring框架提供的一个功能模块,它允许开发者将横切关注点(cross-cutting concerns)从业务逻辑中解耦出来,通过在方法调用前后进行...

    spring aop jar 包

    Spring AOP(Aspect Oriented Programming,面向切面...总的来说,Spring AOP通过提供面向切面的编程能力,极大地提高了代码的可复用性和可维护性,降低了系统复杂度,特别是在处理共性问题如日志、事务、安全等方面。

    Spring面向切面编程AOP

    面向切面编程(AOP,Aspect Oriented Programming)是Spring框架中的一个重要特性,它提供了一种模块化和声明式的方式来处理程序中的横切关注点,如日志、事务管理、安全控制等。AOP的核心概念包括切面、通知、连接...

    Spring AOP切面编程简介

    在Java世界中,面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,它允许我们分离关注点,将横切关注点(如日志、事务管理、性能监控等)与业务逻辑代码解耦。Spring框架中的AOP模块提供了实现...

    Spring-aop面向切面编程实例

    面向切面编程(Aspect-Oriented Programming,AOP)是Spring框架的核心特性之一,它提供了一种优雅的方式来处理系统的横切关注点,如日志、事务管理、性能监控和权限控制等。在Spring中,AOP主要通过代理模式实现,...

    Spring AOP面向切面三种实现

    在IT行业中,Spring框架是Java企业级应用开发的首选,其强大的功能之一就是AOP(面向切面编程)。本文将详细解析Spring AOP的三种实现方式,帮助你深入理解这一重要概念。 首先,理解AOP的基本概念至关重要。AOP是...

    Spring AOP教程

    Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。

    Spring AOP 16道面试题及答案.docx

    Spring AOP,全称为Aspect Oriented Programming,是面向切面编程的一种编程范式,它是对传统的面向对象编程(OOP)的一种补充。在OOP中,核心是对象,而在AOP中,核心则是切面。切面是关注点的模块化,即程序中的...

    Java Spring AOP 面向切面编程的4种实现

    Spring AOP (面向切面编程框架): Spring框架内建了支持动态代理的功能,使用@AspectJ注解可以轻松地创建AOP代理。Spring AOP既支持JDK动态代理也支持CGLIB,会根据目标类是否实现了接口选择合适的底层技术。 Guice ...

    简单spring aop 例子

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...

    Spring AOP完整例子

    Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,通过插入切面来增强或改变程序的行为。在本教程中,我们将深入探讨Spring AOP的不同使用方法,包括定义切点、通知类型...

    进击的编程思想!带你学Spring AOP核心编程思想教程 新角度学面向切面编程

    AOP 的全称是“Aspect Oriented Programming”,即面向切面编程,它将业务逻辑的各个部分进行隔离,使开发人员在编写业务逻辑时可以专心于核心业务,从而提高了开发效率。AOP 采取横向抽取机制,取代了传统纵向继承...

    SpringAop面向切片

    **Spring AOP 面向切面编程详解** 在Java世界中,Spring框架以其强大的功能和易用性闻名,其中一个核心特性就是面向切面编程(Aspect-Oriented Programming,简称AOP)。AOP是为了解决传统面向对象编程中横切关注点...

    spring aop依赖jar包

    现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...

Global site tag (gtag.js) - Google Analytics