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

咸阳专业网站建设非遗网页设计作品欣赏

咸阳专业网站建设,非遗网页设计作品欣赏,搭建wordpress环境搭建,烟台高端网站建设动态代理 代理模式的解释#xff1a;为其他对象提供一种代理以控制对这个对象的访问#xff0c;增强一个类中的某个方法#xff0c;对程序进行扩展。 比如#xff0c;现在存在一个UserService类#xff1a; public class UserService {public void test() {System.out…动态代理 代理模式的解释为其他对象提供一种代理以控制对这个对象的访问增强一个类中的某个方法对程序进行扩展。 比如现在存在一个UserService类 public class UserService {public void test() {System.out.println(test...);}}此时我们new一个UserService对象然后执行test()方法结果是显而易见的。 ​ 如果我们现在想在不修改UserService类的源码前提下给test()增加额外逻辑那么就可以使用动态代理机制来创建UserService对象了比如 UserService target new UserService();// 通过cglib技术 Enhancer enhancer new Enhancer(); enhancer.setSuperclass(UserService.class);// 定义额外逻辑也就是代理逻辑 enhancer.setCallbacks(new Callback[]{new MethodInterceptor() {Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println(before...);Object result methodProxy.invoke(target, objects);System.out.println(after...);return result;} }});// 动态代理所创建出来的UserService对象 UserService userService (UserService) enhancer.create();// 执行这个userService的test方法时就会额外会执行一些其他逻辑 userService.test();得到的都是UserService对象但是执行test()方法时的效果却不一样了这就是代理所带来的效果。 上面是通过cglib来实现的代理对象的创建是基于父子类的被代理类UserService是父类代理类是子类代理对象就是代理类的实例对象代理类是由cglib创建的对于程序员来说不用关心。 ​ 除开cglib技术jdk本身也提供了一种创建代理对象的动态代理机制但是它只能代理接口也就是UserService得先有一个接口才能利用jdk动态代理机制来生成一个代理对象比如 public interface UserInterface {public void test(); }public class UserService implements UserInterface {public void test() {System.out.println(test...);}}利用JDK动态代理来生成一个代理对象 UserService target new UserService();// UserInterface接口的代理对象 Object proxy Proxy.newProxyInstance(UserService.class.getClassLoader(), new Class[]{UserInterface.class}, new InvocationHandler() {Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(before...);Object result method.invoke(target, args);System.out.println(after...);return result;} });UserInterface userService (UserInterface) proxy; userService.test();如果你把new Class[]{UserInterface.class}替换成new Class[]{UserService.class}允许代码会直接报错 Exception in thread main java.lang.IllegalArgumentException: com.zhouyu.service.UserService is not an interface表示一定要是个接口。 ​ 由于这个限制所以产生的代理对象的类型是UserInterface而不是UserService这是需要注意的。 ProxyFactory 上面我们介绍了两种动态代理技术那么在Spring中进行了封装封装出来的类叫做ProxyFactory表示是创建代理对象的一个工厂使用起来会比上面的更加方便比如 UserService target new UserService();ProxyFactory proxyFactory new ProxyFactory(); proxyFactory.setTarget(target); proxyFactory.addAdvice(new MethodInterceptor() {Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println(before...);Object result invocation.proceed();System.out.println(after...);return result;} });UserInterface userService (UserInterface) proxyFactory.getProxy(); userService.test();通过ProxyFactory我们可以不再关系到底是用cglib还是jdk动态代理了ProxyFactory会帮我们去判断如果UserService实现了接口那么ProxyFactory底层就会用jdk动态代理如果没有实现接口就会用cglib技术上面的代码就是由于UserService实现了UserInterface接口所以最后产生的代理对象是UserInterface类型。 Advice的分类 Before Advice方法之前执行After returning advice方法return后执行After throwing advice方法抛异常后执行After (finally) advice方法执行完finally之后执行这是最后的比return更后Around advice这是功能最强大的Advice可以自定义执行顺序 Advisor的理解 跟Advice类似的还有一个Advisor的概念一个Advisor是有一个Pointcut和一个Advice组成的通过Pointcut可以指定要需要被代理的逻辑比如一个UserService类中有两个方法按上面的例子这两个方法都会被代理被增强那么我们现在可以通过Advisor来控制到具体代理哪一个方法比如 UserService target new UserService();ProxyFactory proxyFactory new ProxyFactory();proxyFactory.setTarget(target);proxyFactory.addAdvisor(new PointcutAdvisor() {Overridepublic Pointcut getPointcut() {return new StaticMethodMatcherPointcut() {Overridepublic boolean matches(Method method, Class? targetClass) {return method.getName().equals(testAbc);}};}Overridepublic Advice getAdvice() {return new MethodInterceptor() {Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println(before...);Object result invocation.proceed();System.out.println(after...);return result;}};}Overridepublic boolean isPerInstance() {return false;}});UserInterface userService (UserInterface) proxyFactory.getProxy();userService.test();上面代码表示产生的代理对象只有在执行testAbc这个方法时才会被增强会执行额外的逻辑而在执行其他方法时是不会增强的。 ​ 创建代理对象的方式 上面介绍了Spring中所提供了ProxyFactory、Advisor、Advice、PointCut等技术来实现代理对象的创建但是我们在使用Spring时我们并不会直接这么去使用ProxyFactory比如说我们希望ProxyFactory所产生的代理对象能直接就是Bean能直接从Spring容器中得到UserSerivce的代理对象而这些Spring都是支持的只不过作为开发者的我们肯定得告诉Spring那些类需要被代理代理逻辑是什么。 ProxyFactoryBean Bean public ProxyFactoryBean userServiceProxy(){UserService userService new UserService();ProxyFactoryBean proxyFactoryBean new ProxyFactoryBean();proxyFactoryBean.setTarget(userService);proxyFactoryBean.addAdvice(new MethodInterceptor() {Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println(before...);Object result invocation.proceed();System.out.println(after...);return result;}});return proxyFactoryBean; }通过这种方法来定义一个UserService的Bean并且是经过了AOP的。但是这种方式只能针对某一个Bean。它是一个FactoryBean所以利用的就是FactoryBean技术间接的将UserService的代理对象作为了Bean。 ​ ProxyFactoryBean还有额外的功能比如可以把某个Advise或Advisor定义成为Bean然后在ProxyFactoryBean中进行设置 Bean public MethodInterceptor wjxuAroundAdvise(){return new MethodInterceptor() {Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println(before...);Object result invocation.proceed();System.out.println(after...);return result;}}; }Bean public ProxyFactoryBean userService(){UserService userService new UserService();ProxyFactoryBean proxyFactoryBean new ProxyFactoryBean();proxyFactoryBean.setTarget(userService);proxyFactoryBean.setInterceptorNames(wjxuAroundAdvise);return proxyFactoryBean; }BeanNameAutoProxyCreator ProxyFactoryBean得自己指定被代理的对象那么我们可以通过BeanNameAutoProxyCreator来通过指定某个bean的名字来对该bean进行代理 Bean public BeanNameAutoProxyCreator beanNameAutoProxyCreator() {BeanNameAutoProxyCreator beanNameAutoProxyCreator new BeanNameAutoProxyCreator();beanNameAutoProxyCreator.setBeanNames(userSe*);beanNameAutoProxyCreator.setInterceptorNames(wjxuAroundAdvise);beanNameAutoProxyCreator.setProxyTargetClass(true);return beanNameAutoProxyCreator; }通过BeanNameAutoProxyCreator可以对批量的Bean进行AOP并且指定了代理逻辑指定了一个InterceptorName也就是一个Advise前提条件是这个Advise也得是一个Bean这样Spring才能找到的但是BeanNameAutoProxyCreator的缺点很明显它只能根据beanName来指定想要代理的Bean。 ​ DefaultAdvisorAutoProxyCreator Bean public DefaultPointcutAdvisor defaultPointcutAdvisor(){NameMatchMethodPointcut pointcut new NameMatchMethodPointcut();pointcut.addMethodName(test);DefaultPointcutAdvisor defaultPointcutAdvisor new DefaultPointcutAdvisor();defaultPointcutAdvisor.setPointcut(pointcut);defaultPointcutAdvisor.setAdvice(new WjxuAfterReturningAdvise());return defaultPointcutAdvisor; }Bean public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator new DefaultAdvisorAutoProxyCreator();return defaultAdvisorAutoProxyCreator; }通过DefaultAdvisorAutoProxyCreator会直接去找所有Advisor类型的Bean根据Advisor中的PointCut和Advice信息确定要代理的Bean以及代理逻辑。 但是我们发现通过这种方式我们得依靠某一个类来实现定义我们的Advisor或者Advise或者Pointcut那么这个步骤能不能更加简化一点呢 ​ 对的通过注解 比如我们能不能只定义一个类然后通过在类中的方法上通过某些注解来定义PointCut以及Advice可以的比如 Aspect Component public class WjxuAspect {Before(execution(public void com.wjxu.service.UserService.test()))public void zhouyuBefore(JoinPoint joinPoint) {System.out.println(Before);}}通过上面这个类我们就直接定义好了所要代理的方法(通过一个表达式)以及代理逻辑被Before修饰的方法简单明了这样对于Spring来说它要做的就是来解析这些注解了解析之后得到对应的Pointcut对象、Advice对象生成Advisor对象扔进ProxyFactory中进而产生对应的代理对象具体怎么解析这些注解就是**EnableAspectJAutoProxy注解**所要做的事情了后面详细分析。 对Spring AOP的理解 OOP表示面向对象编程是一种编程思想AOP表示面向切面编程也是一种编程思想而我们上面所描述的就是Spring为了让程序员更加方便的做到面向切面编程所提供的技术支持换句话说就是Spring提供了一套机制可以让我们更加容易的来进行AOP所以这套机制我们也可以称之为Spring AOP。 ​ 但是值得注意的是上面所提供的注解的方式来定义Pointcut和AdviceSpring并不是首创首创是AspectJSpring是直接把AspectJ中所定义的那些注解直接拿过来用自己没有再重复定义了不过也仅仅只是把注解的定义赋值过来了每个注解具体底层是怎么解析的还是Spring自己做的所以我们在用Spring时如果你想用Before、Around等注解需要单独引入aspecj相关jar包。 值得注意的是AspectJ是在编译时对字节码进行了修改是直接在UserService类对应的字节码中进行增强的也就是可以理解为是在编译时就会去解析Before这些注解然后得到代理逻辑加入到被代理的类中的字节码中去的所以如果想用AspectJ技术来生成代理对象 是需要用单独的AspectJ编译器的。我们在项目中很少这么用我们仅仅只是用了Before这些注解而我们在启动Spring的过程中Spring会去解析这些注解然后利用动态代理机制生成代理对象的。 ​ IDEA中使用Aspectjhttps://blog.csdn.net/gavin_john/article/details/80156963 AOP中的概念 Aspect表示切面比如被Aspect注解的类就是切面可以在切面中去定义Pointcut、Advice等等Join point表示连接点表示一个程序在执行过程中的一个点比如一个方法的执行比如一个异常的处理在Spring AOP中一个连接点通常表示一个方法的执行。Advice表示通知表示在一个特定连接点上所采取的动作。Advice分为不同的类型后面详细讨论在很多AOP框架中包括Spring会用Interceptor拦截器来实现Advice并且在连接点周围维护一个Interceptor链Pointcut表示切点用来匹配一个或多个连接点Advice与切点表达式是关联在一起的Advice将会执行在和切点表达式所匹配的连接点上Introduction可以使用DeclareParents来给所匹配的类添加一个接口并指定一个默认实现Target object目标对象被代理对象AOP proxy表示代理工厂用来创建代理对象的在Spring Framework中要么是JDK动态代理要么是CGLIB代理Weaving表示织入表示创建代理对象的动作这个动作可以发生在编译时期比如Aspejctj或者运行时比如Spring AOP Advice在Spring AOP中对应API 上面说到的Aspject中的注解其中有五个是用来定义Advice的表示代理逻辑以及执行时机 BeforeAfterReturningAfterThrowingAfterAround 我们前面也提到过Spring自己也提供了类似的执行实际的实现类 接口MethodBeforeAdvice继承了接口BeforeAdvice接口AfterReturningAdvice接口ThrowsAdvice接口AfterAdvice接口MethodInterceptor Spring会把五个注解解析为对应的Advice类 BeforeAspectJMethodBeforeAdvice实际上就是一个MethodBeforeAdviceAfterReturningAspectJAfterReturningAdvice实际上就是一个AfterReturningAdviceAfterThrowingAspectJAfterThrowingAdvice实际上就是一个MethodInterceptorAfterAspectJAfterAdvice实际上就是一个MethodInterceptorAroundAspectJAroundAdvice实际上就是一个MethodInterceptor TargetSource的使用 在我们日常的AOP中被代理对象就是Bean对象是由BeanFactory给我们创建出来的但是Spring AOP中提供了TargetSource机制可以让我们用来自定义逻辑来创建被代理对象。 ​ 比如之前所提到的Lazy注解当加在属性上时会产生一个代理对象赋值给这个属性产生代理对象的代码为 protected Object buildLazyResolutionProxy(final DependencyDescriptor descriptor, final Nullable String beanName) {BeanFactory beanFactory getBeanFactory();Assert.state(beanFactory instanceof DefaultListableBeanFactory,BeanFactory needs to be a DefaultListableBeanFactory);final DefaultListableBeanFactory dlbf (DefaultListableBeanFactory) beanFactory;TargetSource ts new TargetSource() {Overridepublic Class? getTargetClass() {return descriptor.getDependencyType();}Overridepublic boolean isStatic() {return false;}Overridepublic Object getTarget() {SetString autowiredBeanNames (beanName ! null ? new LinkedHashSet(1) : null);Object target dlbf.doResolveDependency(descriptor, beanName, autowiredBeanNames, null);if (target null) {Class? type getTargetClass();if (Map.class type) {return Collections.emptyMap();}else if (List.class type) {return Collections.emptyList();}else if (Set.class type || Collection.class type) {return Collections.emptySet();}throw new NoSuchBeanDefinitionException(descriptor.getResolvableType(),Optional dependency not present for lazy injection point);}if (autowiredBeanNames ! null) {for (String autowiredBeanName : autowiredBeanNames) {if (dlbf.containsBean(autowiredBeanName)) {dlbf.registerDependentBean(autowiredBeanName, beanName);}}}return target;}Overridepublic void releaseTarget(Object target) {}};ProxyFactory pf new ProxyFactory();pf.setTargetSource(ts);Class? dependencyType descriptor.getDependencyType();if (dependencyType.isInterface()) {pf.addInterface(dependencyType);}return pf.getProxy(dlbf.getBeanClassLoader());}这段代码就利用了ProxyFactory来生成代理对象以及使用了TargetSource以达到代理对象在执行某个方法时调用TargetSource的getTarget()方法实时得到一个被代理对象。 Introduction https://www.cnblogs.com/powerwu/articles/5170861.html ​ LoadTimeWeaver https://www.cnblogs.com/davidwang456/p/5633609.html
http://wiki.neutronadmin.com/news/353262/

相关文章:

  • 用dw怎么做网站首页百度一下官方网
  • 莱城高新区建设局网站360网站备案查询
  • html判断域名 然后再跳转到网站湖南畅想网站建设
  • 做暧视频网站大全wordpress主题汉化包怎么用
  • 管理手机网站wordpress导出模板
  • 上海工商核名查询系统官网关键词排名优化到首页
  • 自动优化网站软件没有了简单网页制作模板
  • 上海网站开发企业百度推广入口页面
  • 外国网站域名php网站开发外文翻译
  • 社交网站开发项目计划报告做网站的基本功能
  • 创业过程中网站建设贵州省建设网站
  • 蔚县住房和城乡规划建设局网站淘宝网站是用什么开发的
  • 网站关键字如何设置长沙公司网页设计
  • 做网站有什么必要国家企业官方网站查询系统
  • 建设网站番禺天津网站制作工具
  • 腾讯云网站搭建软文形式推广产品
  • 网站建设做得好的公司常见网站模式
  • 温州建设银行网站东莞网络营销型网站
  • 网站建设与优化推广的话术网站加背景音乐
  • 徐州地区网站建设网站搭建app
  • 国外网站推广方法贴吧推广
  • saas系统排名windows10优化工具
  • 深圳网站建设推进做化工的 有那些网站
  • 一个公司可以做两个网站吗wordpress 自动摘要
  • 深圳做网站网络营销公司哪家好无线网站应建设在什么地方
  • 陕西省交通集团建设网站wordpress 评论框主题
  • 设计师网站prinest建筑业企业
  • 做商城网站哪家好晋中市住房与城乡建设厅网站
  • 长春站建筑网站上传文件
  • 网站式小程序flash做网站通栏