建设电影网站论文,三亚政策最新消息,房产公司网站模板,企业推广语JDK动态代理#xff08;tedu#xff09;#xff08;内含源代码#xff09;
源代码下载链接地址#xff1a;https://download.csdn.net/download/weixin_46411355/87546187 目录JDK动态代理#xff08;tedu#xff09;#xff08;内含源代码#xff09;源代码下载链接…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{Overridepublic void addUser() {System.out.println(完成用户新增);}Overridepublic 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() {Overridepublic 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()方法所以会出现事务开始和事务提交。