Spring学习1_面向切面( AOP )实现原理

面向切面编程 (Aspect Oriented Programming,简称AOP) 是Spring的一个重要特性,其原理是采用动态代理方式实现。

下面通过一个Demo来模拟AOP实现

整个代码目录结构如下:

其中LogInterceptor类完成为所有Service方法添加日志记录的功能。

1、Dao层实现

package com.dao;

public class UserDaoImpl implements UserDao {

    @Override
    public void save() {
        System.out.println("excute save;");

    }

    @Override
    public void delete() {
        System.out.println("excute delete;");

    }

}

2、拦截器类实现

package com.handler;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class LogInterceptor implements InvocationHandler{

    private Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    public void beforMethod(Method method) {
        System.out.println(method.getName() +"  start.");
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        beforMethod(method);
        method.invoke(target, args);
        return null;
    }

}

3、AOP实际执行时是通过动态代理,对上述拦截器进行包装生成的代理类来完成切面功能的,测试如下:

package com.test;

import java.lang.reflect.Proxy;

import org.junit.Test;

import com.dao.UserDao;
import com.dao.UserDaoImpl;
import com.handler.LogInterceptor;

public class TestAop {

    @Test
    public void testAopProxy() {
        UserDao userDao = new UserDaoImpl();
        LogInterceptor logInterceptor = new LogInterceptor();
        logInterceptor.setTarget(userDao);
        UserDao proxyDao = (UserDao) Proxy.newProxyInstance(userDao.getClass()
                .getClassLoader(),  new Class[]{UserDao.class}, logInterceptor);
        proxyDao.save();
        proxyDao.delete();
    }
}

测试结果如下:

时间: 2024-11-10 13:06:49

Spring学习1_面向切面( AOP )实现原理的相关文章

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

上一篇介绍了一些概念,这篇我们开始进行编写代码. 1.编写切点: 如图所示的切点表达式表示当Instrument的play()方法执行时会触发通知.方法表达式以*号开始,标识了我们不关心方法返回值的类型.然后,我们指定了全限定类名和方法名.对于参数列表,我们使用(..)标识切点选择任意的play()方法,无论该方法的入参是什么.当我们需要配置切点仅匹配com.springinaction.springidol包,可以使用within()指示器来限制匹配. 除此之外,spring 2.5还引入一个

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

1.基本术语: 横切关注点:分布于应用中多处的功能被称为横切关注点,比如日志.安全.事务管理 切面:横切关注点可以被模块化为特殊的类,这些类被称为切面 通知:spring切面可以应用5种类型的通知 a.Before——在方法被调用之前调用通知 b.After——在方法完成之后调用通知,无论方法执行是否成功 c.After-returning——在方法成功执行之后调用通知 d.After-throwing——在方法抛出异常后调用通知 f.Around——通知包裹了被通知的方法,在被通知的方法调用之

spring学习 八 面向切面编程(AOP)概述

注:本文大部分参考   --------------------- 本文来自 -望远- 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yanquan345/article/details/19760027?utm_source=copy 先说一个Spring是什么吧,大家都是它是一个框架,但框架这个词对新手有点抽象,以致于越解释越模糊,不过它确实是个框架的,但那是从功能的角度来定义的,从本质意义上来讲,Spring是一个库,一个Java库,所以我个人觉得应该这样

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

前面介绍了aop的xml的简单配置和使用,下面介绍一下aop的注解使用方式的例子,可以对照第二篇的 pom文件是相同的: spring.xml文件: <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XML

Spring框架使用(控制反转,依赖注入,面向切面AOP)

参见:http://blog.csdn.net/fei641327936/article/details/52015121 Mybatis: 实现IOC的轻量级的一个Bean的容器 Inversion of control 控制反转:由容器控制程序之间的关系,不是程序代码操作 Depend Inject 依赖注入 Aspect oriented programming 面向切面编程 Spring能帮助我们根据配置文件创建及组装对象之间的依赖关系: Spring面向切面编程能帮助我们无耦合的实现日

Spring(二)面向切面编程AOP

这篇博客写的比较累赘,好多相同的程序写了好几遍,主要是为了是自己养成这样的一个编程思路,其中应该不乏错误之处,以后好好学,慢慢改吧.------jgp 1 AOP介绍 1.1什么是AOP 面向切面编程(Aspect Oriented Programing):通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP采取横向抽取机制,取代了传统纵向继承体系的重复性代码,主要体现在事务处理.日志管理.权限控制.异常处理等方面,使开发人员在编写业务逻辑时可以专心于核心业务,提高了代码的可

解析Spring第三天(面向切面AOP)

面向切面:AOP 在不修改源代码的基础上,对方法进行增强.AOP的底层原理就是代理技术(第一种:jdk的动态代理(编写程序必须要有接口).第二种:cglib代理技术(生成类的子类).如果编写的程序有借口,则spring框架会自动使用jdk的动态代理技术增强,). Joinpoint(连接点) 所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法,因为spring只支持方法类型的连接点 Pointcut(切入点) -- 所谓切入点是指我们要对哪些Joinpoint进行拦截的定义 Ad

Spring基础(二)_面向切面(AOP)

面向切面编程 面向切面编程[AOP,Aspect Oriented Programming]:通过预编译方式和运行期间动态代理实现程序功能的统一维护的技术.AOP 是 Spring 框架中的一个重要内容,利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 在 Spring 中,依赖注入管理和配置应用对象,有助于应用对象之间的解耦.而面向切面编程可以实现横切关注点与它们所影响的对象之间的解耦. 横切关注点:散布在应用中

spring面向切面aop拦截器

spring中有很多概念和名词,其中有一些名字不同,但是从功能上来看总感觉是那么的相似,比如过滤器.拦截器.aop等. 过滤器filter.spring mvc拦截器Interceptor .面向切面编程aop,实际上都具有一定的拦截作用,都是拦截住某一个面,然后进行一定的处理. 在这里主要想着手的是aop,至于他们的比较,我想等三个都一一了解完了再说,因此这里便不做过多的比较. 在我目前的项目实践中,只在一个地方手动显示的使用了aop,那便是日志管理中对部分重要操作的记录. 据我目前所知,ao