Java编程技术大全:java详细学习路线及路线图
针对本书,java学习可以大致分为3个阶段。
初级阶段:学习Java基础语法和类的创建与使用,基础I/0 (输入/输出)操作、各种循环控制、运算符、数组的定义、方法定义格式、方法重载等,并熟练使用一种集成开发工具(如Eclipse等)。
中级阶段:掌握面向对象的封装、继承和多态,学习常用对象和工具类,深入I/0操作,异常处理、抽象类与接口等。
高级阶段:掌握Java的反射机制、GUI开发、并发多线程、Java Web编程、数据库编程、Android开发等。
对于读者来说, Java学习的路线在整体上需遵循:初级阶段→中级阶段一高级阶段。循序渐进地学习(见下图) ,不建议读者一开始就\”越级\”学习,需知\”欲速则不达\”。在这3个阶段各自内部的知识点,没有必然的先后次序,读者可根据自己的实际情况\”有的放矢\”地学习。不管处于哪个学习阶段,读者都要重视Java的实战练习。等学习到高级阶段后,还要用一些项目实训来提升自己。
成为一名Java高手,可能需要经历多年的时间。一些读者担心,自己可能等不到成为高手那一天,就无力开发Java了。其实, Java相关的开发行业也如陈年美酒,愈陈愈香。想一想,前面提到Java的核心设计者James Gosling ,发髯皆白,却依然意气风发,时常给比他年轻很多的软件开发精英们讲解Java发展之道那种指点江山的气势,是何等的豪迈! Java软件开发行业职业寿命很长,能提供给从业人员更广阔的发展方向。如果想在Java开发相关的领域有所建树,多一份持久的坚持是必需的。
从一个Java的初学者,升级为一个编程高手,从来都没有捷径。其必经的一个成长路线正如下图所示:编写代码一犯错(发现问题)一纠错(解决问题)一自我提升一编写代码一犯错(发现问题)一纠错(解决问题)一自我提升……积累了一定的感性认识后,才会有质的突变,提升至新的境界。总之,想成为一个高水平的Java程序员,一定要多动手练习,多思考。
2000多年前,孔夫子就管说过,\”学而时习之,不亦说乎?\”杨伯峻先生在《论语译注》中对这句话有精辟的注解: \”学了,然后(按一定的时间)去实习它,不也高兴吗?\”对于Java的学习,也应是这样,仅仅懂得一堆Java语法,毫无意义,我们必须亲自动手实践它。
最后需要说明的是, Java高手绝对没有什么捷径可走,也绝不是一本书就能成就的,需要学习者不断地自我迭代,在理论上提升自己(如在读完本书后,还可以接着读读《编程之美》 《设计模式之禅》 《企业应用构架模式》 《97 things software architec should know》等) ,并在实战中反复地练习。只要这样,才能让自己操作代码的“动作\”收放自如,才能让自己的\”招式\”炉火纯青。
各位Java爱好者,想在这个计算为王的大千世界放马驰骋吗?赶快动手吧(Just do IT) !
本文节选自《Java编程技术大全》
本书面向Java的零基础读者,用实际案例引导读者学习。本书主要包括基础知识、核心技术、高级应用和项目案例等4篇内容,帮助读者系统、全面地学习。 为了增强实用性,还特别赠送了精选的考试认证、求职面试等题库,供读者研究学习。最后,为帮助初入职场的从业者顺利进入角色,还赠送了职业规划建议及相关开发文档。
如何正确控制springboot中bean的加载顺序总结
转载:https://segmentfault.com/a/1190000023204143
springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题。在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件的自动装配功能。
在一般业务场景,可能你不大关心一个bean是如何被注册进spring容器的。只需要把需要注册进容器的bean声明为@Component即可,spring会自动扫描到这个Bean完成初始化并加载到spring上下文容器。
而当你在项目启动时需要提前做一个业务的初始化工作时,或者你正在开发某个中间件需要完成自动装配时。你会声明自己的Configuration类,但是可能你面对的是好几个有互相依赖的Bean。如果不加以控制,这时候可能会报找不到依赖的错误。
但是你明明已经把相关的Bean都注册进spring上下文了呀。这时候你需要通过一些手段来控制springboot中的bean加载顺序。
在正式说如何控制加载顺序之前,先说2个误区。
在标注了@Configuration的类中,写在前面的@Bean一定会被先注册
这个不存在的,spring在以前xml的时代,也不存在写在前面一定会被先加载的逻辑。因为xml不是渐进的加载,而是全部parse好,再进行依赖分析和注册。到了springboot中,只是省去了xml被parse成spring内部对象的这一过程,但是加载方式并没有大的改变。
利用@Order这个标注能进行加载顺序的控制
严格的说,不是所有的Bean都可以通过@Order这个标注进行顺序的控制。你把@Order这个标注加在普通的方法上或者类上一点鸟用都没有。
那@Order能控制哪些bean的加载顺序呢,我们先看看官方的解释:
最开始@Order注解用于切面的优先级指定;在 4.0 之后对它的功能进行了增强,支持集合的注入时,指定集合中 bean 的顺序,并且特别指出了,它对于当 实例的 bean 之间的顺序,没有任何影响。
目前用的比较多的有以下3点:
- 控制AOP的类的加载顺序,也就是被@Aspect标注的类
- 控制ApplicationListener实现类的加载顺序
- 控制CommandLineRunner实现类的加载顺序
@DependsOn注解可以用来控制bean的创建顺序,该注解用于声明当前bean依赖于另外一个bean。所依赖的bean会被容器确保在当前bean实例化之前被实例化。
示例:
以上代码bean的加载顺序为:
@DependsOn的使用:
直接或者间接标注在带有@Component注解的类上面;
直接或者间接标注在带有@Bean注解的方法上面;
使用@DependsOn注解到类层面仅仅在使用 component-scanning 方式时才有效,如果带有@DependsOn注解的类通过XML方式使用,该注解会被忽略,<bean depends-on=\”…\”/>这种方式会生效。
3.2 参数注入
在@Bean标注的方法上,如果你传入了参数,springboot会自动会为这个参数在spring上下文里寻找这个类型的引用。并先初始化这个类的实例。
利用此特性,我们也可以控制bean的加载顺序。
示例:
以上结果,beanB先于beanA被初始化加载。
需要注意的是,springboot会按类型去寻找。如果这个类型有多个实例被注册到spring上下文,那你就需要加上@Qualifier(\”Bean的名称\”)来指定
在spring体系中,从容器到Bean实例化&初始化都是有生命周期的,并且提供了很多的扩展点,允许你在这些步骤时进行逻辑的扩展。
这些可扩展点的加载顺序由spring自己控制,大多数是无法进行干预的。我们可以利用这一点,扩展spring的扩展点。在相应的扩展点加入自己的业务初始化代码。从来达到顺序的控制。
这个注解用来指定配置文件的加载顺序。但是在实际测试中发现,以下这样使用是不生效的:
无论你2个数字填多少,都不会改变其加载顺序结果。
那这个@AutoConfigureOrder到底是如何使用的呢。
经过测试发现,@AutoConfigureOrder只能改变外部依赖的@Configuration的顺序。如何理解是外部依赖呢。
能被你工程内部scan到的包,都是内部的Configuration,而spring引入外部的Configuration,都是通过spring特有的spi文件:spring.factories
换句话说,@AutoConfigureOrder能改变spring.factories中的@Configuration的顺序。
具体使用方式:
spring.factories:
其实在工作中,我相信很多人碰到过复杂的依赖关系的bean加载,把这种不确定给spring去做,还不如我们自己去控制,这样在阅读代码的时候 ,也能轻易看出bean之间的依赖先后顺序。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。