五分钟学Java:一篇文章搞懂spring和springMVC
原创声明
本文首发于微信公众号【程序员黄小斜】
本文作者:黄小斜
转载请务必在文章开头注明出处和作者。
本文思维导图
什么是Spring,为什么你要学习spring?
你第一次接触spring框架是在什么时候?相信很多人和我一样,第一次了解spring都不是做项目的时候用到,而是在网上看到或者是听到过一个叫做spring的框架,这个框架号称完爆之前的structs和structs2,吸引了不少人的注意。
那么,spring到底有没有神奇呢,据记载,spring框架出现的时间是在2002年,当时的人们对于繁琐笨重的EJB框架诟病不已,而且对于structs这类框架也没有什么好感,这个时候spring从天而,救一大批Java开发者于水火之中。
让我们先看看百度百科对于spring的定义,Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
◆目的:解决企业应用开发的复杂性
◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
◆范围:任何Java应用
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
spring框架解决了程序员在Java开发中长期存在的两个痛点,那就是bean管理和统一切面,而spring的IOC和AOP恰好解决了这两个问题。
其实,spring生态中的内容丰富多彩,除了上图提到的这些模块,如今spring已经发展到了springboot和springcloud,为微服务等后端技术栈提供非常优质的解决方案。
如今,spring框架已经成为Java程序员必知必会的内容了,那么如何开始学习spring框架,就成为了我们今天要讨论的主题。
首先,先来看看spring基础部分应该如何学习。
spring基础
spring的核心就是IOC和AOP了,把这两点搞懂,你就可以说自己学会了spring(然而并不是)
首先来看看IOC,IOC的本质就是把bean的管理交给框架去做,spring自己维护一个bean容器,将所有bean进行统一管理,这样一来,所有需要用到实例的场景都不需要写繁琐且重复的实例化代码,而是简单地完成bean声明和注入依赖就可以了。
举个简单的例子。
假如没有spring的IOC,我们管理实例时可能很不方便,比如下面这段代码,我们必须要在构造方法里对userService和bookservice进行实例化,并且注入相应的依赖,否则它自己是没有办法完成初始化的。甚至,我们在使用controller的时候还要自己对它进行实例化。
class QueryController{ UserService userService; BookService bookservice; QueryController() { userService = new UserService; userService.setUserDao(new UserDap()); bookservice = new BookService; bookservice.setBookDao(new BookDao()); } public static void main(Strings[] args) { QueryController queryController = new QueryController(); } }
一旦我们使用了spring框架,利用它的依赖注入功能,就可以省掉一大堆事情。如下面的代码所示。
@Controller class QueryController{ @Autowired UserService userService; @Autowired BookService bookservice; }
当然,我们这里还用了spring提供的注解功能,比如@Controller这个注解,可以把一个类声明成一个controller,spring的bean容器对它进行实例化,并且按照controller来进行特殊处理,而@
Autowired这个注解,则可以把userService和bookservice的实例都注入到QueryController里,而这一切,都是因为spring的IOC帮你实现了bean管理。
当然了,userService和bookservice本身也可以把自己对应的dao层依赖(持久层)通过IOC方式进行注入。
说完了IOC,再来看看AOP是如何实现的吧。
AOP的本质是利用动态代理完成统一切面的功能,利用AOP,我们可以把一些横向的同一类型代码进行复用,比如登录拦截,身份校验,安全管理等等,这些不需要内嵌到业务代码中,但却经常要用到的东西,就可以利用AOP来做成一个切面,然后指定需要拦截的方法,AOP通过动态代理会将切面代码加入到代理对象中,于是你执行业务代码时,相当于在执行代理对象,就会相应地调用切面方法。
一个最简单的动态代理实现如下:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Main { public static void main(String[] args) { InvocationHandler handler = new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method); if (method.getName().equals("morning")) { System.out.println("Good morning, " + args[0]); } return null; } }; Hello hello = (Hello) Proxy.newProxyInstance( Hello.class.getClassLoader(), // 传入ClassLoader new Class[] { Hello.class }, // 传入要实现的接口 handler); // 传入处理调用方法的InvocationHandler hello.morning("Bob"); } } interface Hello { void morning(String name); }
结果将会输出
public abstract void test.Hello.morning(java.lang.String) Good morning, Bob
其中InvocationHandler就是代理类的代码,而AOP就是机遇动态代理来实现的,你可以自由发挥,在代理类里使用你自己想要的代码。
其实,除了IOC和AOP之外,spring里还有很多我们经常在用的组件和模块,比如事务,比如JDBC,再比如JMS(消息服务)等等,这些常用的技术组件都被整合到了spring框架中,非常便于我们的使用。
springmvc
讲完了spring,接下来就该聊聊springmvc了,
据百度百科介绍,Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等。
作为一个web开发者,光有spring的AOP和IOC恐怕还无法支持你开发出一个页面,springmvc的作用就是为了帮你实现最高效的web开发,告别structs框架。
简单来说,springmvc提供了一套典型的mvc开发模式,m也就是model层,负责提供数据模型,以及和数据库进行交互,而C代表的是controller,负责分发和处理web请求,这里指的是HTTP请求,一般的controller会处理对应url的web请求,并且返回相应的内容,而在返回内容的这部分功能,则需要v也就是view层来提供了,毕竟页面的渲染是很麻烦的一件事情,返回对象可能是文本,可能是json,也可能是一个html页面,view层就用于处理这些工作。
MVC的开发模式确实解决了web工程师的很多问题,springmvc作为mvc框架的先行者也很自然地成为了Java中的霸主。
随着Java技术的发展和更迭,如今Java能做的事情已经远不止web开发了,现在流行的微服务、中间件很多都是用Java来实现的,而spring生态自然也会随之发展,由此出现的springboot、springcloud也已经成为了业界的开源框架的标杆。
时间有限,剩余的内容我们将会在以后继续推出,敬请期待。
推荐资源
spring的书籍、视频教程其实都很多,这里挑选一些我认为还不错的推荐给大家。
其实,spring最好的技术资源就在官方:https://spring.io/
英文好的同学不妨直接去看官方文档。
书籍
Spring Boot实战 ,丁雪丰 (译者)
Spring源码深度解析
视频
这里我整理了一些还算不错的视频资源分享给大家,具体请在公众号【程序员黄小斜】内回复“spring”即可查看
博客
Java技术仓库《Java程序员复习指南》
https://github.com/h2pl/Java-Tutorial
整合全网优质Java学习内容,帮助你从基础到进阶系统化复习Java
面试指南
全网最热的Java面试指南,共200多页,非常实用,不管是用于复习还是准备面试都是不错的。
在公众号【Java技术江湖】回复“PDF”即可免费领取。
写在最后
如果觉得本文对你有帮助的话,请你也不要吝啬你的“好看”哈,转发朋友圈就是对我最大的支持啦,你们的支持是对我最大的鼓励。
对本系列文章有什么建议和意见,也欢迎留言告诉我,期待你的回馈。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
F版本SpringCloud 2—什么是SpringCloud?SpringCloud版本选择
引言:搭建微服务架构就像是买电脑,使用SpringCloud就是在买品牌机。 前言 昂,美好的天气里,不想直接说技术,给小伙伴萌看看傍晚的天空吧。 —— 能找到天上的北极星吗? 上一篇文章中,通过一个简单的小故事,轻松愉快的讲解了架构的演变,以及为啥会有微服务,什么是微服务。不过在最后留下了一个小疑问:将架构设计为微服务需要一整套技术,解决服务调用,服务治理,服务监控等问题。 那么这些技术怎么来呢? 答案就是:SpringCloud。 本文就会详细讲解 什么是SpringCloud SpringCloud和SpringBoot的关系 SpringCloud版本选择 什么是SpringCloud 引言:搭建微服务架构就像是买电脑,使用SpringCloud就是在买品牌机。 SpringCloud,基于SpringBoot提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于NetFlix的开源组件做高度抽象封装之外,还有一些选型中立的开源组件。 NetFlix 是美国的一个在线视频网站,微服务业的翘楚,他是公认的大规模生产级微服务的...
- 下一篇
解Bug之路-中间件"SQL重复执行"
前言 我们的分库分表中间件在线上运行了两年多,到目前为止还算稳定。在笔者将精力放在处理各种灾难性事件(例如中间件物理机宕机/数据库宕机/网络隔离等突发事件)时。竟然发现还有一些奇怪的corner case。现在就将排查思路写成文章分享出来。 Bug现场 应用拓扑 应用通过中间件连后端多个数据库,sql会根据路由规则路由到指定的节点,如下图所示: 错误现象 应用在做某些数据库操作时,会发现有比较大的概率失败。他们的代码逻辑是这样: int count = updateSql(sql1); ... // 伪代码 int count = updateSql("update test set value =1 where id in ("100","200") and status = 1; if( 0 == count ){ throw new RuntimeException("更新失败"); } ...... int count = updateSql(sql3); ... 即每做一次update之后都检查下是否更新成功,如果不成功则回滚并抛异常。在实际测试的过程中,发现经常报错,更新为...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8编译安装MySQL8.0.19
- CentOS8安装Docker,最新的服务器搭配容器使用