`
duanyan123
  • 浏览: 11988 次
  • 性别: Icon_minigender_2
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

关于动态代理的学习总结

    博客分类:
  • java
阅读更多
package com;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.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 net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import com.service.TestService;
import com.service.impl.TestServiceImpl;


//当所代理对象有实现接口时
public class JDKProxy implements InvocationHandler {
private Object targetObject;

public Object createProxyInstance(Object targetObject) {
this.targetObject = targetObject;
Object result = null;
result = Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
this.targetObject.getClass().getInterfaces(), this);
return result;
}

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
TestServiceImpl bean = (TestServiceImpl) this.targetObject;
Object result = null;
if(bean.getTestDao() != null) {
//before advice()...前置通知
try {
result = method.invoke(this.targetObject, args);
//after advice()...后置通知
} catch (Exception e) {
//exception advice()...例外通知
} finally {
//finally advice()...最终通知
}
}
return result;
}
}


//当对应的TestSerice2没有实现接口的时候,可以使用CGlib来动态代理
class CGlibProxy implements MethodInterceptor {
private Object targetObject;

public Object createProxyInstance(Object targetObject) {
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());
enhancer.setCallback(this);
return enhancer.create();
}

public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
TestService bean = (TestService) this.targetObject;
Object result = null;
if(bean != null) {
result = methodProxy.invoke(this.targetObject, args);
}
return result;
}
}


//切面
@Aspect
class MyInterceptor {
@Pointcut("execution (* com.service.impl.*.*(..))")
private void anyMethod() {}  //声明一个切入点

@Before("anyMethod() && args(name)")
public void add(String message) {
//只对满足anyMethod切入点的所有方法和只有一个参数的方法插入切入点
System.out.println(message + "前置通知");
}

@AfterReturning(pointcut="anyMethod()", returning="otherMess")
public void afterAdd(String otherMess) {
//只对返回值为String类型的方法插入切面并且返回的值作为切入方法的参数传入
System.out.println(otherMess + "后置通知");
}

@After("anyMethod() && args(name)")
public void finallyAdd(String finalMess) {
System.out.println(finalMess + "最终通知");
}

@AfterThrowing("anyMethod() && args(name)")
public void exceptionAdd(String exceptionMess) {
System.out.println(exceptionMess + "例外通知");
}

@Around("anyMethod()")
public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint)
throws Throwable {
Object result = null;
if (result == null) { //判断用户是否存在权限
System.out.println("into 环绕通知");
result = proceedingJoinPoint.proceed();
System.out.println("out 环绕通知");
}
return result;
}
}


//切面2  采用XMl的配置方式配置切面
class MyInterceptor2 {
private void anyMethod() {}  //声明一个切入点

public void add(String message) {
//只对满足anyMethod切入点的所有方法和只有一个参数的方法插入切入点
System.out.println(message + "前置通知");
}

public void afterAdd(String otherMess) {
//只对返回值为String类型的方法插入切面并且返回的值作为切入方法的参数传入
System.out.println(otherMess + "后置通知");
}

public void finallyAdd(String finalMess) {
System.out.println(finalMess + "最终通知");
}

public void exceptionAdd(String exceptionMess) {
System.out.println(exceptionMess + "例外通知");
}

public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint)
throws Throwable {
Object result = null;
if (result == null) { //判断用户是否存在权限
System.out.println("into 环绕通知");
result = proceedingJoinPoint.proceed();
System.out.println("out 环绕通知");
}
return result;
}
}

//spring-aop.xml的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"

xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
">
<!-- 基于XML配置方式声明切面 -->
<bean id="myInterceptor" class="com.MyInterceptor2"/>
<aop:config>
<aop:aspect id="myaop" ref="myInterceptor">
<!-- 声明一个切入点 -->
<aop:pointcut expression="execution(* com.service.impl.*(..))" id="myPointCut"/>
<!-- 前置通知 -->
<aop:before method="add" pointcut-ref="myPointCut"/>
<!-- 后置通知 -->
<aop:after-returning method="afterAdd" pointcut-ref="myPointCut"/>
<!-- 最终通知 -->
<aop:after method="finallyAdd" pointcut-ref="myPointCut"/>
<!-- 例外通知 -->
<aop:after-throwing method="exceptionAdd" pointcut-ref="myPointCut"/>
<!-- 环绕通知 -->
<aop:around method="aroundMethod" pointcut-ref="myPointCut"/>
</aop:aspect>
</aop:config>
</beans>
分享到:
评论

相关推荐

    Spring aop 之 静态代理 动态代理 Aspectj aop-config 等实现方式

    主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...

    Java中的动态代理

    本资源是本人学习过程中不断查找和总结的结果,希望对 有需要的 人员 有所帮助

    两万字吐血总结,代理模式及手写实现动态代理(aop原理,基于jdk动态代理)

    总结三、手写实现jdk动态代理 一、代理模式 熟悉代理模式的可以直接点击目录第二章,jdk动态代理实现原理,本文的精髓所在,通过这个例子,教大家如何去学习源码。 1. 定义 代理模式(Proxy Pattern) 是一个使用频率...

    MyBatis基本使用总结

    MyBatis基本使用总结 Mybatis 的核心配置文件于实体类的映射文件,mapper 代理动态代理的调用方法。

    java基础学习总结笔记

    知识主要包括:Java基础常识、如何安装Java工具、Java语言的基础组成、Java面向对象、Java多线程、Java常用类、集合(重点)、IO流、GUI图形界面、网络编程、正则表达式、反射、注解、类加载器、动态代理等等,另外...

    nginx学习总结五(nginx反向代理)

    Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。两者的功能基本上一样。 Nginx 0.8.32...

    《人工智能》--通用爬虫,多页面抓取,爬取动态页面,人工智能破解验证,脚本支持,代理池维护管理,.zip

    人工智能学习总结成果,希望可以帮到大家,有疑问欢迎随时沟通~ 人工智能学习总结成果,希望可以帮到大家,有疑问欢迎随时沟通~ 人工智能学习总结成果,希望可以帮到大家,有疑问欢迎随时沟通~ 人工智能学习总结...

    jpivot学习总结.doc

    按代理商,终端两级统计缴费情况  有父子关系维度 例子中定义了维度:[area].[所有地区] 按组织机构级别统计缴费情况 在定义父子级别时,要指定parentColumn和nullParentValue 且要定义Closure,如果不定义,指标...

    book:Java案例|学习总结| .....

    Java Java学习案例库 Java案例目录 ...cn.liguohao.encrpt :AES加密BV1qa4... cn.liguohao.proxy.dynamic :动态代理 设计模式目录 参考《 Head First Java设计模式》 cn.liguohao.design.pattern.duck :面向接口编程 ...

    动力节点老杜最新版Spring6框架教程学习资料分享

    第四点:CGLIB动态代理代码实现 第五点:代码演示事务传播行为 第六点:代码演示事务隔离级别 第七点:Bean的循环依赖 第八点:Spring的八大设计模式 第九点:17种注入方案,其他视频讲10种以内。 第十点:Bean的8种...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    15.1.6 动态代理 512 15.2 了解类加载器 515 15.2.1 类加载器层级架构 515 15.2.2 建立classloader实例 518 15.3 重点复习 520 15.4 课后练习 521 chapter16 自定义泛型、枚举与标注 523 16.1 自定义...

    基于SSH实现的投票管理系统+源代码+文档说明(高分课程设计)

    java代理实现get,set方法动态获取值 编写前端vue页面总体框架,编写后台代码交互 代码编写遇到的问题 问题: Vue使用问题 只有一个根路径 解决方案: 确保下只 - 不懂运行,下载完可以私聊问,可远程教学 该...

    不要小瞧面向切面编程

    本文介绍Spring AOP,面向切面编程。在权限验证、保存日志、安全... 动态代理可以非耦合动态插入代码,我们之前介绍过,JDK动态代理相关内容请移步:JDK动态代理 AOP的几个术语  切入点:我们真正需要执行日志记

    代码随想录最新第三版-最强八股文

    Java基础、Java内存模型、Java面向对象、Java集合体系、接口、Lambda表达式、类加载机制、内部类、代理类、Java并发、JVM、Java后端编译、Spring 3. Go defer底层原理、goroutine、select实现机制 4. 算法学习 数组...

    mybatis学习笔记

    2.4 Mapper动态代理方式 20 2.4.1 实现原理 20 2.4.2 Mapper.xml(映射文件) 20 2.4.3 Mapper.java(接口文件) 21 2.4.4 加载UserMapper.xml文件 22 2.4.5 测试 22 2.4.6 总结 23 3 SqlMapConfig.xml配置文件 24 3.1 ...

    Dhcp两大威胁以及arp欺骗等试验总结

    Dhcp两大威胁以及arp欺骗等试验总结 1 伪dhcp server。Dhcp的工作原理大概是首先client广播dhcp discovery消息,本网段的dhcp server回送dhcp offer消息,客户段再发送dhcp request消息,声明自己即将使用的ip地址...

    Maven权威指南 很精典的学习教程,比ANT更好用

    总结 2. 安装和运行Maven 2.1. 验证你的Java安装 2.2. 下载Maven 2.3. 安装Maven 2.3.1. 在Mac OSX上安装Maven 2.3.2. 在Microsoft Windows上安装Maven 2.3.3. 在Linux上安装Maven 2.3.4. 在FreeBSD或...

    Hibernate中文详细学习文档

    1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)Session 3. 配置 3.1. 可编程的配置方式 3.2. 获得...

    JavaScript王者归来part.1 总数2

     1.7 学习和使用JavaScript的几点建议   1.8 关于本书的其余部分   第2章 浏览器中的JavaScript  2.1 嵌入网页的可执行内容   2.2 赏心悦目的特效   2.3 使用JavaScript来与用户交互  2.4 绕开脚本陷阱 ...

    asp.net知识库

    .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎...

Global site tag (gtag.js) - Google Analytics