1.文件结构

2.建立接口

package com.wangcf.manager;

public interface IUserManager {

    public void add();

    public void del();

    public void update();

    public String load(int uid);
}

3.实现接口,里面的所有方法都是切入点PointCut

package com.wangcf.manager;

public class UserManagerImp implements IUserManager{
@Override
public void add(){
System.out.println("UserManagerImp add...");
}
@Override
public void del(){
System.out.println("UserManagerImp del...");
}
@Override
public void update(){
System.out.println("UserManagerImp update...");
} @Override
public String load(int uid) {
// TODO Auto-generatuided method stub
System.out.println("UserManagerImp load...");
return "asda"+uid;
}
}

4.切面拦截,切面类aspect

package com.wangcf.manager;

public class LogManager {
//advice(通知)
public static void addLog(){
System.out.println("添加日志...");
}
}

5.获取代理类

package com.wangcf.handler;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import com.wangcf.manager.LogManager; public class MyInvocationHandler implements InvocationHandler{ private Object target;//目标对象 public MyInvocationHandler(Object target) {
// TODO Auto-generated constructor stub
this.target=target;
} public Object newProxy(){
Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this);
return proxy;
} @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("MyInvocationHandler invoke...");
/*
*
*/
LogManager.addLog();
//去执行目标对象的方法
System.out.println("args: "+args);
//去执行目标对象的方法
Object returnValue = method.invoke(target, args);
System.out.println("returnValue:"+returnValue);
return returnValue;
} }

6.测试类

package com.wangcf.test;

import com.wangcf.handler.MyInvocationHandler;
import com.wangcf.manager.IUserManager;
import com.wangcf.manager.UserManagerImp; public class TestAction {
public static void main(String[] args) {
     //目标对象userManager
IUserManager userManager=new UserManagerImp(); //下面这段获取代理
MyInvocationHandler mh=new MyInvocationHandler(userManager);
Object proxy=mh.newProxy();
System.out.println(proxy.getClass().getName());
IUserManager userManagerProxy=(IUserManager)proxy; //不带参数add,和load方法称为连接点JoinPoint
userManagerProxy.add();
System.out.println("==============");
//带参数
userManagerProxy.load(10);
}
}

7.输出:

8.总结:

Proxy0是动态获取的代理

通过连接点进入切面,LogManager为切面类

AOP:jdk的动态代理的更多相关文章

  1. 基于SpringBoot实现AOP+jdk/CGlib动态代理详解

    动态代理是一种设计模式.在Spring中,有俩种方式可以实现动态代理--JDK动态代理和CGLIB动态代理. JDK动态代理 首先定义一个人的接口: public interface Person { ...

  2. 新秀学习SSH(十四)——Spring集装箱AOP其原理——动态代理

    之前写了一篇文章IOC该博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP. IOC负责将对象动态的注入到容器,从而达到 ...

  3. Spring AOP中的动态代理

    0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  Spring AOP中的动态代理机制 2.1  ...

  4. 基于 JDK 的动态代理机制

    『动态代理』其实源于设计模式中的代理模式,而代理模式就是使用代理对象完成用户请求,屏蔽用户对真实对象的访问. 举个最简单的例子,比如我们想要「FQ」访问国外网站,因为我们并没有墙掉所有国外的 IP,所 ...

  5. 【spring基础】AOP概念与动态代理详解

    一.代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...

  6. 转:Spring AOP中的动态代理

    原文链接:Spring AOP中的动态代理 0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  S ...

  7. spring---aop(4)---Spring AOP的CGLIB动态代理

    写在前面 前面介绍了Spring AOP的JDK动态代理的过程,这一篇文章就要介绍下Spring AOP的Cglib代理过程. CGLib全称为Code Generation Library,是一个强 ...

  8. Spring Boot实践——Spring AOP实现之动态代理

    Spring AOP 介绍 AOP的介绍可以查看 Spring Boot实践——AOP实现 与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改 ...

  9. JDK的动态代理深入解析(Proxy,InvocationHandler)(转)

    JDK的动态代理深入解析(Proxy,InvocationHandler)(转) 一.什么是动态代理 动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实.代理一般会实现它所表示的实际对象的 ...

随机推荐

  1. jquery 60s倒计时

    前端开发中经常用到的发送按钮倒计时,每次都是重写,挺麻烦的,记录一下,以后直接来复制代码 <!DOCTYPE html> <html> <head> <met ...

  2. vue-cli3 创建选项选择

    1.创建新项目: vue create hello-world 2.选择配置 3.自定义选择配置,需要什么就选什么 4. 是否使用带历史纪录的路由,这里一般是Y 5.预编译器选择什么 6.eslint ...

  3. CSDN强制登录的解决办法

    这个网站的吃相越来越恶心,最近使用发现他竟然强制登录了,这样的网站我是不可能登录的,要一大堆身份信息,但是,某些时候有需要看一些别人的文章怎么办呢, ​ 似乎节操与便利必须选一个,还好CSDN这样的网 ...

  4. html-表单标签

    表单标签 * 可以提交数据到**网站上的服务器,这个过程可以使用表单标签实现 * <form></form>:定义一个表单的范围 - 属性 ** action:提交到地址,默认 ...

  5. [Java算法分析与设计]--链式堆栈的设计

    在上篇文章当中,我们实现了底层为数组的顺序栈.在我之前的文章中也提到过:以数组为数据结构基础在存储数据方面需要一整块连续的内存来存放数据,一旦遇到需要可以动态扩展的功能需求时如果数据量大可能会给虚拟机 ...

  6. python 验证码识别初探

    使用 pytesser 与 pytesseract 识别验证码 前置 :  首先需要安装  tesserract tesserract windows 安装包及中文 https://pan.baidu ...

  7. Hibernate学习笔记四

    1 整合log4j(了解) l slf4j 核心jar  : slf4j-api-1.6.1.jar .slf4j是日志框架,将其他优秀的日志第三方进行整合. l 整合导入jar包 log4j 核心包 ...

  8. React with webpack

    //entry.js require("!style!css!./style.css"); require("./hello.jsx"); // documen ...

  9. 20155301 2016-2017-2 《Java程序设计》第8周学习总结

    20155301 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 1.java.util.logging包提供了日志功能相关类与接口.使用日志的起点是logg ...

  10. Windows server 2008 IIS7发布asp.net mvc网站css、js脚本无法访问 问题解决

    今天发布网站遇到一个感到很无语的问题,网站发布成功,浏览网站内容数据显示正常,就是没有样式,试了下脚本也是没有反应,如图效果: 接下来就是一顿苦找原因,检查iis设置.什么应用程序池.文件路径等各种检 ...