大渡口java学习图

  @EnableTransactionManagement导入了一个类叫做TransactionManagementConfigurationSelector事务管理配置选择器。里面有一个selectImports方法。这里面有两种方式实现事务,第一个是PROXY代理的方法,第二个是拦截器的方式ASPECTJ。那么在代理实现中,去创建了两个组件。一个是AutoProxyRegistrar、另一个是ProxyTransactionManagementConfiguration。ProxyTransactionManagementConfiguration它这里面导入了三个组件,一个是BeanFactoryTransactionAttributeSourceAdvisor它继承了Advice接口。也就是说他是一个增强器。另一个是TransactionAttributeSource,它是事务属性资源。第三个是transactionInterceptor事务的拦截器。在看AutoProxyRegistrar这个类。它继承了了ImportBeanDefinitionRegistrar类,实现了registerBeanDefinitions这个接口。在这个方法里面调用了一个registerAutoProxyCreatorIfNecessary这个方法。在这个方法里面它又调用了本类的registerOrEscalateApcAsRequired方法,里面传了一个叫做InfrastructureAdvisorAutoProxyCreator.class的类。说完上面这个几个类以后,咱们看看InfrastructureAdvisorAutoProxyCreator.class这个类的结构图。看看有什么端倪。   通过图我们可以看出,InfrastructureAdvisorAutoProxyCreator这个类,跟上一篇文章讲的AnnotationAwareAspectJAutoProxyCreator这个类是不是很像啊。继承了相同的类,有着同样的属性。所以有着同样的配方。AnnotationAwareAspectJAutoProxyCreator这个类,之前我们分析过,主要有两个类postProcessBeforeInstantiation和postProcessAfterInitialization这两个类,也就是说,顺着这个思路,就能搞清楚,事务是如何被解析的啊。不知道各位读者能不能get到这个点。也就是说InfrastructureAdvisorAutoProxyCreator和AnnotationAwareAspectJAutoProxyCreator用了同一套模板。具有不同的实现罢了。这就是典型模板方法设计模式。下面,我们就具体的分析一下,事务是如何实现的。   还是从这个方法开始讲起,在这里针对这个方法不做重复的分析,之前在Aop第一章创建代理对象的时候对这个类的流程做过详细的讲解与分析,流程还是一样的流程,这里以打断点的形式,在说一次。但这次直接讲解这个方法内做的事情,涉及到的方法只提作用不具体分析,可以参考前面AOP创建代理对象的那篇文章去了解。   1,findCandidateAdvisors   同样断点进去这个发方法先从缓存拿数据,拿不到就判断isInfrastructureClass是否有基础类。比如Pointcut.class、Advisor.class、AopInfrastructureBean.class等等。然后判断shouldSkip方法,F5进去看,findCandidateAdvisors()找到候选的增强器,进入,进来去缓存拿cachedAdvisorBeanNames一看发现拿到了。为什么会拿到,因为在加载这个ProxyTransactionManagementConfiguration类的时候,上面说了,它入了三个组件,第一个是注入一个增强器,那么这个增强器的名称是什么?org.springframework.transaction.config.internalTransactionAdvisor就是这个东西。它实现了advice接口。在前面AOP文章中我说提到过两个方法,第一个就是findCandidateAdvisors()方法,当时就说这个东西找我们自定义的切面是找不到的,所以我们说,第一次进,这个方法就是在找事务想相关的。所以第一次走到这里就找到了,从缓存中可以拿得到。所以findCandidateAdvisors()这个方法走完以后。就找到了事务。然后接着往下看buildAspectJAdvisors()方法。

  至于那些“分叉”的入队失败的其他节点,在下一轮的循环中,它们的prev属性会重新指向新的尾节点,继续尝试新的CAS操作,最终,所有节点都会通过自旋不断的尝试入队,直到成功为止。   acquireQueued(final Node node, int arg)   addWaiter的将当前线程加入队列后,使用acquireQueued进行阻塞,直到获取到资源后返回。   condition=lock.newCondition();lock.lock();try{ while(!条件谓词成立){ condition.await(); }}finally{ lock.unlock();} final boolean acquireQueued(final Node node, int arg) { boolean failed=true; try { boolean interrupted=false; for (;;) { final Node p=node.predecessor(); // 当前节点的前驱是 head 节点时, 再次尝试获取锁 if (p==head && tryAcquire(arg)) { setHead(node); p.next=null; // help GC failed=false; return interrupted; } //在获取锁失败后, 判断是否需要把当前线程挂起 if (shouldParkAfterFailedAcquire(p, node) && parkAndCheckInterrupt()) interrupted=true; } } finally { if (failed) cancelAcquire(node); } }   shouldParkAfterFailedAcquire(Node pred, Node node)

  解释一下static块和static变量的执行顺序   equals()的重写规则   Java中如何创建线程?   JDK1.8新特性   JVM:

  @Target – 表示该注解用于什么地方。如果不明确指出,该注解可以放在任何地方。以下是一些可用的参数。需要说明的是:属性的注解是兼容的,如果你想给7个属性都添加注解,仅仅排除一个属性,那么你需要在定义target包含所有的属性。   ElementType.TYPE:用于描述类、接口或enum声明   ElementType.FIELD:用于描述实例变量   ElementType.METHOD   ElementType.PARAMETER

  ?首页排名靠前的5篇文章中,有1篇是错的,介绍了JVM内存结构。   PS:值得庆幸的的是,首页前5篇文章中,有两篇是我写的,至少我的这两篇我敢确定是不具备任何误导性的!!   3、还存在一种情况,虽然不多见,但是也有。那就是很多面试官自己也以为内存模型就是要介绍堆、栈、方法区这些知识。就导致有时候面试者不知道自己到底应该如何回答。   那么,到底什么是Java内存模型?关于这道面试题应该如何回答呢?   什么是内存模型

  简述Java内存模型的happen before原则   volatile的原理和实现机制 || volatile到底如何保证可见性和禁止指令重排序的?   volatile关键字的两层语义 || 可见性   volatile保证原子性吗?   volatile能保证有序性吗?

  JVM线程堆栈是一个给定时间的快照,它能向你提供所有被创建出来的Java线程的完整清单.   每一个被发现的Java线程都会给你如下信息:   – 线程的名称;经常被中间件厂商用来识别线程的标识,一般还会带上被分配的线程池名称以及状态 (运行,阻塞等等.)   – 线程类型 & 优先级,例如 : daemon prio=3 ** 中间件程序一般以后台守护的形式创建他们的线程,这意味着这些线程是在后台运行的;它们会向它们的用户提供服务,例如:向你的Java EE应用程序 **   – Java线程ID,例如 : tid=0x000000011e52a800 ** 这是通过 java.lang.Thread.getId() 获得的Java线程ID,它常常用自增长的长整形 1..n** 实现

  一门技术,如果它是开源的话,它就会变得越来越成熟。当你写了一段团队里都能通用的程序时,你可以告诉你的团队,节省开发的时间,也创造了别人给你提出问题的环境,让你的代码更加完善。   给你的代码写上必要的注释也是非常重要的,好多人写程序时都不愿意写注释,给的理由是没必要或者是时间太紧,试想一下,如果当你正在阅读或者修改一段没有注释的代码时候,你是不是会觉得弄懂它的意思很难,当然你可以花更多的时间去弄懂它,但如果你加了注释的话,就完全没有必要花费更多的时间了。   总之,Java是一门容易上手的编程语言,但想要融会贯通,除了掌握良好的学习方法之外,努力是必不可少的。学习java要对自己有充分的信心,调整学习方法和态度   下面介绍几个项目   项目名称:基于Java的飞机大战游戏的设计与实现


  程序猿是加班熬夜最严重的职业之一,经常熬夜还存在三大弊端:   第一,记忆力越来越差;第二,数数经常会数错;第四,记忆力越来越差;额,我说到哪了……   所以,如果可以不用加班,程序猿的生活也可以面朝大海,春暖花开!   1.需求不再改   其实,要杀一个程序猿根本不需要枪,改需求绝对是居家旅行,杀猿灭口之必备良方;


  问题就在afterExecute方法上, 这个方法没有做任何处理,所以如果我们的任务抛出了异常,我们也无法立刻感知到。 即使感知到了,也无法查看异常信息。   所以,作为一名好的开发者,是不应该允许这种情况出现的。   如何避免这种问题   思路很简单。   1、在提交的任务中将异常捕获并处理,不抛给线程池。


  Start testing randomJava(), test: Generate 10000 numbers(1D).   Testing randomJava() completed, using time: 11 ms.   Start testing randomJava(), test: Generate 10000 numbers(2D).   Testing randomJava() completed, using time: 8 ms.   非常优秀的随机数算法,速度快而且基本看不出规律。




java学习图

下一篇:java学习体会