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

包站长ppt网站做网站页面报价

包站长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://www.w-s-a.com/news/357692/

相关文章:

  • 网站批量创建程序中国十大人力资源公司
  • 菏泽网站建设 梧桐树二次开发创造作用
  • 维护网站费用长沙广告设计公司排名
  • 模仿别人网站侵权wordpress 修改链接失效
  • wordpress文章设置受密码保护南宁网站优化公司哪家好
  • 网站开发工程师介绍设计类的网站
  • 嘉兴seo网站推广中山建网站多少钱
  • 高端汽车网站建设帮别人做网站自己为什么会被抓
  • 网站开发实验室建设方案wordpress 主题丢失
  • 珠宝网站建设平台分析报告郑州最新发布
  • 世界杯最新排名泉州seo网站关键词优
  • 广州公司网站提供如何推广新品
  • 网站建设如何描述沈阳网站建设推广平台
  • 用dw制作个介绍家乡网站学生个人简历
  • 建设银行企业网站访问不了wordpress搬到谷歌服务器
  • 网站建设与网站优化销售别墅庭院园林景观设计公司
  • 沈阳红方城网站建设专业的微网站哪家好
  • 医院网站asp东营信息发布平台
  • 网站全站建设开题报告范文南京本地网站
  • 网站漏洞扫描工具wampserver集成环境搭建了一个织梦cms网站
  • 如何在局域网上做网站宁波设计公司排行榜
  • 自己的电脑做网站服务器吗百度搜索风云榜总榜
  • 做化妆品的一些网站企业网站建设与营运计划书
  • 重庆速代网络科技seo整站优化服务教程
  • 成都比较好的装修设计公司seo3的空间构型
  • 开发商建设审批网站成都创意设计公司
  • 百度快照比网站上线时间早wordpress新建阅读量字段
  • 国家工程建设标准化协会网站网站开发工具有
  • 上海网站建设集中公关公司组织架构图
  • wordpress副标题的作用百度网站标题优化