JDK动态代理(tedu)(内含源代码)
源代码下载链接地址:
https://download.csdn.net/download/weixin_46411355/87546187
目录
- JDK动态代理(tedu)(内含源代码)
- `源代码下载链接地址:`[https://download.csdn.net/download/weixin_46411355/87546187](https://download.csdn.net/download/weixin_46411355/87546187)
- 一、创建一个SpringBoot项目
- 二、配置类
- 三、service层
- 3.1 接口类
- 3.2 实现类
- 四、JDK动态代理,根据目标类获取代理类的方法
- 五、测试类
- 六、测试结果
- 问题:为什么 System.out.println(proxy);会打印事务开始和事务提交?
一、创建一个SpringBoot项目
二、配置类
SpringConfig
package com.tedu.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan("com.tedu")
@Configuration
public class SpringConfig {
}
三、service层
3.1 接口类
UserService
package com.tedu.service;
public interface UserService {
void addUser();
void deleteUser();
}
3.2 实现类
package com.tedu.service;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService{
@Override
public void addUser() {
System.out.println("完成用户新增");
}
@Override
public void deleteUser() {
System.out.println("完成用户删除");
}
}
四、JDK动态代理,根据目标类获取代理类的方法
package com.tedu.proxy;
import com.sun.corba.se.spi.ior.ObjectKey;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxy {
public static Object getProxy(Object target){
//1.获取类加载器
ClassLoader classLoader = target.getClass().getClassLoader();
//2.获取接口
Class<?>[] interfaces = target.getClass().getInterfaces();
//通过代理的类新创建一个代理的对象
return Proxy.newProxyInstance(classLoader, interfaces, getInvocationHandler(target));
}
//代理对象执行方法是调用
public static InvocationHandler getInvocationHandler(Object target){
//这些代码都是写死的
return new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("======================事务开始=============================");
//执行目标(真实对象的方法)
Object result = method.invoke(target, args);
System.out.println("==========================事务提交============================");
return result;
}
};
}
}
五、测试类
package com.tedu.test;
import com.tedu.config.SpringConfig;
import com.tedu.proxy.JDKProxy;
import com.tedu.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringTx {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = applicationContext.getBean(UserService.class);
System.out.println(userService.getClass());
UserService proxy = (UserService)JDKProxy.getProxy(userService);
System.out.println(proxy.getClass());
System.out.println(proxy);
System.out.println(proxy.toString());
//基于代理对象,执行业务操作 实现方法扩展
proxy.addUser();
proxy.deleteUser();
}
}
六、测试结果
问题:为什么 System.out.println(proxy);会打印事务开始和事务提交?
因为System.out.println(proxy);默认等价于System.out.println(proxy.toString());虽然没有调用业务方法,但还是调用了目标对象的toString()方法,所以会出现事务开始和事务提交。