当前位置: 首页 > news >正文

设计网站制企业网站建设和网络营销的关系

设计网站制,企业网站建设和网络营销的关系,加盟网站建设案例欣赏,洛阳做网站找哪家好代理模式 二十三种设计模式中的一种#xff0c;属于结构型模式。它的作用就是通过提供一个代理类#xff0c;让我们在调用目标方法的时候#xff0c;不再是直接对目标方法进行调用#xff0c;而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来…代理模式 二十三种设计模式中的一种属于结构型模式。它的作用就是通过提供一个代理类让我们在调用目标方法的时候不再是直接对目标方法进行调用而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来——解耦。调用目标方法时先调用代理对象的方法减少对目标方法的调用和打扰同时让附加功能能够集中在一起也有利于统一维护。 可以将重复的非核心的代码写在代理类中将核心的代码写在目标方法中每次通过调用代理类的方法来间接调用目标方法以方便统一管理重复的非核心的代码。 静态代理 每个目标方法都有其对应的代理类中的代理方法重复的非核心的代码都写在代理类中例 public class StaticProxyCalculator implements Calculator {private Calculator calculator;public StaticProxyCalculator(Calculator calculator) {this.calculator calculator;}Overridepublic int add(int i, int j) {System.out.println(i i , j j);int result calculator.add(i,j);System.out.println(result result);return result;}Overridepublic int sub(int i, int j) {System.out.println(i i , j j);int result calculator.sub(i,j);System.out.println(result result);return result;}Overridepublic int mul(int i, int j) {System.out.println(i i , j j);int result calculator.mul(i,j);return result;}Overridepublic int div(int i, int j) {System.out.println(i i , j j);int result calculator.div(i,j);System.out.println(result result);return 0;} }但是这种方法还是有大量重复也没有很好地解决统一管理的问题也不具备灵活性所以要使用动态代理的方法 动态代理 动态代理技术分类 JDK动态代理JDK原生的实现方式需要被代理的目标类必须实现接口他会根据目标类的接口动态生成一个代理对象代理对象和目标对象有相同的接口。cglib通过继承被代理的目标类实现代理所以不需要目标类实现接口。 以jdk代理为例了解即可 代理类 public class ProxyFactory {private Object target;public ProxyFactory(Object target) {this.target target;}public Object getProxy(){/*** newProxyInstance()创建一个代理实例* 其中有三个参数* 1、classLoader加载动态生成的代理类的类加载器* 2、interfaces目标对象实现的所有接口的class对象所组成的数组* 3、invocationHandler设置代理对象实现目标对象方法的过程即代理类中如何重写接口中的抽象方法*/ClassLoader classLoader target.getClass().getClassLoader();Class?[] interfaces target.getClass().getInterfaces();InvocationHandler invocationHandler new InvocationHandler() {Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {/*** proxy代理对象* method代理对象需要实现的方法即其中需要重写的方法* argsmethod所对应方法的参数*/Object result null;try {System.out.println([动态代理][日志] method.getName()参数 Arrays.toString(args));result method.invoke(target, args);System.out.println([动态代理][日志] method.getName()结果 result);} catch (Exception e) {e.printStackTrace();System.out.println([动态代理][日志] method.getName()异常e.getMessage());} finally {System.out.println([动态代理][日志] method.getName()方法执行完毕);}return result;}};return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);} }public class Test {/*** 静态代理*/org.junit.jupiter.api.Testpublic void test1(){Calculator target new CalculatorPureImpl();Calculator calculator new StaticProxyCalculator(target);calculator.add(3,4);}/*** 动态代理*/org.junit.jupiter.api.Testpublic void test2(){//创建目标对象Calculator target new CalculatorPureImpl();//获取代理对象ProxyFactory factory new ProxyFactory(target);Calculator proxy (Calculator) factory.getProxy();proxy.add(3,4);} }不需要编写代理代码我们可以使用Spring AOP实现代理 面向切面编程AOP 面向切面编程Aspect Oriented Programming是对面向对象编程的补充和完善。面向对象编程是通过纵向的继承和实现来实现功能的管理。而面向切面编程是将代码中的重复的非核心的业务提取到一个公共的地方通过动态代理技术横向插入到各个方法中去。解决非核心代码的冗余问题。 关于AOP的几个名词 横切关注点 从每一个方法中抽取出来的同一类非核心业务。业务处理的主要流程是核心关注点其他非主要流程就是横切关注点。 通知增强 每一个横切关注点上要做的事情都需要一个方法来实现这样的方法称之为通知方法 前置通知在被代理的目标方法前执行返回通知在被代理的目标方法成功结束后执行异常通知在被代理的目标方法异常结束后执行后置通知在被代理的目标方法最终结束后执行环绕通知使用try...catch...finally结构围绕整个被代理的目标方法包括上面四种通知对应的所有位置 连接点 指那些被拦截的点在Spring中指可以被动态代理拦截目标类的方法 切入点 定位连接点的方式被选中的连接点 切面aspect 切入点和通知的结合指的是通知类 目标target 被代理的目标对象 代理proxy 向目标对象通知之后创建的代理对象 织入weave 指把通知应用到目标上生成代理对象的过程。可以再编译期间织入也可以再运行期间织入spring使用运行期间织入 Spring AOP框架 Spring AOP框架是基于AOP编程思维封装动态代理技术简化动态代理技术实现的框架。SpringAOP内部帮助实现动态代理只需写少量的配置指定生效范围即可,即可完成面向切面思维编程的实现 aop只能对ioc容器内的对象创建代理对象代理对象会存储到ioc容器 基于注解方式实现 底层技术组成 动态代理InvocationHandlerJDK原生的实现方式需要被代理的目标类必须实现接口。因为这个技术要求代理对象和目标对象实现同样的接口。cglib通过继承被代理的目标类实现代理所以不需要目标类实现接口。AspectJ早期的AOP实现的框架SpringAOP借用了AspectJ中的AOP注解。 aop的实现步骤 正常写核心业务和配置ioc定义增强类定义增强方法配置增强类开启aop的配置 aop大致实现例子 增强类 /***内部存储增强代码 */ Component Aspect public class LogAdvice {Before(execution(public int com.ergou.service.impl.CalculatorPureImpl.add(int,int)))public void start(){System.out.println(方法开始了);}After(execution(public int com.ergou.service.impl.CalculatorPureImpl.add(int,int)))public void after(){System.out.println(方法结束了);}AfterThrowing(execution(public int com.ergou.service.impl.CalculatorPureImpl.add(int,int)))public void error(){System.out.println(方法报错了);} }配置类配置aop Configuration ComponentScan(com.ergou) //让程序允许使用AspectJ注解 EnableAspectJAutoProxy public class JavaConfig { }xml文件配置aop和配置类二选一 context:component-scan base-packagecom.ergou/ aop:aspectj-autoproxy/原来的业务代码不需要做改动 测试 SpringJUnitConfig(value JavaConfig.class) public class Test { // Autowiredprivate Calculator calculator;org.junit.jupiter.api.Testpublic void test1(){int add calculator.add(3,4);System.out.println(add);} }注使用jdk的动态代理代理类和目标对象会有同样的接口要使用代理功能要用目标对象的接口获取ioc容器中的对象获取到的将会是代理对象而不是目标对象也证明ioc中真正存储的对象是代理对象而不是目标对象 cglib的生效场景是目标方法的类没有实现接口 五种常见的通知注解 Before: 前置通知AfterReturning:后置通知Around: 环绕通知AfterThrowing:异常通知After :最终通知 获取通知细节信息 需要获取方法签名、传入的实参等信息时可以在通知方法声明JoinPoint类型的形参。 JoinPoint 接口通过 getSignature() 方法获取目标方法的签名方法声明时的完整信息通过目标方法签名对象获取方法名通过 JoinPoint 对象获取外界调用目标方法时传入的实参列表组成的数组 Before(execution(* com.ergou.service.impl.*.*(..))) public void start(JoinPoint joinPoint){ //获取方法所属的目标类的信息 String simpleName joinPoint.getTarget().getClass().getSimpleName();System.out.println(simpleName); //获取方法名称 String name joinPoint.getSignature().getName();System.out.println(name); //获取访问修饰符 int modifiers joinPoint.getSignature().getModifiers();String s Modifier.toString(modifiers); //获取参数列表 Object[] args joinPoint.getArgs();for (Object o :args) {System.out.println(o);} }获取返回结果要在AfterReturning注解标注的方法内进行先在方法的形参列表中加一个Object类型的形参变量假设变量名取为result用来接收返回值信息在AfterReturning注解中加上属性returning其值为接收返回值信息的形参变量名result例 AfterReturning(value execution(* com.ergou.service.impl.*.*(..)),returning result) public void afterReturning(JoinPoint joinPoint,Object result){System.out.println(result); }获取异常信息与获取返回结果类似。要在AfterThrowing注解标注的方法内进行先在方法的形参列表中加一个Throwable类型的形参变量假设变量名取为throwable用来接收异常信息在AfterThrowing注解中加上属性throwing其值为接收异常信息的形参变量名throwable例 AfterThrowing(value execution(* com.ergou.service.impl.*.*(..)),throwing throwable) public void afterThrowing(JoinPoint joinPoint,Throwable throwable){throwable.getStackTrace(); }切点表达式 切点表达式作用 AOP切点表达式Pointcut Expression是一种用于指定切点的语言它可以通过定义匹配规则来选择需要被切入的目标对象。 切点表达式写在通知注解的value属性中如果没有其他属性可以省略value 切点表达式语法 语法细节 ..不能作为开头可以写做*..参数列表部分如果写做(String..)意思是参数列表只要开头的第一个参数是String类型的即可后面随意。(..String)即为结尾为String类型的参数前面随意。String..int同理。 切点表达式的提取和复用 当前类中提取 步骤 定义一个空方法加上Pointcut在注解的括号中写入指定的切点表达式在通知注解中的value属性中直接写Pointcut注解标记的方法的方法名加括号即可 例 Aspect Component public class MyAdvice {Pointcut(execution(* com.ergou.service.impl.*.*(..)))public void pc(){}Before(pc())public void start(JoinPoint joinPoint){ //获取方法所属的目标类的信息 String simpleName joinPoint.getTarget().getClass().getSimpleName();System.out.println(simpleName); //获取方法名称 String name joinPoint.getSignature().getName();System.out.println(name); //获取访问修饰符 int modifiers joinPoint.getSignature().getModifiers();String s Modifier.toString(modifiers); //获取参数列表 Object[] args joinPoint.getArgs();for (Object o :args) {System.out.println(o);}}AfterReturning(value pc(),returning result)public void afterReturning(JoinPoint joinPoint,Object result){System.out.println(result);}After(pc())public void after(){}AfterThrowing(value pc(),throwing throwable)public void afterThrowing(JoinPoint joinPoint,Throwable throwable){throwable.getStackTrace();} }创建一个存储切点的类单独维护切点表达式 创建一个类用来存储切点表达式里面同样用Pointcut注解来存储切点表达式通知注解中的value属性中写上要引用的切点表达式所在类的全限定符加上.方法名加括号 例 Component public class MyPointcut {Pointcut(execution(* com.ergou.service.impl.*.*(..)))public void pc(){} }这个存储切点表达式的类同样也要放进ioc容器 AfterReturning(value com.ergou.pointcut.MyPointcut.pc(),returning result) public void afterReturning(JoinPoint joinPoint,Object result){System.out.println(result); }环绕通知 环绕通知对应整个 try...catch...finally 结构包括前面四种通知的所有功能。 环绕通知使用步骤 在通知类中写一个环绕通知方法参数列表中写一个ProceedingJoinPoint类型的参数此参数会自动接收目标方法的信息。并在此环绕通知方法上方写上Around注解其value属性指定切点表达式环绕通知需要在通知中定义目标方法的执行。目标方法的执行代码为Object result joinPoint.proceed(args)。其中result是用来接收目标方法的返回值的对象因为result最后还要被环绕通知方法返回args是传入目标方法的参数通过调用joinPoint对象的相关方法来获取。用 try...catch...finally 结构将执行代码围绕起来就可以在相应的位置放通知功能的代码最后return返回接收了目标方法的返回值的result对象 例 /***环绕通知需要在通知中定义目标方法的执行 * paramjoinPoint接收了目标方法的信息 比起之前的JoinPoint类型的对象多了一个执行的功能 * return*/ Around(com.ergou.pointcut.MyPointcut.pc()) public Object transaction(ProceedingJoinPoint joinPoint){Object[] args joinPoint.getArgs();Object result null;try { //前置通知代码 System.out.println(开启事务);result joinPoint.proceed(args); //后置通知代码 System.out.println(提交事务);} catch (Throwable e) { //异常通知代码 System.out.println(事务回滚);throw new RuntimeException(e);} finally { //最终通知代码 System.out.println(必须执行的代码);}return result; }切面优先级设置 切面优先级是指要调用目标方法时如果有多个切面优先级高的切面的通知方法是在外层。 使用Order注解标记在通知类上在其中指定一个数字值越小优先级越高。 Component Aspect //值越小优先级越高 Order(2) public class TxAdvice {Before(com.ergou.pointcut.MyPointcut.pc())public void begin(){}AfterReturning(com.ergou.pointcut.MyPointcut.pc())public void commit(){}AfterThrowing(com.ergou.pointcut.MyPointcut.pc())public void rollback(){} }优先级高的因为在外层所以前置先执行后置后执行 xml方式配置aop 了解即可主要使用注解方式 !-- 配置目标类的bean -- bean idcalculatorPure classcom.atguigu.aop.imp.CalculatorPureImpl/!-- 配置切面类的bean -- bean idlogAspect classcom.atguigu.aop.aspect.LogAspect/!-- 配置AOP -- aop:config!-- 配置切入点表达式 --aop:pointcut idlogPointCut expressionexecution(* *..*.*(..))/!-- aop:aspect标签配置切面 --!-- ref属性关联切面类的bean --aop:aspect reflogAspect!-- aop:before标签配置前置通知 --!-- method属性指定前置通知的方法名 --!-- pointcut-ref属性引用切入点表达式 --aop:before methodprintLogBeforeCore pointcut-reflogPointCut/!-- aop:after-returning标签配置返回通知 --!-- returning属性指定通知方法中用来接收目标方法返回值的参数名 --aop:after-returningmethodprintLogAfterCoreSuccesspointcut-reflogPointCutreturningtargetMethodReturnValue/!-- aop:after-throwing标签配置异常通知 --!-- throwing属性指定通知方法中用来接收目标方法抛出异常的异常对象的参数名 --aop:after-throwingmethodprintLogAfterCoreExceptionpointcut-reflogPointCutthrowingtargetMethodException/!-- aop:after标签配置后置通知 --aop:after methodprintLogCoreFinallyEnd pointcut-reflogPointCut/!-- aop:around标签配置环绕通知 --!--aop:around method…… pointcut-reflogPointCut/--/aop:aspect /aop:config根据类型装配 bean 情景一 bean 对应的类没有实现任何接口根据 bean 本身的类型获取 bean 测试IOC容器中同类型的 bean 只有一个 正常获取到 IOC 容器中的那个 bean 对象 测试IOC 容器中同类型的 bean 有多个 会抛出 NoUniqueBeanDefinitionException 异常表示 IOC 容器中这个类型的 bean 有多个 情景二 bean 对应的类实现了接口这个接口也只有这一个实现类 测试根据接口类型获取 bean测试根据类获取 bean结论上面两种情况其实都能够正常获取到 bean而且是同一个对象 情景三 声明一个接口接口有多个实现类接口所有实现类都放入 IOC 容器 测试根据接口类型获取 bean 会抛出 NoUniqueBeanDefinitionException 异常表示 IOC 容器中这个类型的 bean 有多个 测试根据类获取bean 正常 情景四jdk代理情景 声明一个接口 接口有一个实现类 创建一个切面类对上面接口的实现类应用通知 测试根据接口类型获取bean 正常 测试根据类获取bean 无法获取 原因分析 应用了切面后真正放在IOC容器中的是代理类的对象 目标类并没有被放到IOC容器中所以根据目标类的类型从IOC容器中是找不到的 情景五cglib代理场景 声明一个类创建一个切面类对上面的类应用通知 测试根据类获取 bean能获取到
http://www.dnsts.com.cn/news/12992.html

相关文章:

  • 云南城市建设培训中心网站给酒吧做网站
  • 做一个手机app的步骤seo咨询茂名
  • 网站qq临时会话不需要添加好友高中信息技术网站设计规划
  • 如何网站建设网站旅游网站建设市场分析
  • 网站 服务器 虚拟主机百度搜索引擎的网址
  • 多种昆明网站建设购物网站开发代码
  • 来个网站2021能用的网站搜索引擎
  • 定制网站报价做网站有没有免费空间
  • 云南红舰工贸有限公司的网站建设做的网站文字是乱码
  • 深圳 网站开发wordpress菜单页面跳转
  • 最新电子产品网站模板小程序开发外包费用
  • 购买马来网站域名长春网络公司合作
  • 哈尔滨企业网站制作网站建设及维护服务
  • 网站建设需要多少钱知乎IT男网站建设
  • 番禺论坛网站建设网易企业邮箱邮件怎么撤回
  • 网站psd设计稿郑州今天确诊名单
  • 装饰公司做网站怎么收费seo网站设计就业前景
  • 桓台网站制作网站建设部署与发布答案
  • 网站开发后端是什么网站备案去哪
  • 站长工具服务器查询河南智慧团建网站登录
  • 小学生信息科学做网站厦门网站注册与网页设计公司
  • 织梦网站程序模板h5免费制作平台易企秀
  • 有什么好的建站公司企业网站一般包括哪些内容
  • 静态网站开发工具网站搭建模板
  • 网站开发交付验收文档北理离线《网站开发与应用》
  • 在哪个网站开发国外客户肃州区建设局网站
  • 做网站卖电脑迅速编程做网站
  • 网站搭建价格江苏住建厅电子证书查询
  • 青岛微网站建设wordpress 广告位小工具
  • 外国ps素材网站跨境电商培训哪家最好