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层中 = 核心功能(几十行 上百代码) + 额外功能(附加功能)
- 核心功能
业务运算
DAO调用
-
额外功能
-
不属于业务
-
可有可无
-
代码量很小
事务、日志、性能…
从下图中可以看出,现有业务层中
控制事务代码出现了大量的冗余
,如何解决现有业务层出现的冗余问题?
4、额外功能书写在Service层中好不好?
Service层的调用者的角度(Controller):需要在Service层书写额外功能。
软件设计者:Service层不需要额外功能
5、现实生活中的解决方式
-
住酒店不一定需要亲自到酒店去,还可以通过微信支付下的同程艺龙来订酒店。
-
我们可以通过中介去找房子,不用直接跟房东沟通(现实生活中,我们更希望直接跟房东沟通)
-
春运买票买不到,我们可以找黄牛替我们抢票
-
想访问国外的网站,可以使用代理服务器进行访问。
===========================================================================
单词 proxy [ˈprɑːksi] 代理
1、概述
由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
Java中的代理按照代理类生成时机不同 又分为静态代理和动态代理。
-
"静态代理"代理类在编译期就生成
-
"动态代理"代理类则是在Java运行时动态生成。动态代理又有JDK代理和CGLib代理两种。
2、结构
代理(Proxy)模式分为三种角色:
-
抽象主题(Subject)类: 通过接口或抽象类 声明真实主题和代理对象实现的业务方法。
-
真实主题(Real Subject)类: 实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
-
代理(Proxy)类 : 提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
1、什么是代理? 中介
代理是java中的一种设计模式:代理设计模式
2、为什么需要代理?
有没有代理都可以完成当前的功能,但是存在代理之后,更加专注于核心的业务功能,额外功能可以交给代理去做,实现功能的解耦合
- 生活案例:小红正在做饭,但是男朋友小李给他发消息,他如果边做饭边发消息,影响做饭的效率,他就可以口述给她的闺蜜让她闺蜜和男朋友聊天,自己认真做饭,闺蜜就是代理,"如花"就是一个接口
3、代理的好处?
保证核心功能完成的前提下,同时兼顾额外功能
4、怎么开发代理对象?
1、代理对象一定依赖于核心业务对象
2、代理对象和核心业务对象一定要实现相同的接口
=========================================================================
1、什么是静态代理
-
静态代理:手工为某个类开发一个代理类,一个类对应一个代理类
-
通过代理类,为原始类(目标)增加额外的功能
-
好处:利于原始类(目标)的维护
2、名词解释
- 目标类 原始类 被代理的对象
指的是 业务类 (核心功能 --> 业务运算 DAO调用)
- 目标方法,原始方法
目标类(原始类)中的方法 就是目标方法(原始方法)
- 额外功能 (附加功能)
日志,事务,性能,数据清洗
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、静态代理存在的问题
存在问题:造成程序中存在过多的代理类,不利于后期额外功能的维护
- 静态类文件数量过多,不利于项目管理
UserServiceImpl——》 UserServiceProxy
OrderServiceImpl——》 OrderServiceProxy
- 额外功能维护性差
代理类中 额外功能修改复杂(麻烦)
=========================================================================
1、什么动态态代理
-
动态代理:在程序运行的过程中,JVM动态的为某个类生成代理对象
-
概念:通过代理类为原始类(目标类)增加额外功能
-
好处:利于原始类(目标类)的维护
-
常用的动态代理技术
-
JDK 代理 : 基于接口的动态代理技术
-
cglib 代理:基于父类的动态代理技术
-
DK动态代理是利用反射机制生成一个实现代理接口的匿名类 ,在调用具体方法前调用InvokeHandler (调用处理程序的意思)来处理。
-
而cglib动态代理是利用asm开源包 ,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
-
使用场景
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
最后
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新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)]