通过JDK动态代理实现 Spring AOP
2024-10-19 10:59:28
1.新建一个目标类
接口:public interface IUserService
//切面编程
public void addUser();
public void updateUser( );
public void deleteUser( );
}
实现类:
@Service
public class UserServiceImpl implements IUserService {
@Override
public void addUser() {
}
@Override
public void updateUser() {
}
@Override
public void deleteUser() {
System.out.println("删除用户");
}
}
切面类: 增强代码与切入点结合
public class MyAspect {
public void before(){
System.out.println("开启事务");
}
public void after(){
System.out.println("提交事务");
}
}
2.新建一个工厂类
public class MyBeanFactory {
/**
* JDk实现的代理
* @return
*/
public static IUserService createUserService(){
//1创建对象
final IUserService userService= new IUserviceImpl();
System.out.println(userService);
//2声明切面类对象
final MyAspect aspect=new MyAspect();
//3把切面类2个方法 应用 到目标类
//3.1创建jdk代理
/* newProxyInstance(
ClassLoader loader, //类加载器
Class<?>[] interfaces, 接口
InvocationHandler h) 处理
*/
IUserService proxyService = (IUserService) Proxy.newProxyInstance(
MyBeanFactory.class.getClassLoader(),
userService.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//开启事务
aspect.before();
//方法返回值是 业务方法的返回值
Object retObj = method.invoke(userService, args);
System.out.println("拦截的返回值" + retObj);
//提交事务
aspect.after();
return retObj;
}
}
);
//返回代理
return proxyService;
}
创建测试类
执行结果:可以看出手写的拦截器经jdk代理 增强成功
通过debug运行可以发现对象由代理创建:
new一个对象后再次运行 仅仅为一个实现类对象
最新文章
- ThinkPHP真正疑难问题笔记
- sql server删除默认值(default)的方法
- Linux下获得系统时间的C语言实现
- golang反射初试
- Fbric、Ansible、Docker、Chaos Monkey:DevOps工具的年中回顾
- ubuntu下root用户配置
- python RabbitMQ队列使用(入门篇)
- [C++程序设计]有默认参数的函数
- Redmine开启服务
- 通过 Spring RestTemplate 调用带请求体的 Delete 方法(Delete With Request Body)
- p1217晚餐(简单的dijkstra)
- python带参函数(计算器脚本解释标注)
- linux(ubuntu)共享文件夹
- CUDA 编程的基本模式
- AWVS结果分析与实践-XSS
- jdk1.8.0_45源码解读——Map接口和AbstractMap抽象类的实现
- 机器装多个版本php,并安装redis插件报错【已解决】
- SSM框架整合的详细过程(含每一步的分析及代码)。实质上是SpringMVC与mybatis的整合,应为spring与SpringMVC不需要整合。
- C#控制台程序,运行完窗口不退出的方法
- 学号20155311 2016-2017-2 《Java程序设计》第4周学习总结