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

网站新建网页物流网络货运平台

网站新建网页,物流网络货运平台,邯郸做网站流程,免费ppt模板下载医学类proxyFactory代理对象创建方式和代理对象调用方法过程#xff1a; springaop创建动态代理对象和代理对象调用方法过程#xff1a; 一、TargetSource的使用 Lazy注解#xff0c;当加在属性上时#xff0c;会产生一个代理对象赋值给这个属性#xff0c;产生代理对象的代码为…proxyFactory代理对象创建方式和代理对象调用方法过程 springaop创建动态代理对象和代理对象调用方法过程 一、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 需要使用EnableAspectJAutoProxy注解 Component public class UserService {public void test() {System.out.println(test);}}public interface UserInterface {void test(); }public class UserInterfaceImpl implements UserInterface {Overridepublic void test() {System.out.println(UserInterfaceImpl);} }Aspect Component public class TestAspect {DeclareParents(valuecom.spring.service.UserService, defaultImplcom.spring.service.UserInterfaceImpl.class)public UserInterface userInterface; }AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(AppConfig.class);UserInterface userService (UserInterface) applicationContext.getBean(userService);userService.test(); spring创建bean初始化后会扫描DeclareParents注解 三、ProxyFactory选择cglib或jdk动态代理原理 ProxyFactory在生成代理对象之前需要决定到底是使用JDK动态代理还是CGLIB技术 // config就是ProxyFactory对象// optimize为true,或proxyTargetClass为true,或用户没有给ProxyFactory对象添加interface if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {Class? targetClass config.getTargetClass();if (targetClass null) {throw new AopConfigException(TargetSource cannot determine target class: Either an interface or a target is required for proxy creation.);}// targetClass是接口直接使用Jdk动态代理if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {return new JdkDynamicAopProxy(config);}// 使用Cglibreturn new ObjenesisCglibAopProxy(config); } else {// 使用Jdk动态代理return new JdkDynamicAopProxy(config); } 四、代理对象创建过程 1、JdkDynamicAopProxy 在构造JdkDynamicAopProxy对象时会先拿到被代理对象自己所实现的接口并且额外的增加SpringProxy、Advised、DecoratingProxy三个接口组合成一个Class[]并赋值给proxiedInterfaces属性并且检查这些接口中是否定义了equals()、hashcode()方法执行Proxy.newProxyInstance(classLoader, this.proxiedInterfaces, this)得到代理对象JdkDynamicAopProxy作为InvocationHandler代理对象在执行某个方法时会进入到JdkDynamicAopProxy的**invoke()**方法中 2、ObjenesisCglibAopProxy 创建Enhancer对象设置Enhancer的superClass为通过ProxyFactory.setTarget()所设置的对象的类设置Enhancer的interfaces为通过ProxyFactory.addInterface()所添加的接口以及SpringProxy、Advised、DecoratingProxy接口设置Enhancer的Callbacks为DynamicAdvisedInterceptor最后创建一个代理对象代理对象在执行某个方法时会进入到DynamicAdvisedInterceptor的intercept()方法中 五、代理对象执行过程 在使用ProxyFactory创建代理对象之前需要往ProxyFactory先添加Advisor代理对象在执行某个方法时会把ProxyFactory中的Advisor拿出来和当前正在执行的方法进行匹配筛选把和方法所匹配的Advisor适配成MethodInterceptor把和当前方法匹配的MethodInterceptor链以及被代理对象、代理对象、代理类、当前Method对象、方法参数封装为MethodInvocation对象调用MethodInvocation的proceed()方法开始执行各个MethodInterceptor以及被代理对象的对应方法按顺序调用每个MethodInterceptor的invoke()方法并且会把MethodInvocation对象传入invoke()方法直到执行完最后一个MethodInterceptor了就会调用invokeJoinpoint()方法从而执行被代理对象的当前方法 各注解对应的MethodInterceptor Before对应的是AspectJMethodBeforeAdvice在进行动态代理时会把AspectJMethodBeforeAdvice转成MethodBeforeAdviceInterceptor 先执行advice对应的方法再执行MethodInvocation的proceed()会执行下一个Interceptor如果没有下一个Interceptor了会执行target对应的方法After对应的是AspectJAfterAdvice直接实现了MethodInterceptor 先执行MethodInvocation的proceed()会执行下一个Interceptor如果没有下一个Interceptor了会执行target对应的方法再执行advice对应的方法Around对应的是AspectJAroundAdvice直接实现了MethodInterceptor 直接执行advice对应的方法由Around自己决定要不要继续往后面调用AfterThrowing对应的是AspectJAfterThrowingAdvice直接实现了MethodInterceptor 先执行MethodInvocation的proceed()会执行下一个Interceptor如果没有下一个Interceptor了会执行target对应的方法如果上面抛了Throwable那么则会执行advice对应的方法AfterReturning对应的是AspectJAfterReturningAdvice在进行动态代理时会把AspectJAfterReturningAdvice转成AfterReturningAdviceInterceptor 先执行MethodInvocation的proceed()会执行下一个Interceptor如果没有下一个Interceptor了会执行target对应的方法执行上面的方法后得到最终的方法的返回值再执行Advice对应的方法 六、AbstractAdvisorAutoProxyCreator DefaultAdvisorAutoProxyCreator的父类是AbstractAdvisorAutoProxyCreator。 AbstractAdvisorAutoProxyCreator非常强大以及重要只要Spring容器中存在这个类型的Bean就相当于开启了AOPAbstractAdvisorAutoProxyCreator实际上就是一个BeanPostProcessor所以在创建某个Bean时就会进入到它对应的生命周期方法中比如在某个Bean初始化之后会调用wrapIfNecessary()方法进行AOP底层逻辑是AbstractAdvisorAutoProxyCreator会找到所有的Advisor然后判断当前这个Bean是否存在某个Advisor与之匹配根据Pointcut如果匹配就表示当前这个Bean有对应的切面逻辑需要进行AOP需要产生一个代理对象。 七、EnableAspectJAutoProxy 这个注解主要就是往Spring容器中添加了一个AnnotationAwareAspectJAutoProxyCreator类型的Bean。 AspectJAwareAdvisorAutoProxyCreator继承了AbstractAdvisorAutoProxyCreator重写了findCandidateAdvisors()方法AbstractAdvisorAutoProxyCreator只能找到所有Advisor类型的Bean对象但是AspectJAwareAdvisorAutoProxyCreator除开可以找到所有Advisor类型的Bean对象还能把Aspect注解所标注的Bean中的Before等注解及方法进行解析并生成对应的Advisor对象。 ​ 所以我们可以理解EnableAspectJAutoProxy其实就是像Spring容器中添加了一个AbstractAdvisorAutoProxyCreator类型的Bean从而开启了AOP并且还会解析Before等注解生成Advisor。
http://wiki.neutronadmin.com/news/175983/

相关文章:

  • 邢台县建设局网站域名注册局
  • 重庆电子商务网站建设太平洋建设21局网站
  • 通辽网站建设培训做英文小说网站
  • 可以免费做推广的网站企业咨询管理有限公司
  • 服装网站建设视频seo搜索引擎优化怎么优化
  • 网站做的比较好的贸易公司网站广告模板代码
  • 互动网站建设的主页仿淘宝网站源码 asp
  • 网站开发配置状态统计样本网站建设 力洋网络
  • 哪个网站做投票链接模板好看曹县建设厅网站
  • 接做网站需要问什么条件做网站page
  • 西安网店培训班情感网站seo
  • 百度网站优化培训wordpress修改二级域名
  • 石林彝族网站建设个人装修队
  • 网站二级域名设置一个网站建设流程图
  • seo怎样新建网站四川网站建设一站式服务商
  • 在网站上做宣传属于广告费用吗制作网站开发
  • 人才招聘网站开发 源代码中国建筑业发展现状
  • 杭州网站建设就找蓝韵网络河南最新新闻事件今天
  • 网站加载很慢怎么办网站建设与网页设计课程设计
  • 昆明网上商城网站建设网页设计多少钱一个页面
  • 网站建设需要学些什么黑龙江建设厅网站首页
  • 网站建设的详细步骤教学网站设计与开发
  • 深圳做网站推广沛县徐州网站开发
  • 在线电子书网站怎么做设计案例
  • 微信做模板下载网站有哪些内容百度用户服务中心在线申诉
  • dw网站建设框架大小设定百度指数网址是多少
  • 西安市做网站淘宝客网站必须备案吗
  • 景山网站建设公司建设银行网站机构
  • 网站动画效果怎么做深圳网站建设学校
  • 百度怎么做开锁网站腾讯会议价格