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

wordpress重新打开多站点浙江新手网络推广

wordpress重新打开多站点,浙江新手网络推广,发稿社,管理咨询公司招聘难 文章目录 1.AOP介绍1.1 面向切面编程 - Aspect Oriented Programming (AOP)1.2 优点 2.AOP的概念2.1 连接点、切入点、通知、切面#xff1a;2.2 注解2.2.1 通知类型2.2.1.1 通知的优先级排序 2.2.2 其他重要注解2.2.3 示例代码#xff08;四种通知#xff09; 3.Spring … 难 文章目录 1.AOP介绍1.1 面向切面编程 - Aspect Oriented Programming (AOP)1.2 优点 2.AOP的概念2.1 连接点、切入点、通知、切面2.2 注解2.2.1 通知类型2.2.1.1 通知的优先级排序 2.2.2 其他重要注解2.2.3 示例代码四种通知 3.Spring AOP配置方式4.AOP的应用4.1 日志4.2 异常处理4.3 在spring中aop的应用是事务4.3.1 事务的传播行为4.3.2 事务的隔离级别4.3.3 事务的配置方式 4.4 在具体项目中的应用 5.aop底层实现5.1 动态代理5.1.1 JDK动态代理实现和被代理类一样的接口5.1.2 CGLIB动态代理创建目标类的子类5.1.3 两种代理的区别 5.2 后置处理器相关5.2.1 后置处理器5.2.2 增强器封装切面的信息5.2.3 在 getBean 时的创建流程 6.设计模式6.1 代理模式6.2 责任链模式依次调用增强器的通知方法 7.aop失效7.1 aop失效的场景7.1.1 同一个类内部中不同方法间的调用7.1.2 多线程环境下线程直接调用目标对象方法7.1.3 final 修饰的方法不能被重写7.1.4 private方法由于访问权限 7.2 解决方法 1.AOP介绍 1.1 面向切面编程 - Aspect Oriented Programming (AOP) AOP作为OOP面向对象编程的一种功能补充。AOP是Spring框架重要的组件作为IOC的补充。 是一种思想本质是为了解耦。将横切逻辑代码抽取出去通过简单的配置使用动态代理的方式添加到目标方法中做到无侵入、便捷。 Spring 框架通过定义切面, 通过拦截切点实现了不同业务模块的解耦。面向切面编程是一种编程范式主要用于分离那些横切多个业务模块的关注点比如日志记录、事务管理、权限验证等这些功能就属于横切关注点。 关注点是指在软件开发过程中系统中某个特定的业务功能、特性、需求或者设计是开发人员重点关注、考虑、实现的部分。 横切关注点是跨越多个模块、多个层次或者多个业务功能的关注点 1.2 优点 横向解决代码重复的问题 1解耦横切关注点将与业务逻辑不直接相关的功能横切的功能解耦。如日志记录、事务管理、权限验证等从业务代码中分离出来使得业务逻辑更加清晰易于理解和维护。 2代码复用多个业务模块可以共用同一个切面避免了代码的重复编写。 3灵活、可扩展可以方便地添加、删除或修改切面的逻辑而不需要对业务逻辑进行大规模的改动。 2.AOP的概念 我之前的一篇博文写的 2.1 连接点、切入点、通知、切面 1连接点可以成为切入点 2切入点在哪干需要增强的目标方法。用来确定在哪些地方应用切面的逻辑比如可以定义在某个类的所有方法上或者某个包下的特定方法上。 3通知干什么是定义在切面中的一段代码指定了在切面的切点位置上要执行的具体动作逻辑。什么时候做、做什么。通知是在目标方法执行前、后执行的方法。通知用于在目标方法执行的特定时机插入额外的行为从而实现对目标对象方法的增强或扩展。通知是在目标方法执行前、后执行的方法。比如前置通知可以在目标方法执行前做一些事情后置通知在目标方法执行后做一些事情环绕通知则可以在目标方法执行前后都进行相应的操作。 4切面切入点通知。切面是对横切关注点的抽象它把切点和通知组合在一起。 5织入织入把切面连接到其它的应用程序类型或者对象上并创建一个被通知的对象。就是通过动态代理对目标对象方法进行增强的过程。运行时织入。 6目标对象被一个或者多个切面所通知的对象也被称作被通知对象。Spring AOP是通过运行时代理实现的所以这个对象永远是一个被代理的对象。 2.2 注解 2.2.1 通知类型 1Before 前置通知Before Advice 定义在目标方法执行之前执行的通知。 作用常用于进行一些准备工作如参数校验、权限判断、初始化操作等。例如在一个用户登录的方法前使用前置通知可以进行用户名和密码的非空校验若校验不通过则直接返回错误信息不执行后续的登录逻辑。 2After 后置通知After Advice 定义在目标方法执行之后执行的通知无论目标方法是否抛出异常都会执行。 作用可用于进行一些资源清理、日志记录等操作。比如在一个文件上传的方法执行后使用后置通知可以关闭文件流释放相关资源或者记录文件上传的结果信息无论上传是否成功都可以进行相应的记录。 3AfterReturning 正常返回通知After Returning Advice 定义在目标方法正常执行完成并返回结果后执行的通知。 作用可以对目标方法的返回值进行处理或记录。例如在一个查询数据库获取用户信息的方法后使用返回通知可以对查询到的用户信息进行加密处理或者记录查询结果以便进行数据分析。 4After-Throwing 异常通知After Throwing Advice 定义在目标方法执行过程中抛出异常时执行的通知。 作用主要用于处理异常情况如记录异常信息、进行异常的统一处理或回滚事务等。比如在一个数据更新的方法中如果出现数据库连接异常或数据冲突异常异常通知可以捕获并记录这些异常同时可以根据异常类型进行相应的处理如提示用户重新操作或回滚到之前的状态。 5Around 环绕通知Around Advice 定义环绕通知可以在目标方法执行前后都添加自定义逻辑它将目标方法的执行包裹在其中是最强大也最灵活的一种通知类型。环绕通知是最常用的通知类型。 作用可以决定目标方法是否执行、何时执行以及如何执行还可以对目标方法的参数和返回值进行修改。例如在一个远程服务调用的方法上添加环绕通知可以在调用前进行网络连接的检查和参数的预处理在调用后对返回结果进行缓存处理或错误处理等 。 Aspect public class PerformanceAspect {Around(execution(* com.example.service..*.*(..)))public Object aroundMethod(ProceedingJoinPoint pjp) throws Throwable {long startTime System.currentTimeMillis();Object result pjp.proceed();long endTime System.currentTimeMillis();System.out.println(方法执行时间: (endTime - startTime) 毫秒);return result;} }2.2.1.1 通知的优先级排序 优先级异常通知后置通知前置通知后置返回通知。 只要异常通知报错无论前置通知、后置通知、后置返回通知报错都将返回的是异常通知 如果有多个通知想要在同一连接点运行会发生什么 在“进入”连接点的情况下最高优先级的通知会先执行所以给定的两个前置通知中优先级高的那个会先执行。 在“退出”连接点的情况下最高优先级的通知会最后执行。所以给定的两个后置通知中 优先级高的那个会第二个执行。 2.2.2 其他重要注解 Aspect用来定义一个类作为切面。 Pointcut用于定义切点的位置。用于定义切点表达式将切点表达式单独提取出来以便在多个通知中重复使用提高代码的可维护性。 Aspect public class LoggingAspect {Pointcut(execution(* com.example.service..*.*(..)))public void serviceMethods() {}Before(serviceMethods())public void beforeServiceMethod() {System.out.println(服务方法执行前的日志记录);} }2.2.3 示例代码四种通知 Aspect public class Logging {/** Following is the definition for a pointcut to select* all the methods available. So advice will be called* for all the methods.*/Pointcut(execution(* com.tutorialspoint.*.*(..)))private void selectAll(){}Before(selectAll())public void beforeAdvice(){System.out.println(Going to setup student profile.);}After(selectAll())public void afterAdvice(){System.out.println(Student profile has been setup.);}AfterReturning(pointcut selectAll(), returningretVal)public void afterReturningAdvice(Object retVal){System.out.println(Returning: retVal.toString() );}AfterThrowing(pointcut selectAll(), throwing ex)public void AfterThrowingAdvice(IllegalArgumentException ex){System.out.println(There has been an exception: ex.toString()); } }3.Spring AOP配置方式 支持XML模式、基于AspectJ注解的两种配置方式。 未详细介绍 4.AOP的应用 4.1 日志 以我们常见的电商系统为例比如说用户登录、商品下单、订单查询等这些业务模块都可能需要记录操作日志而日志记录这个功能并不属于具体某个业务模块的核心逻辑但却贯穿于多个业务模块之中这时候就适合使用 AOP 来处理。 4.2 异常处理 我的一篇博客 4.3 在spring中aop的应用是事务 别人写的博客 Spring AOP 为事务管理提供了一种非侵入式的实现方式将事务管理这一横切关注点从业务逻辑代码中分离出来。 Spring 通过 AOP 的动态代理机制为被事务管理的方法创建代理对象。当调用这些被代理的方法时Spring 会根据方法上的事务配置自动启动、提交或回滚事务。例如我们常用的Transactional注解就是基于 Spring AOP 实现事务管理的典型体现 。当一个方法被标记上Transactional注解时Spring AOP 会拦截该方法的调用并在方法执行前开启一个事务在方法正常执行完成后提交事务如果方法执行过程中抛出异常则会自动回滚事务确保数据的一致性。 本质是依靠Spring框架提供的Bean生命周期相关回调接口和AOP结合完成的简述如下: 1.通过自动代理创建器依次尝试为每个放入容器中的bean尝试进行代理 2.尝试进行代理的过程对于事务管理来说就是利用事务管理涉及到的增强器advisor,即TransactionAttributeSourceAdvisor 3.判断当前增强器是否能够应用在当前bean上怎么判断呢 — advisor内部的pointCut 4.如果能够应用那么好为当前bean创建代理对象返回并且往代理对象内部添加一个TransactionInterceptor拦截器。 5.此时我们再从容器中获取拿到的就是代理对象了当我们调用代理对象的方法时首先要经过代理对象内部拦截器链的处理处理完后最终才会调用被代理对象的方法。(这里其实就是责任链模式的应用) 4.3.1 事务的传播行为 在 Spring 事务管理中事务的传播行为定义了多个事务方法之间相互调用时事务如何在这些方法间传播。 例如REQUIRED传播行为是最常用的一种如果当前没有事务就新建一个事务如果已经存在一个事务则加入到这个事务中。这确保了在一个业务流程中多个相关的数据库操作可以在同一个事务的控制下保证数据的一致性。 REQUIRES_NEW传播行为它总是会开启一个新的事务而不管当前是否已经存在事务新事务与原有事务相互独立。 4.3.2 事务的隔离级别 READ_UNCOMMITTED允许读取未提交的数据可能导致脏读、READ_COMMITTED只能读取已提交的数据避免脏读但可能出现不可重复读 REPEATABLE_READ在同一个事务中多次读取的数据是一致的可防止不可重复读但可能出现幻读 SERIALIZABLE最高的隔离级别完全串行化执行事务可避免所有并发问题但性能较差 4.3.3 事务的配置方式 基于注解。通过在方法或类上添加Transactional注解可以轻松地将该方法或类纳入事务管理的范畴。注解中可以配置事务的各种属性如传播行为、隔离级别、超时时间等。 此外Spring AOP 还允许我们在配置文件或者基于 Java 的配置类中对事务进行全局配置设置默认的事务属性如默认的传播行为、隔离级别等。 4.4 在具体项目中的应用 在项目中的应用、使用场景 5.aop底层实现 Java中的静态代理和动态代理 5.1 动态代理 什么是动态代理动态代理就是在程序运行期创建目标对象的代理对象并对目标对象中的方法进行功能性增强的一种技术。 Spring的代理方式有两种一种是 JDK动态代理一种是CGLIB代理。Spring默认是JDK动态代理。 以下两种情况使用CGLIB代理 ①EnableAspectJAutoProxy(proxyTargetClass true) 强制要求Spring使用CGLIB代理。 ②被代理的类不是接口的实现类。 5.1.1 JDK动态代理实现和被代理类一样的接口 JDK 动态代理是利用 Java 反射机制在运行时动态创建代理类和代理对象的。它要求被代理的类必须实现一个或多个接口。代理类会实现与被代理类相同的接口并在调用方法时通过反射机制转发到被代理类的相应方法上同时可以在方法调用前后添加额外的逻辑。 使用场景当被代理的类已经实现了接口只需要对接口中定义的方法进行代理增强时。 总结通过反射创建代理对象在方法调用时通过invoke方法反射调用被代理类的方法并且可以添加额外逻辑。 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; // 定义接口 interface IService {//用来调用的方法void doSomething(); } // 实现接口的真实类 class ServiceImpl implements IService {//被代理对象的方法Overridepublic void doSomething() {System.out.println(执行具体业务逻辑);} } // 动态代理处理器 class MyInvocationHandler implements InvocationHandler {private Object target;public MyInvocationHandler(Object target) {this.target target;}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(在方法调用前执行额外逻辑如日志记录或权限验证);// 调用目标对象的方法Object result method.invoke(target, args);System.out.println(在方法调用后执行额外逻辑如结果处理或资源清理);return result;} } //流程 public class JDKDynamicProxyExample {public static void main(String[] args) {// 创建真实对象IService realService new ServiceImpl();// 创建动态代理对象IService proxyService (IService) Proxy.newProxyInstance(realService.getClass().getClassLoader(),realService.getClass().getInterfaces(),new MyInvocationHandler(realService));// 调用代理对象的方法proxyService.doSomething();} }5.1.2 CGLIB动态代理创建目标类的子类 我写的很不具体 Cglib是一个强大的、高性能的代码生成包它广泛被许多AOP框架使用为他们提供方法的拦截。 它不需要类实现接口可以直接为普通的类创建代理。 它通过在运行时动态生成字节码来创建代理类与基于接口的 JDK 动态代理不同。CGLIB 会在运行时生成一个被代理类的子类然后在这个子类中重写被代理类的方法通过在重写的方法中添加一些额外的逻辑来实现代理的功能。 代码中的流程1.创建一个Enhancer对象用来创建代理对象。2.在这个对象上设置要被代理的类。3.设置拦截器这个拦截器是我们写的拦截器里面是具体的功能在方法执行前后的操作调用方法。4.用Enhancer创建代理对象通过代理对象调用目标方法。 举个例子 import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; // 这是我们要代理的目标类 class UserService {public void addUser(String username) {System.out.println(添加用户: username);} } // 这是实现了MethodInterceptor接口的拦截器类用来添加代理逻辑 class MyMethodInterceptor implements MethodInterceptor {Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {// 在调用目标方法之前添加的逻辑这里是打印日志System.out.println(开始执行方法: method.getName());// 调用目标方法通过methodProxy的invokeSuper方法来调用注意这里的o是代理对象Object result methodProxy.invokeSuper(o, objects);// 在调用目标方法之后添加的逻辑这里也是打印日志System.out.println(方法执行完毕: method.getName());return result;} } //调用的例子 public class CglibProxyExample {public static void main(String[] args) {// 1.创建Enhancer对象它是CGLIB的核心类用来创建代理对象Enhancer enhancer new Enhancer();// 2.设置要代理的类也就是UserService类enhancer.setSuperclass(UserService.class);// 3.设置拦截器也就是我们刚才写的MyMethodInterceptor类enhancer.setCallback(new MyMethodInterceptor());// 4.创建代理对象UserService userServiceProxy (UserService) enhancer.create();// 通过代理对象调用目标方法userServiceProxy.addUser(张三);} }5.1.3 两种代理的区别 JDK 动态代理要求目标类必须实现接口。当创建一个代理对象时JDK 会在运行时动态生成一个代理类这个代理类实现了与目标类相同的接口。然后通过反射机制在代理类中调用目标类的同名方法并在调用前后添加切面逻辑从而实现对目标方法的增强。 CGLIB 通过继承目标类来创建代理类在代理类中重写目标类的方法从而实现对目标方法的增强。 5.2 后置处理器相关 5.2.1 后置处理器 在 Spring AOP 的实现中后置处理器BeanPostProcessor是一个关键的组件。它允许在 Spring 容器创建和初始化 Bean 的过程中对 Bean 进行额外的处理。 具体到 AOP这个后置处理器承担了重要职责它负责识别哪些 Bean 需要进行 AOP 代理创建以及如何创建和配置这些代理。 5.2.2 增强器封装切面的信息 抽取切面方法为增强器。 增强器是对切面中各种通知方法以及切点信息等的一种封装。它包含了要在何时切点、以何种方式通知类型对目标对象的哪些方法进行增强的所有信息。 抽取过程Spring 会在启动时扫描所有配置的切面类解析其中的切面方法和切点表达式等。例如对于一个包含了前置通知和后置通知的切面类Spring 会将这些通知方法以及它们所对应的切点信息提取出来封装成一个个增强器。 5.2.3 在 getBean 时的创建流程 比如在 Spring 容器启动后当应用程序需要获取某个 Bean 实例时Bean 创建时会调用 getBean 方法。此时AOP 的后置处理器就会判断要创建的这个Bean是否为AOP目标类、是否有切面需要对它增强。 如果是就会创建代理类并将增强器的信息保存到代理类内部。这样代理类就知道在哪些方法调用时需要应用哪些增强逻辑。 6.设计模式 6.1 代理模式 代理模式 代理模式(Proxy pattern): 为另一个对象提供一个替身或占位符以控制对这个对象的访问。 举个简单的例子我(client)如果要买(doOperation)房可以找中介(proxy)买房中介直接和卖方(target)买房。中介和卖方都实现买卖(doOperation)的操作。中介就是代理(proxy)。 6.2 责任链模式依次调用增强器的通知方法 责任链模式的原理责任链模式是一种行为设计模式它将请求的发送者和接收者解耦让多个对象都有机会处理请求形成一个链条直到请求被处理为止。 在 AOP 中的应用当代理类的某个方法被调用时它会根据保存的增强器信息通常会使用一些数据结构来存储这些信息例如可能会使用一个列表来保存所有适用于该代理类的增强器每个增强器在列表中都有其特定的顺序和位置以确定其执行的先后顺序。以责任链的方式依次调用各个增强器所对应的通知方法。例如如果有一个前置通知增强器和一个后置通知增强器那么在目标方法被调用前会先执行前置通知增强器中的前置通知方法然后调用目标方法最后再执行后置通知增强器中的后置通知方法。 7.aop失效 7.1 aop失效的场景 7.1.1 同一个类内部中不同方法间的调用 当在一个类的内部方法中调用另一个被 AOP 增强的本类方法时AOP 切面可能不会生效。 这是因为 Spring AOP 默认是基于代理的。而类内部方法调用是直接调用目标方法不会通过代理对象所以无法触发 AOP 的增强逻辑。 Component public class MyService {public void methodA() {// 直接调用本类的methodBAOP切面不会生效methodB(); }Transactional // 假设这是一个事务切面正常情况下应该开启事务public void methodB() {// 业务逻辑代码} }7.1.2 多线程环境下线程直接调用目标对象方法 在多线程场景中如果线程直接调用目标对象的方法而不是通过代理对象调用AOP 切面也会失效。因为每个线程都有自己的执行路径若不通过代理就无法触发 AOP 的拦截和增强机制。 通过代理对象调用方法才能aop如果没有代理对象直接调用方法aop失效。 public class MyService {public void doSomething() {System.out.println(执行目标方法);} } public class Main {public static void main(String[] args) {MyService target new MyService();// 直接调用目标对象的方法未通过代理对象AOP不会生效//创建一个新的线程对象它定义了新线程要执行的任务内容。在这里它表示新线程启动后要执行的操作就是调用target对象前面创建的MyService实例的doSomething方法。new Thread(() - target.doSomething()).start(); // 通过代理对象调用AOP会生效MyService proxy (MyService) ProxyFactory.getProxy(target); new Thread(() - proxy.doSomething()).start(); }//通过一个名为ProxyFactory的工厂类的getProxy方法来为前面创建的目标对象target创建一个代理对象。然后将创建好的代理对象强制转换为MyService类型并赋值给变量proxy。//new Thread后定义了新线程要执行的任务内容。这次是告诉新线程启动后要执行的操作是调用proxy对象的doSomething方法。 }AOP 的切面逻辑是添加在代理对象上的只有通过代理对象调用方法才能触发切面的增强操作。 7.1.3 final 修饰的方法不能被重写 如果一个类中的方法被声明为 final那么 Spring AOP 将无法对其进行代理和增强因为 final 方法不能被重写。而 AOP 的实现原理通常是基于动态代理生成子类或实现接口来实现增强的这与 final 的特性相冲突。 JDK 代理是基于接口的它主要关注的是接口中定义的方法而接口中的方法默认是public abstract的不存在final修饰的情况。所以从这个角度来说JDK 代理不会直接受到目标类中final方法的影响因为它根本不涉及对目标类方法的重写而是在实现接口的代理类中去调用目标类的方法。 但是如果在接口的实现类中有一些方法是final的并且这些方法在接口中也有定义那么实际上在代理类调用这些final方法时也无法对其进行增强。 CGLIB 通过继承目标类来创建代理类。当使用 CGLIB 创建代理对象时它会在运行时动态生成一个目标类的子类作为代理类。这个代理类会重写目标类中的所有非final的方法。 Component public class MyFinalService {// 该方法被声明为finalAOP切面无法生效public final void finalMethod() {// 业务逻辑代码} }7.1.4 private方法由于访问权限 private 表示私有的访问权限是最严格的访问控制级别。被 private 修饰的成员变量和方法只能在当前类的内部被访问其他类包括子类都无法直接访问。 在基于代理的 AOP 实现中无法被外部的代理类访问和增强所以 AOP 对其无效。 Component public class MyPrivateService {// 该方法为privateAOP切面无法生效private void privateMethod() {// 业务逻辑代码 }7.2 解决方法 参考aop失效的原因对应解决 未写知识切面的实现过程、AOP代理的创建
http://www.w-s-a.com/news/285082/

相关文章:

  • 怎么取网页视频网站元素计算机专业论文网站开发
  • 上海网站建设备案号怎么恢复wordpress打开页面空白
  • 30个做设计的网站企业设计网站
  • 招生网站开发的背景创意 wordpress
  • 网站备案资料查询小型企业管理系统软件
  • 温州网站建设维护怎么做好网站开发、设计
  • 佛山 做网站公司有哪些网站排名忽然不见了
  • 广告网站建设最专业东莞大朗网站设计
  • 网站做流量的论坛贴吧分销商城系统源码
  • 新手建立网站的步骤网站建设费怎么入分录
  • 哪里建网站性价比高做网站赚取广告费
  • 邢台集团网站建设价格微信怎么做捐钱的网站
  • 做网站费用需要分摊吗装修公司一般多少钱一平方
  • 公司主页的网站格式wordpress自动推送给百度
  • 网站建设辶金手指排名十二wordpress 当数据库
  • 无锡手机网站建设服务苏州展厅设计企业
  • 无锡网站制作需要多少钱北京二次感染最新消息
  • 网站开发视频播放无画面杭州房产信息网官网
  • 网站开发 改进如何创建公众号平台
  • wordpress网站响应很慢只有asp网站代码可以重新编译吗
  • 哪个网站教做饭做的好wordpress热点文章
  • 可以做推广东西的网站重庆网站建设 重庆网站制作
  • 珠海网站建设培训学校wordpress去版权 合法
  • 建设食品商购网站学校网站设计实验报告
  • 建个网站多少钱沭阳奥体小区做网站的
  • 广州视频网站建站公司php网页设计作业代码
  • 成都公司网站设计如何制作网址最简单的方法
  • 温州 做网站福建住房城乡建设部网站
  • 网站自动化采集成都网站设计费用
  • 广东专业网站定制建设淘宝网站的人员组织结构