深圳网站开发深圳网站设计三创大赛网站建设
- 作者: 五速梦信息网
- 时间: 2026年03月21日 09:19
当前位置: 首页 > news >正文
深圳网站开发深圳网站设计,三创大赛网站建设,帮别人做网站必须要开公司,纯代码wordpress底部悬浮菜单目录 编辑一、静态代理设计模式 1、为什么需要代理设计模式 2、代理设计模式 #xff08;1#xff09;概念 #xff08;2#xff09;名词解释 #xff08;3#xff09;代理开发的核心要素 #xff08;4#xff09;编码 #xff08;5#xff09;静态代理存在… 目录 编辑一、静态代理设计模式 1、为什么需要代理设计模式 2、代理设计模式 1概念 2名词解释 3代理开发的核心要素 4编码 5静态代理存在的问题 二、Spring 的动态代理开发 1、Spring 动态代理的概念 2、搭建开发环境 3、Spring 动态代理的开发步骤 1创建原始对象目标对象 2提供额外功能 3定义切入点 4组装 5调用 4、动态代理细节分析 三、Spring 动态代理详解 1、额外功能的详解 1MethodbeforeAdvice 2MethodInterceptor(方法拦截器) 2、切入点详解 1切入点表达式 1、方法切入点表达式 2、类切入点 3、包切入点 2切入点函数 1、execution 2、args 3、within 4、annotation 5、切入点函数的逻辑运算 一、静态代理设计模式 1、为什么需要代理设计模式 在 JavaEE 分层开发中哪个层次对于我们来说是最重要的 Java 的开发思路 DAO — Service — Controller 其中最重要的是 Service 因为做任何一个项目写任何一段代码最主要的目的都是为了满足用户的需求 Service 中包含了哪些代码 Service 中 核心功能几十行 上百行代码 额外功能附加功能 1、核心功能 业务运算 DAO 调用 2、额外功能 1不属于业务 2可有可无 3代码量小 事务、日志、性能…. 额外功能 书写在 Service 中到底好不好呢 Service 层调用者的角度Controller需要在 Service 中书写额外功能 软件设计者的角度Service 中不需要额外功能会造成代码不好维护 现实生活中的解决方式 我们把房东当成一个类业务类 Service房东提供了出租房屋的业务方法 出租房屋的核心功能就是签合同和收钱但是出租房屋光有核心功能是不够的还得有一些额外功能广告看房。类似于事务日志…. 站在房东的角度来讲它不愿意做这些额外功能了但是房客不允许房东不做这些额外功能要想解决这个问题就得引入一个新的角色中介代理类 中介就代替房东提供了这些额外功能广告和看房在这些方法中首要的职责就是把房东曾经不干的额外功能由中介来干 但是最核心的功能还是由房东自身来做的这个时候对于房客来讲既能享受到房东提供的核心功能又能享受到中介提供的额外功能诉求就满足了 如果有朝一日对额外功能不满意了不需要修改原来的代码可以直接换一个新的中介公司让它提供一个新的额外方法代码的维护性也就大大提高了 2、代理设计模式 1概念 通过代理类为原始类增加额外的功能 好处利于原始类的维护 2名词解释 1、目标类 / 原始类也就是房东指的是业务类核心功能 – 业务运算 – DAO 的调用 2、目标方法 / 原始方法目标类原始类中的方法就是目标方法原始方法 3、额外功能附加功能以日志事务性能…为代表 3代理开发的核心要素 代理类 目标类原始类 额外功能 原始类目标类实现相同的接口 房东 — public interface UserService{m1m2}UserServiceImpl implements UserService{m1 — 业务运算 DAO调⽤m2}UserServiceProxy implements UserService{m1m2 } 4编码 //代理类的开发 public class UserServiceProxy implements UserService{//获得原始对象private UserServiceImpl userService new UserServiceImpl();Overridepublic void register(User user) {System.out.println(——log——–);userService.register(user);}Overridepublic boolean login(String name, String password) {System.out.println(——-log——);return userService.login(name,password);} } 5静态代理存在的问题 1、静态代理文件数量过多会不利于项目管理 有一个 UserServiceImpl 的原始类就要提供一个 UserServiceproxy 的代理类与之对应的类的数量就会成倍的增长 2、额外功能维护性差 当我们想换一个日志的实现方式的时候很多代码都得跟着修改所以代码的维护性非常差 二、Spring 的动态代理开发 1、Spring 动态代理的概念 概念通过代理类为原始类目标类增加额外功能 优点利于原始类目标类的维护 2、搭建开发环境 引入 Spring 动态代理相关的 jar 包 dependencygroupIdorg.springframework/groupIdartifactIdspring-aop/artifactIdversion5.1.14.RELEASE/version /dependencydependencygroupIdorg.aspectj/groupIdartifactIdaspectjrt/artifactIdversion1.8.8/version /dependencydependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactIdversion1.8.3/version /dependency 3、Spring 动态代理的开发步骤 1创建原始对象目标对象 public class UserServiceImpl implements UserService{Overridepublic void register(User user) {System.out.println(UserServiceImpl.register 业务运算 DAO );}Overridepublic boolean login(String name, String password) {System.out.println(UserServiceImpl.login);return true;} } bean iduserService classproxy.OrderServiceImpl/bean 2提供额外功能 MethodBeforeAdvice 是一个接口 我们需要把额外功能写在接口的实现中额外功能会在原始方法执行之前运行额外功能 public class Before implements MethodBeforeAdvice {//作用需要把运行在原始方法运行之前运行的额外功能书写在 beofre 方法中Overridepublic void before(Method method, Object[] objects, Object o) throws Throwable {System.out.println(——method before advice——-);} } bean idbefore classdynamic.Before/bean 3定义切入点 切入点额外功能加入的位置 Spring 引入切入点的目的由程序员根据自己的需要来决定额外功能加入给哪个原始方法 简单的测试所有方法都作为切入点都加入额外的功能 通过 Spring 的配置文件完成 expression 切入点表达式要根据自己的需求来写 aop:config !– 所有的方法都作为切入点加入额外功能 –aop:pointcut id pc expression execution(* (..))//aop:config 4组装 把 第二步 和 第三步 进行整合 aop:config !– 所有的方法都作为切入点加入额外功能 –aop:pointcut id pc expression execution( *(..))/!– 组装把切入点和额外功能进行整合 –aop:advisor advice-refbefore pointcut-ref pc//aop:config 表达的含义所有的方法都加入 before 的额外功能 5调用 目的获得 Spring 工厂创建的动态代理对象并进行调用 ApplicationContext ctx new ClassPathXmlApplicationContext(/applicationContext.xml);//注意 // 1、Spring 的工厂通过原始对象的 id 值获得的是代理对象 // 2、获得代理对象之后可以通过声明接口类型进行对象的存储UserService userService (UserService) ctx.getBean(userService);userService.login(); userService.registere(); 注意 1、Spring 的工厂通过原始对象的 id 值获得的是代理对象 2、获得代理对象之后可以通过声明接口类型进行对象的存储 4、动态代理细节分析 1Spring 创建的动态代理类在哪里 动态代理类是 Spring 框架在运行时通过动态字节码技术在虚拟机中创建的运行在虚拟机内部等程序结束后会和虚拟机一起消失 动态字节码技术通过第三方动态字节码框架在虚拟机中创建对应的类的字节码进而创建对象当虚拟机关闭动态字节码也跟着消失 结论动态代理不需要定义类文件都是 JVM 运行过程当中动态创建的所以不会造成静态代理中类文件数量过多影响项目管理的问题 2动态代理编程会简化代理的开发 在额外功能不改变的前提下创建其它目标类原始类的代理对象时只需要指定原始目标对象即可 3动态代理的维护性大大增强了 对额外功能不满意的情况下不用进行修改直接创建一个新的额外功能即可 三、Spring 动态代理详解 1、额外功能的详解 1MethodbeforeAdvice 1、MethodBeforeAdvice 接口作用额外功能在运行在原始方法执行之前进行额外功能操作。 2、before 方法的 3 个参数在实战中 该如何使用 before 方法的参数在实战中会根据需要来进行使用不一定都会用到也有可能都不用 Servlet{service(HttpRequest request,HttpResponse response){request.getParameter(name) –response.getWriter() —} } 2MethodInterceptor(方法拦截器) 和 MethodBeforeAdvice 的区别 MethodBeforeAdvice 只能运行在原始方法执行之前相对来讲功能比较单一 MethodInterceptor可以运行在原始方法执行之前也可以运行在原始方法执行之后灵活性更高 注意在这里我们选择 aopllicance 的包提供的接口 public class Arround implements MethodInterceptor {/invoke 方法的作用 额外功能书写在 invoke额外功能可以运行在原始方法之前原始方法之后原始方法的之前和之后要先提前确定原始方法如何运行参数MethodInvocation 类似前面提到的的Method代表额外功能所增加给的原始方法invocation.proceed() 就代表对应的方法的执行返回值Object:原始方法的返回值/Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println(—–额外功能 log—-);Object ret invocation.proceed();return ret;} } bean idarround classdynamic.Arround/beanaop:config!– 所有的方法都作为切入点加入额外功能 –aop:pointcut id pc expression execution(* (..))/!– 组装把切入点和额外功能进行整合 –aop:advisor advice-refarround pointcut-ref pc//aop:config 2、切入点详解 切入点决定了额外功能加入的位置 aop:pointcut idpc expressionexecution( (..))/ exection( (..)) — 匹配了所有⽅法 1、execution : 切入点函数 2、 *(..) 切入点表达式 1切入点表达式 1、方法切入点表达式
*(..) — 所有方法 * — 修饰符 返回值
— ⽅法名 ()— 参数表 ..— 对于参数没有要求 (参数有没有参数有⼏个都⾏参数是什么类型的都⾏) 定义 login 方法作为切入点
login(..) 定义 login 方法,且 login 方法有两个字符串类型的参数作为切入点
login(String,String) 注意如果参数的类型不是 java.lang 包当中的那必须写类型的权限定名
regidter(proxy.User) 2、类切入点 指定类作为切入点额外功能加入的位置自然这个类中的所有方法都会加上对应的额外功能了 aop:config!– 类的方法都作为切入点加入额外功能 –aop:pointcut id pc expression execution(* proxy.UserServiceImpl.*(..))/!– 组装把切入点和额外功能进行整合 –aop:advisor advice-refarround pointcut-ref pc//aop:config 类中所有方法加入额外功能
类中所有的方法都加入了额外功能
proxy.userService.*(..) 忽略包
类只存在一层包
.UserServiceImpl.(..)## 类存在多层包
..UserServiceImpl.(..) 3、包切入点 指定包作为额外功能加入的位置自然包中的所有类及其方法都会加入额外的功能 # 切入点包中的所有类必须在 proxy 中不能在 proxy 包的子包中* proxy..(..)
切入点当前包及当前包的子包都生效* proxy...(..) 2切入点函数
切入点函数用于执行切入点表达式 1、execution execution 是最为重要的切入点函数功能最全 可以执行方法切入点表达式类切入点表达式包切入点表达式 弊端execution 在执行切入点表达式的时候书写麻烦 注意其它的切入点函数仅仅简化的是 execution 书写复杂度功能上完全一致 2、args 作用主要用于函数方法参数的匹配 切入点方法的参数必须得是两个字符串类型的参数 execution( * *(String,String) )args(String,String) 3、within 作用主要用于进行类、包切入点表达式的匹配 切入点 UserServiceImpl execution( * ..UserService.(..) )within( * .. UserServiceImpl )execution(* proxy...(..) )within( proxy.. ) 4、annotation 作用为具有特殊注解的方法加入额外功能 aop: pointcut id expression annotation(Log)/5、切入点函数的逻辑运算 指的是整合多个切入点函数一起配合工作进而完成更为复杂的需求 and 与操作 案例方法名login 参数String ,String execution ( * login(String,String) )execution ( * login(..) ) and args( String,String ) 注意与操作不能用于同种类型的切入点函数 例如 execution and execution or 或操作 案例register⽅法 和 login⽅法作为切⼊点 execution(* login(..)) or execution(* register(..))
- 上一篇: 深圳网站开发哪家专业自己的网站怎么接广告
- 下一篇: 深圳网站开发专业团队平台设计什么意思
相关文章
-
深圳网站开发哪家专业自己的网站怎么接广告
深圳网站开发哪家专业自己的网站怎么接广告
- 技术栈
- 2026年03月21日
-
深圳网站开发哪个好哪家的云服务器便宜
深圳网站开发哪个好哪家的云服务器便宜
- 技术栈
- 2026年03月21日
-
深圳网站建设咨询公司沈阳建设工程信息网作废了吗
深圳网站建设咨询公司沈阳建设工程信息网作废了吗
- 技术栈
- 2026年03月21日
-
深圳网站开发专业团队平台设计什么意思
深圳网站开发专业团队平台设计什么意思
- 技术栈
- 2026年03月21日
-
深圳网站设计 建设首选深圳市wordpress前端会员面板
深圳网站设计 建设首选深圳市wordpress前端会员面板
- 技术栈
- 2026年03月21日
-
深圳网站设计 制作适合个人做的跨境电商
深圳网站设计 制作适合个人做的跨境电商
- 技术栈
- 2026年03月21日
