从编程哲学到开发应用:Spring的初步应用
一、前言
在学习Spring的过程中,我们学习了很多东西,可是实际应用中,我们究竟用到了那些?常用的又是那种方法呢?
二、书上与开发的差异
1、IOC
1)
IOC,控制反转,是Spring框架的核心,是一种设计思想(不是技术),可以说,IOC贯穿Spring的整个框架,整个Spring是建立在IOC的基础上。原本我们创建对象就是直接在方法中把对象new出来,通过Spring,我们将大多数的对象交由Spring容器管理,当我们需要的时候,我们再依赖Spring容器注入(ID,依赖注入)[1]
IOC在实际中,有三个时候是比较重要,第一是学习的时候,第二是架构师写框架的时候,第三是我们面试的时候。
那开发呢?IOC是什么并不重要,IOC思想的辩证关系我们也不需要知道,毕竟我们是Java开发工程师,不是哲学家。在开发的时候,我们需要知道的是我们怎么去用好IOC思想指导下诞生的工具就行。
2)
在学习的过程中,我们必须学习XML文件中写下<bean></bean>的方式来实现IOC,那是必须的,因为Spring框架就是从这样发展而来。这样子会有个问题,假设有个中小型项目,大概在50张表左右,那么该有50个实体对象,还有Dao对象、Service对象和Controller对象,都已经150个了,还有一些配置信息,整个XML文件就会很长。再大型一点的项目上百张表,整个XML就会非常凌乱。就算拆分配置文件,修改的时候也会很麻烦。
后来Spring提供了注解的方法,替代了<bean></bean>。只需要在类上面,加上注解。[2]
注入的时候,我们可以通过@Resource或者@Autowired来注入。两个注解的区别在于,@Resource是Java自带的,通过名称进行匹配,默认第一个字母小写,如果名称写错了就呵呵呵了。而@Autowired是Spring的注解,通过类型进行匹配,遇上名字比较长的类就可以缩写了,当然一般来说还是默认第一字母小写。
2、AOP和拦截器[3]
我们学习的时候需要了解到AOP和拦截器,但实际上,这两个功能都是开发经理或者架构师在搭建项目的时候用到的,一旦搭建完毕,后续过程中极少修改,一般的程序员是极少用上。
3、面向接口编程
Spring IOC和倡导的面向接口编程都是解耦思想的不同表现。[4]
而实际上,我们开发的过程中,会出现的情况可不是如书上那么理想: [5]
1)没写注释。下面的图是我自己的学习框架的代码,没有写任何注释。开发过程中很多人这样干的。
2)代码量大。每家公司都有自己的框架和编程规范,一般来说,业务代码达到几百行是常见的规模,至于每家公司是怎么拆分代码,每家公司都是不一样的。但是无论怎么封装拆分,总会有些方法比较臃肿,达到上百行。
3)废除接口,直接用实现类。理由很简单,少敲代码。如果修改方法的参数、名字的时候,需要修改多出地方,连接口也要修改就比较麻烦。
对于中小型项目,我是觉得第三点废除接口比较理想,有利于编码效率。而对于比较大型的项目,还是需要建立接口,一般这样的项目,一个类中,代码可以达到几千行,有接口统一定义,统一管理,有利于协调各部分代码之间的联系,方便开发。需不需要面向接口,要看情况看项目,不能根据书上一概而论。
三、Spring的未来:Hello,SpringBoot[6]
当下,Spring作为最流行的框架之一被许多项目使用着,但我们也同时发现了问题,我们的配置文件非常庞大,需要什么功能就要往上加,需要兼用什么组件也往上加,显得臃肿。在这个背景下,Spring团队开发了SpringBoot框架(SB),SB不单止简化了配置,还将服务器包含在框架内。SB源于Spring,却优于Spring。目前一些比较好的公司在校招的时候已经明确要求会SB框架。
四、后言
看到这里,有人会疑问,这就完了?没错,这就完了,日常就是这样使用,只有直接没有XML文件。本文旨在总结阐述编程哲学与实际开发中遇到的各种问题,没有讨论编程哲学,没有讨论辩证关系,只有实践、实用。文中难免有错漏之处,希望各位不吝赐教,加以指正。
Reference:
[1] Acrash, 谈谈对Spring IOC的理解, https://blog.csdn.net/qq_22654611/article/details/52606960
[2] 依木前行, spring的@compont和@service以及@controller,@repository区别, https://blog.csdn.net/two_people/article/details/52180758
[3] 独具匠心, Spring AOP详解, https://www.cnblogs.com/hongwz/p/5764917.html
[4] JJ_nan, 面向接口编程的优点, https://blog.csdn.net/jj_nan/article/details/70161086
[5] 代码如此多娇, 面向接口编程,接口是什么,有什么作用?, https://www.cnblogs.com/lovelycode/articles/6887958.html
[6] _江南一点雨, 初识Spring Boot框架, https://blog.csdn.net/u012702547/article/details/53740047