Spring AOP基础实践

一、代码实践

先上代码,Spring AOP的demo,见下面的小例子。

 1 package demo.spring;
 2
 3 import org.aspectj.lang.annotation.After;
 4 import org.aspectj.lang.annotation.Aspect;
 5 import org.aspectj.lang.annotation.Before;
 6 import org.aspectj.lang.annotation.Pointcut;
 7 import org.junit.Test;
 8 import org.junit.runner.RunWith;
 9 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.stereotype.Component;
11 import org.springframework.test.context.ContextConfiguration;
12 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
13
14 @RunWith(SpringJUnit4ClassRunner.class)
15 @ContextConfiguration("classpath:spring-config.xml")
16 public class AopDemo {
17     @Autowired
18     private Target target;
19
20     @Test
21     public void testSayHello() {
22         target.doSomething("hello world");
23     }
24 }
25
26 @Component
27 class Target {
28     public void doSomething(String params) {
29         System.out.println(params);
30     }
31 }
32
33 @Aspect
34 @Component
35 class Interceptor {
36
37     @Pointcut("execution(* demo.spring.Target.doSomething(String)) && args(params)")
38     public void doSomething(String params) {}
39
40     @Before("doSomething(params)")
41     public void before(String params) {
42         System.out.println("before params: " + params);
43     }
44
45     @After("doSomething(params)")
46     public void after(String params) {
47         System.out.println("after:" + params);
48     }
49 }

spring-config.xml文件配置如下:

 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:context="http://www.springframework.org/schema/context"
 5        xmlns:aop="http://www.springframework.org/schema/aop"
 6        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
 7
 8     <context:component-scan base-package="demo.spring"/>
 9     <aop:aspectj-autoproxy />
10
11 </beans>

值得说明的点:

* context:component-scan,使用@Autowired自动注入、@Component自动发布bean,两个注解需要配置这个元素,否则无法使用注解;

* aop:aspectj-autoproxy,使用@AspectJ及其它AOP注解需要配置,否则无法使用注解;@AspectJ注解,将@Component自动发布出来的"interceptor" bean转换为一个aspectj切面,而@Pointcut、@Before、@After、@Around等注解,功能与在xml文件中配置是一样的;@Pointcut注解下面的方法内容无意义,只是要求一个相应方法提供注解依附。

* 注解只能在使用能获得源码的场景,如果不能获取源码,则只能通过xml配置的形式,将指定的对象配置成拦截器,对指定的目标进行拦截;因此,通过xml文件配置,而不是注解,是更加通用的方式。

* 除基础的springframework框架的jar包外,还需要依赖cglib、aspectj的jar包,maven配置:

 1         <dependency>
 2             <groupId>cglib</groupId>
 3             <artifactId>cglib</artifactId>
 4             <version>2.2</version>
 5         </dependency>
 6         <dependency>
 7             <groupId>org.aspectj</groupId>
 8             <artifactId>aspectjweaver</artifactId>
 9             <version>1.6.11</version>
10         </dependency>

二、实现原理

Spring框架中的AOP拦截技术,是POJO的方法层面的拦截。关于低层实现原理,其实是动态代理技术。对于面向接口的方法拦截,依赖于jdk的动态代理技术,即java.lang.reflect.Proxy#newProxyInstance,将对被代理的目标对象的调用,委托到代理对象,触发拦截通知;而当被代理的是类对象,不是接口时,使用的是cglib,对字节码进行动态增强,进行代理。

//更多框架底层源码与实现细节,待续。。

时间: 2024-08-25 10:26:26

Spring AOP基础实践的相关文章

CgLib动态代理学习【Spring AOP基础之一】

如果不了解JDK中proxy动态代理机制的可以先查看上篇文章的内容:Java动态代理学习[Spring AOP基础之一] 由于Java动态代理Proxy.newProxyInstance()的时候会发现其参数类型是ClassLoader classLoader, Class<?>[] interface, InvocationHandler handler, 只支持根据接口实现代理类,如果所有代码都是自己掌控,当然没有问题.所有的业务逻辑均抽象出接口,然后所有的业务类实现接口,这样所有的业务类

[Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习. 一, AspectJ的概述: AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. Spring为了简化自身的AOP的开发,将AspectJ拿过来作为Spring自身一个AOP的开发.

[Spring框架]Spring AOP基础入门总结一.

前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务

spring aop基础概念

spring aop基础概念 1.什么是aop: aspect oriented programming:面向切面编程. 即通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 主要功能是:日志记录,性能统计,安全控制,事务处理,异常处理等. 2.aop的实现方式: (1)预编译:AspectJ (2)运行期动态代理(JDK动态代理.CGLIB动态代理):SpringAOP.JbossAOP 3.aop的概念: (1)切面(aspect):一个关注点的模块化,这个关注点可能会横切多个

[Java]Spring AOP基础知识-动态代理

Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的动态代理:另一种是基于CGLib的动态代理.之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的代理,而不支持类的代理. 带有横切逻辑的实例 我们通过具体化代码实现上一节所介绍例子的性能监视横切逻辑,并通过动态代理技术对此进行改造.在调用每一个目标类方法时启动方法的性能监视,在目标类方法调

Spring AOP基础知识

Spring AOP使用动态代理技术在运行期织入增强的代码,两种代理机制包括:一是基于JDK的动态代理,另一种是基于CGLib的动态代理.之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的代理,而不支持类的代理. 1.带有横切逻辑的实例 ForumService:包含性能监视横切代码 package com.yyq.proxy; public interface ForumService { void removeTopic(int topicId); void removeForu

spring - AOP 基础(一)

spring AOP spring支持四种拦截类型:目标方法调用前,目标方法调用后,目标方法调用前后,方法抛出异常. spring Aop采用动态代理的方式生成代理类,前面分析过动态代理和静态代理以及区别,可以点击我的博客. 一些术语解释. 连接点: 程序的某个位置,就是程序也就是类里的方法,一个类可以有多个方法,多个连接点,就是在这些方法前后异常等做文章. 切点: 可能会和连接点混淆,类里有多个连接点,那么程序或者项目执行的时候如何找到对应的连接点?切点就是做这个工作的, 切点帮你定位到对应的

Java动态代理学习【Spring AOP基础之一】

Spring AOP使用的其中一个底层技术就是Java的动态代理技术.Java的动态代理技术主要围绕两个类进行的 java.lang.reflect.InvocationHandler java.lang.reflect.Proxy 首先从代码层面说明Java动态代理是如何实现的, 业务逻辑接口: /** * 创建一个人的接口,其中有一个吃的方法 */ public interface Person { public void eat(); } 创建一个实现该业务接口的类: /** * 人接口的

Spring Aop基础总结

Aop是Spring的核心特性之一,是面向切面编程技术.实现方式是基于代领模式的,在程序流中找到切点,可以在切点前后执行一部分代码. 使用AOP,在UserDao的save方法前后,切入程序: UserDao package com.dao; public class UserDao { public void save(){ System.out.println("in save"); } } 切面程序,在save方法执行前后要执行的程序: package com.aop; impo