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一个对象后再次运行 仅仅为一个实现类对象

最新文章

  1. ThinkPHP真正疑难问题笔记
  2. sql server删除默认值(default)的方法
  3. Linux下获得系统时间的C语言实现
  4. golang反射初试
  5. Fbric、Ansible、Docker、Chaos Monkey:DevOps工具的年中回顾
  6. ubuntu下root用户配置
  7. python RabbitMQ队列使用(入门篇)
  8. [C++程序设计]有默认参数的函数
  9. Redmine开启服务
  10. 通过 Spring RestTemplate 调用带请求体的 Delete 方法(Delete With Request Body)
  11. p1217晚餐(简单的dijkstra)
  12. python带参函数(计算器脚本解释标注)
  13. linux(ubuntu)共享文件夹
  14. CUDA 编程的基本模式
  15. AWVS结果分析与实践-XSS
  16. jdk1.8.0_45源码解读——Map接口和AbstractMap抽象类的实现
  17. 机器装多个版本php,并安装redis插件报错【已解决】
  18. SSM框架整合的详细过程(含每一步的分析及代码)。实质上是SpringMVC与mybatis的整合,应为spring与SpringMVC不需要整合。
  19. C#控制台程序,运行完窗口不退出的方法
  20. 学号20155311 2016-2017-2 《Java程序设计》第4周学习总结

热门文章

  1. 【LeetCode】81. 搜索旋转排序数组 II
  2. 探究Presto SQL引擎(1)-巧用Antlr
  3. 使用jwt来保护你的接口服务
  4. Android源码解析——Handler、Looper与MessageQueue
  5. Linux命令(一)之目录结构、Linux终端操作、关机重启等一些基本操作
  6. pfx格式密钥库修改密码
  7. Python--数据存储
  8. mingw+gcc 10.1下载
  9. NOIP 模拟 $25\; \rm string$
  10. Vue 插槽 slot的简单实用