Spring-(四)动态代理示例初认识

本文最后更新于:December 26, 2021 am

Spring 是目前主流的 Java Web 开发框架,是 Java 世界最为成功的框架。Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。该框架是一个轻量级的开源框架,具有很高的凝聚力和吸引力。Spring 框架不局限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。Spring 框架还是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力。

目录

JDK动态代理

要求:JDK动态代理要求目标类必须实现接口。

someService.java

1
2
3
4
5
6
7
8
9
10
11
package com.tothefor.bao04.service;

/**
* @Author DragonOne
* @Date 2021/9/19 09:12
*/
public interface someService {
public void doA();
public void doB();
}

someServiceImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.tothefor.bao04.service.impl;

import com.tothefor.bao04.service.someService;

/**
* @Author DragonOne
* @Date 2021/9/19 09:13
*/
public class someServiceImpl implements someService{
@Override
public void doA() {
System.out.println("调用doA方法。");
}

@Override
public void doB() {
System.out.println("调用doB方法。");
}
}

Utils.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.tothefor.bao04.utils;

import java.util.Date;

/**
* @Author DragonOne
* @Date 2021/9/19 09:16
*/
public class Utils {
public static void doTime(){
System.out.println("当前时间为:" + new Date());
}

public static void doLog(){
System.out.println("打印调用日志函数。");
}
}

myInvocationHandler.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.tothefor.bao04.handler;

import com.tothefor.bao04.utils.Utils;

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

/**
* @Author DragonOne
* @Date 2021/9/19 09:11
*/
public class myInvocationHandler implements InvocationHandler {
private Object target;

public myInvocationHandler(Object target) {
this.target = target;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("method名称:"+method.getName());//获取当前的方法的名称,doA或doB
Utils.doTime();
Object invoke = method.invoke(target, args);
Utils.doLog();
return invoke;
}
}

测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Test
public void test04(){
//创建目标对象
someService target = new someServiceImpl();
//创建InvocationHandler对象
InvocationHandler handler = new myInvocationHandler(target);
//使用proxy创建代理,第一个参数是目标类的类加载器,第二个是目标类实现了哪些接口,第三个是目标对象的InvocationHandler对象
someService proxy = (someService) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
handler);
//通过代理执行方法,会调用handler中的invoke()方法
proxy.doA();
proxy.doB();
}

本文作者: 墨水记忆
本文链接: https://tothefor.com/DragonOne/2775816476.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!