java设计模式之代理设计模式(Spring核心思想AOP的底层设计模式)

本文介绍了Java中的静态代理和动态代理模式,包括它们的概念、应用场景和优缺点,特别关注在Service层中代理设计的使用,讨论了冗余事务代码的问题以及代理在解耦核心业务和额外功能上的作用。
摘要由CSDN通过智能技术生成

if (i % rows == 0) {

page = i / rows;

} else {

page = i / rows + 1;

}

MybatisUtil.close();

return page;

}

@Override

public void addEmp(Emp emp) {

EmpDao mapper = (EmpDao) MybatisUtil.getMapper(EmpDao.class);

mapper.insertEmp(emp);

MybatisUtil.commit();

}

@Override

public void dropEmp(Integer id) {

EmpDao mapper = (EmpDao) MybatisUtil.getMapper(EmpDao.class);

mapper.deleteEmp(id);

MybatisUtil.commit();

}

@Override

public void update(Emp emp) {

EmpDao mapper = (EmpDao) MybatisUtil.getMapper(EmpDao.class);

mapper.update(emp);

MybatisUtil.commit();

}

@Override

public void plDeleteEmp(List ids) {

EmpDao mapper = (EmpDao) MybatisUtil.getMapper(EmpDao.class);

mapper.plDeleteEmp(ids);

MybatisUtil.commit();

}

@Override

public Emp queryEmp(Integer id) {

EmpDao mapper = (EmpDao) MybatisUtil.getMapper(EmpDao.class);

Emp emp = mapper.queryEmp(id);

MybatisUtil.close();

return emp;

}

}

3、Service层中包含了哪些代码?

Service层中 = 核心功能(几十行 上百代码) + 额外功能(附加功能)

  1. 核心功能

业务运算

DAO调用

  1. 额外功能

  2. 不属于业务

  3. 可有可无

  4. 代码量很小

事务、日志、性能…

从下图中可以看出,现有业务层中控制事务代码出现了大量的冗余,如何解决现有业务层出现的冗余问题?

4、额外功能书写在Service层中好不好?

Service层的调用者的角度(Controller):需要在Service层书写额外功能。

软件设计者:Service层不需要额外功能

5、现实生活中的解决方式

  1. 住酒店不一定需要亲自到酒店去,还可以通过微信支付下的同程艺龙来订酒店。

  2. 我们可以通过中介去找房子,不用直接跟房东沟通(现实生活中,我们更希望直接跟房东沟通)

  3. 春运买票买不到,我们可以找黄牛替我们抢票

  4. 想访问国外的网站,可以使用代理服务器进行访问。

三、代理设计模式

===========================================================================

单词 proxy [ˈprɑːksi] 代理

1、概述

由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。

Java中的代理按照代理类生成时机不同 又分为静态代理和动态代理。

  1. "静态代理"代理类在编译期就生成

  2. "动态代理"代理类则是在Java运行时动态生成。动态代理又有JDK代理和CGLib代理两种。

2、结构

代理(Proxy)模式分为三种角色:

  • 抽象主题(Subject)类: 通过接口或抽象类 声明真实主题和代理对象实现的业务方法。

  • 真实主题(Real Subject)类: 实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。

  • 代理(Proxy)类 : 提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

联想,戴尔就是真实主题(Subject),代理对象(地方代理商),真实主题类(联想公司对象),代理类(地方代理商)代理联想和戴尔,代理的规范就是抽象主题类

1、什么是代理? 中介

代理是java中的一种设计模式:代理设计模式

2、为什么需要代理?

有没有代理都可以完成当前的功能,但是存在代理之后,更加专注于核心的业务功能,额外功能可以交给代理去做,实现功能的解耦合

  • 生活案例:小红正在做饭,但是男朋友小李给他发消息,他如果边做饭边发消息,影响做饭的效率,他就可以口述给她的闺蜜让她闺蜜和男朋友聊天,自己认真做饭,闺蜜就是代理,"如花"就是一个接口

在这里插入图片描述

3、代理的好处?

保证核心功能完成的前提下,同时兼顾额外功能

4、怎么开发代理对象?

1、代理对象一定依赖于核心业务对象

2、代理对象和核心业务对象一定要实现相同的接口

四、静态代理

=========================================================================

1、什么是静态代理

  • 静态代理:手工为某个类开发一个代理类,一个类对应一个代理类

  • 通过代理类,为原始类(目标)增加额外的功能

  • 好处:利于原始类(目标)的维护

2、名词解释

  1. 目标类 原始类 被代理的对象

指的是 业务类 (核心功能 --> 业务运算 DAO调用)

  1. 目标方法,原始方法

目标类(原始类)中的方法 就是目标方法(原始方法)

  1. 额外功能 (附加功能)

日志,事务,性能,数据清洗

3、代理开发的核心要素

代理类 = 目标类(原始类) + 额外功能 + 原始类(目标类)实现相同的接口

房东 —> public interface UserService{

m1

m2

}

UserServiceImpl implements UserService{

m1 —> 业务运算 DAO调用

m2

}

UserServiceProxy implements UserService

m1

m2

4、编码(静态代理的开发)

  • 开发代理的原则: 代理类和目标类功能一致且实现相同的接口,同时代理类中依赖于目标类对象
(1)UserService接口

public interface UserService {

void save(String name);

void delete(String id);

void update();

String findAll(String name);

String findOne(String id);

}

(2)开发静态代理类

/**

  • @author 王恒杰

  • @version 1.0

  • @date 2021/11/11 11:14

  • @email 1078993387@qq.com

  • @Address 天津

  • @Description:开发原则:代理类和目标类实现相同接口,依赖于真正的目标类

*/

public class UserServiceStaticProxy implements UserService{

/**

  • 真正的目标类 (target 原始业务逻辑对象)

*/

private UserService userService;

public void setUserService(UserService userService) {

this.userService = userService;

}

@Override

public void save(String name) {

try {

System.out.println(“开启事务”);

userService.save(name);

System.out.println(“提交事务”);

}catch (Exception e){

System.out.println(“回滚事务”);

e.printStackTrace();

}

}

@Override

public void delete(String id) {

try {

System.out.println(“开启事务”);

userService.delete(id);

System.out.println(“提交事务”);

}catch (Exception e){

System.out.println(“回滚事务”);

e.printStackTrace();

}

}

@Override

public void update() {

try {

System.out.println(“开启事务”);

userService.update();

System.out.println(“提交事务”);

}catch (Exception e){

System.out.println(“回滚事务”);

e.printStackTrace();

}

}

@Override

public String findAll(String name) {

String all=null;

try {

System.out.println(“开启事务”);

all = userService.findAll(name);

System.out.println(“提交事务”);

}catch (Exception e){

System.out.println(“回滚事务”);

e.printStackTrace();

}

return all;

}

@Override

public String findOne(String id) {

String one=null;

try {

System.out.println(“开启事务”);

one= userService.findOne(id);

System.out.println(“提交事务”);

}catch (Exception e){

System.out.println(“回滚事务”);

e.printStackTrace();

}

return one;

}

}

(3)修改目标实现类

public class UserServiceImpl implements UserService {

@Override

public void save(String name) {

System.out.println(“处理存储业务逻辑,调用DAO~~~”);

}

@Override

public void delete(String id) {

System.out.println(“处理删除业务逻辑,调用DAO~~~”);

}

@Override

public void update() {

System.out.println(“处理更新业务逻辑,调用DAO~~~”);

}

@Override

public String findAll(String name) {

System.out.println(“处理查找所有业务逻辑,调用DAO~~~”);

return name;

}

@Override

public String findOne(String id) {

System.out.println(“处理查询其中一个业务逻辑,调用DAO~~~”);

return id;

}

}

(4)配置静态代理类

(5)调用代理方法

@Test

public void StaticProxyText() {

ClassPathXmlApplicationContext context =

new ClassPathXmlApplicationContext(“ApplicationContext.xml”);

UserService userService =

(UserService) context.getBean(“userServiceStaticProxy”);

userService.delete(“1”);

}

}

a.开发静态代理类

5、静态代理存在的问题

存在问题:造成程序中存在过多的代理类,不利于后期额外功能的维护

  1. 静态类文件数量过多,不利于项目管理

UserServiceImpl——》 UserServiceProxy

OrderServiceImpl——》 OrderServiceProxy

  1. 额外功能维护性差

代理类中 额外功能修改复杂(麻烦)

五、动态代理

=========================================================================

1、什么动态态代理

  • 动态代理:在程序运行的过程中,JVM动态的为某个类生成代理对象

  • 概念:通过代理类为原始类(目标类)增加额外功能

  • 好处:利于原始类(目标类)的维护

  • 常用的动态代理技术

  1. JDK 代理 : 基于接口的动态代理技术

  2. cglib 代理:基于父类的动态代理技术

  • DK动态代理是利用反射机制生成一个实现代理接口的匿名类 ,在调用具体方法前调用InvokeHandler (调用处理程序的意思)来处理。

  • 而cglib动态代理是利用asm开源包 ,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

  • 使用场景

1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

img
img

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
img

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)

在这里插入图片描述

最新整理电子书

在这里插入图片描述

不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-lktv3hNA-1711560283606)]
[外链图片转存中…(img-IBDyDoxd-1711560283607)]
[外链图片转存中…(img-V638DdGE-1711560283608)]
[外链图片转存中…(img-GSXY19PN-1711560283608)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

[外链图片转存中…(img-fCW3aLhV-1711560283608)]
[外链图片转存中…(img-NF0vfA2Q-1711560283609)]

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
[外链图片转存中…(img-boSavX4Q-1711560283609)]

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)

[外链图片转存中…(img-vcByzaDH-1711560283609)]

最新整理电子书

[外链图片转存中…(img-l07v9TES-1711560283610)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值