实现动态代理(Java和spring)
一、Java实现动态代理
1、创建接口
- package com.oyy.mw.biz.i;
- public interface Cal {
- public int add(int num1,int num2);
- public int sub(int num1,int num2);
- public int mul(int num1,int num2);
- public int div(int num1,int num2);
- }
2、创建实现类
- package com.oyy.mw.biz;
- import com.oyy.mw.biz.i.Cal;
- public class CalImpl implements Cal{
- public int add(int num1, int num2) {
- int result = num1+num2;
- return result;
- }
- public int sub(int num1, int num2) {
- int result = num1-num2;
- return result;
- }
- public int mul(int num1, int num2) {
- int result = num1*num2;
- return result;
- }
- public int div(int num1, int num2) {
- int result = num1/num2;
- return result;
- }
- }
3、创建Java动态代理实现类
- package com.oyy.mw.biz;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- import java.util.Arrays;
- public class MyInvocationHandler implements InvocationHandler {
- Object obj = null;
- /**
- * @param obj 接受传入的真实对象
- * @return 返回代理对象
- */
- public Object bind(Object obj){
- this.obj = obj;
- return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
- obj.getClass().getInterfaces(),
- this);
- }
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- System.out.println(method.getName()+"的参数是:"+Arrays.toString(args));
- //调用方法,返回该方法返回的结果
- Object result = method.invoke(obj, args);
- System.out.println(method.getName()+"的结果是:"+result);
- return result;
- }
- }
4、测试动态代理
- package com.oyy.mw.test;
- import com.oyy.mw.biz.CalImpl;
- import com.oyy.mw.biz.MyInvocationHandler;
- import com.oyy.mw.biz.i.Cal;
- public class Test {
- public static void main(String[] args) {
- Cal cal1 = new CalImpl();
- MyInvocationHandler handler = new MyInvocationHandler();
- Cal cal = (Cal)handler.bind(cal1);
- cal.add(10, 3);
- cal.sub(10, 3);
- cal.mul(10, 3);
- cal.div(10, 3);
- }
- }
5、打印结果
二、spring实现动态代理(AOP)
1、创建接口
- package com.oyy.mw.aspects.i;
- public interface Cal {
- public int add(int num1,int num2);
- public int sub(int num1,int num2);
- public int mul(int num1,int num2);
- public int div(int num1,int num2);
- }
2、创建实现类
- package com.oyy.mw.aspects;
- import org.springframework.stereotype.Component;
- import com.oyy.mw.aspects.i.Cal;
- @Component
- public class CalImpl implements Cal{
- public int add(int num1, int num2) {
- int result = num1+num2;
- return result;
- }
- public int sub(int num1, int num2) {
- int result = num1-num2;
- return result;
- }
- public int mul(int num1, int num2) {
- int result = num1*num2;
- return result;
- }
- public int div(int num1, int num2) {
- int result = num1/num2;
- return result;
- }
- }
3、配置文件
- <?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:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
- <context:component-scan base-package="com.oyy.mw.aspects"></context:component-scan>
- <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
- </beans>
4、spring切面的实现
- package com.oyy.mw.aspects;
- import java.util.Arrays;
- import org.aspectj.lang.JoinPoint;
- import org.aspectj.lang.annotation.After;
- import org.aspectj.lang.annotation.AfterReturning;
- import org.aspectj.lang.annotation.AfterThrowing;
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- import org.springframework.stereotype.Component;
- @Aspect
- @Component
- public class LoggerAspect {
- @Before("execution(public int com.oyy.mw.aspects.CalImpl.*(..))")
- public void before(JoinPoint joinPoint){
- //获取方法名
- String name = joinPoint.getSignature().getName();
- //获取参数列表
- String args = Arrays.toString(joinPoint.getArgs());
- System.out.println(name+"的参数是:"+args);
- }
- @After("execution(public int com.oyy.mw.aspects.CalImpl.*(..))")
- public void after(JoinPoint joinPoint){
- //获取方法名
- String name = joinPoint.getSignature().getName();
- System.out.println(name+"方法结束");
- }
- @AfterReturning(value="execution(public int com.oyy.mw.aspects.CalImpl.*(..))",returning="result")
- public void afterReturn(JoinPoint joinPoint,Object result){
- //获取方法名
- String name = joinPoint.getSignature().getName();
- System.out.println(name+"方法的结果是"+result);
- }
- @AfterThrowing(value="execution(public int com.oyy.mw.aspects.CalImpl.*(..))",throwing="ex")
- public void afterThrowing(JoinPoint joinPoint,Exception ex){
- //获取方法名
- String name = joinPoint.getSignature().getName();
- System.out.println(name+"方法抛出异常:"+ex);
- }
- }
5、测试类
- package com.oyy.mw.test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import com.oyy.mw.aspects.CalImpl;
- import com.oyy.mw.aspects.MyInvocationHandler;
- import com.oyy.mw.aspects.i.Cal;
- public class Test {
- public static void main(String[] args) {
- ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
- Cal cal = (Cal)context.getBean("calImpl");
- cal.div(10, 2);
- }
- }
6、运行结果
实现动态代理(Java和spring)的更多相关文章
- CgLib动态代理学习【Spring AOP基础之一】
如果不了解JDK中proxy动态代理机制的可以先查看上篇文章的内容:Java动态代理学习[Spring AOP基础之一] 由于Java动态代理Proxy.newProxyInstance()的时候会发 ...
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...
- Spring -- <tx:annotation-driven>注解基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)的区别。
借鉴:http://jinnianshilongnian.iteye.com/blog/1508018 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional ...
- [转]JAVA的动态代理机制及Spring的实现方式
JAVA 代理实现 代理的实现分动态代理和静态代理,静态代理的实现是对已经生成了的JAVA类进行封装. 动态代理则是在运行时生成了相关代理累,在JAVA中生成动态代理一般有两种方式. JDK自带实现方 ...
- Java动态代理学习【Spring AOP基础之一】
Spring AOP使用的其中一个底层技术就是Java的动态代理技术.Java的动态代理技术主要围绕两个类进行的 java.lang.reflect.InvocationHandler java.la ...
- 动态代理以及对应Spring中AOP源码分析
AOP(面向切面编程)在Spring中是被广泛应用的(例如日志,事务,权限等),而它的基本原理便是动态代理. 我们知道动态代理有两种:基于JDK的动态代理以及基于CGlib动态代理.以下是两种动态代理 ...
- java --- 设计模式 --- 动态代理
Java设计模式——动态代理 java提供了动态代理的对象,本文主要探究它的实现, 动态代理是AOP(面向切面编程, Aspect Oriented Programming)的基础实现方式, 动态代理 ...
- Java动态代理机制——JDK
动态代理机制是Spring AOP编程的原理基础. JDK的动态代理机制有个限制就是它只能代理实现了一个或多个接口的类.如PersonImpl得实现Person接口,才能用JDK动态代理机制. 定义一 ...
- Spring AOP中的动态代理
0 前言 1 动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2 Spring AOP中的动态代理机制 2.1 ...
- Spring AOP动态代理原理与实现方式
AOP:面向切面.面向方面.面向接口是一种横切技术横切技术运用:1.事务管理: (1)数据库事务:(2)编程事务(3)声明事物:Spring AOP-->声明事物 2.日志处理:3.安全验证 ...
随机推荐
- 找出数组中的最小值(es5/es6)
1.命令式编程,只需要迭代数组,检查当前最小值是否大于数组元素,如果是更新最小值即可. var s = [2,3,4,5,6,7,8]; for(var i=0,m=s.length;i<m;i ...
- GDCM
gdcmconv: gdcm 2.2.4 $Date$ Usage: gdcmconv [OPTION] input.dcm output.dcm Convert a DICOM file int ...
- vm 中安装 CentOS7
第三步:安装ISO文件 1.在vm下,文件,新建虚拟机 在我的机算机中,选中刚命名的CentOS7,右键,属性 2.开启虚拟机 PS: 打开虚拟机之后,提示了一个小错误,LZ根据错误提示,到BIOS里 ...
- python time,random,os,sys,序列化模块
一.time模块 表示时间的三种方式 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的时间字符串: (1)时间戳(timestamp) :通常来说,时间戳 ...
- UML-1-面向对象分析和设计
1.关键词: OOA:Object-Oriented Analysis.面向对象分析.抽取对象或概念,如:航班系统包含 飞机(Plane).航班(Flight)等概念. OOD:Object-Orie ...
- 盒子绝对定位 position:foxed ; 居中
方法1 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- js - cannot set property xxx of undefined
for(let i=0;i<=res.data.length;i++){ res.data[i]['class'] = 'biaoqian-red'; } console.log(res.dat ...
- 3---Django rest framework源码分析(3)----节流
Django rest framework源码分析(3)----节流 目录 添加节流 自定义节流的方法 限制60s内只能访问3次 (1)API文件夹下面新建throttle.py,代码如下: # u ...
- pandas.read_csv()函数读取文件时,关于“header=None”影响读取列数区间的右闭合总结
对于一个没有字段名标题的数据,如data.csv 1.获取数据内容.pandas.read_csv("data.csv")默认情况下,会把数据内容的第一行默认为字段名标题. imp ...
- python 爬虫系列06--古诗文
读书破万卷,下笔如有神 import requests import re def parse_page(url): headers = { 'USer-Agent':'user-agent: Moz ...