原创声明

本文首发于微信公众号【程序员黄小斜】

本文作者:黄小斜

转载请务必在文章开头注明出处和作者。

本文思维导图

什么是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”即可免费领取。

写在最后

如果觉得本文对你有帮助的话,请你也不要吝啬你的“好看”哈,转发朋友圈就是对我最大的支持啦,你们的支持是对我最大的鼓励。

对本系列文章有什么建议和意见,也欢迎留言告诉我,期待你的回馈。

五分钟学Java:一篇文章带你搞懂spring全家桶套餐的更多相关文章

  1. 一篇文章带你搞懂DEX文件的结构

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 DEX文件就是Android Dalvik虚拟机运行的程序,关于DEX文件的结构的重要性我就不多说了.下面,开练! 建议:不要只看 ...

  2. 一篇文章带你搞懂 SpringBoot与Swagger整合

    Swagger使用由于不喜欢csdn的markwoen编辑器,对代码样式支持不好,看着不舒服,对审美要求比较高的同学移步github:https://github.com/itguang/swagge ...

  3. 一篇文章带你搞懂 etcd 3.5 的核心特性

    作者 唐聪,腾讯云资深工程师,极客时间专栏<etcd实战课>作者,etcd活跃贡献者,主要负责腾讯云大规模k8s/etcd平台.有状态服务容器化.在离线混部等产品研发设计工作. etcd ...

  4. 一篇文章带你搞懂InnoDB的索引|结合样例

    关注公众号[程序员白泽],带你走进一个不一样的程序员/学生党 前言 前阵子面试的时候,在第三面问到了MySQL索引相关的知识点,并且给出了一些SQL语句分析索引的执行情况.所以今天这篇文章给大家讲讲索 ...

  5. 五分钟学Java:如何才能学好Java Web里这么多的技术

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...

  6. 五分钟学Java:一篇文章搞懂spring和springMVC

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 什么是Spring,为什么你要学习spring? 你第一次接触spring框架是在什么时候?相信很多人和我一样,第一次了 ...

  7. 五分钟学Java:如何学习Java面试必考的网络编程

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 简介 Java作为一门后端语言,对于网络编程的支持是必不可少的,但是,作为一个经常CRUD的Java工程师,很多时候都不 ...

  8. 一篇文章带你搞定 ElasticSearch 术语

    这篇文章主要介绍 ElasticSearch 的基本概念,学习文档.索引.集群.节点.分片等概念,同时会将 ElasticSearch 和关系型数据库做简单的类比,还会简单介绍 REST API 的使 ...

  9. 五分钟学Java:如何学习Java面试必考的JVM虚拟机

    原创声明 本文首发于微信公众号[程序员黄小斜] 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 为什么要学习JVM虚拟机 最近的你有没有参加Java面试呢?你有没有发现,Java ...

随机推荐

  1. Java如何打印日志

    以下为<正确的打日志姿势>学习笔记. 什么时候打日志 1.程序出现问题,只能通过 debug 功能来定位问题,很大程度是日志没打好.良好的系统,通过日志就能进行问题定位. 2.if-els ...

  2. ajax学习相关

    choices参数 当存在某个字段的值只有有限的几个时,如性别(只有男.女),婚否(已婚.未婚)等,这种情况,我们可以用数字来代替这些中文字符,可以减轻数据库的负担,这时,就需要用到choices参数 ...

  3. 29.eval函数

    eval 函数 eval() 函数十分强大 -- 将字符串 当成 有效的表达式 来求值 并 返回计算结果 123456789101112131415 # 基本的数学计算In [1]: eval(&qu ...

  4. 微信小程序配置二

    tabBar 客户端窗口底部的tab页面切换,只能配置最好两个.最多5个tab 属性说明: 属性 类型 必填 默认值 描述 color HexColor 是 tab上的文字默认颜色 selectedC ...

  5. 【转载】checkbox实现全选/取消全选

    比较简单.好理解的写法,做个备注.查看请前往原地址:http://blog.csdn.net/graceup/article/details/46650781 <html> <bod ...

  6. Java程序监控---Metrics

    概念 Metrics是一个给JAVA服务的各项指标提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控 目前最为流行的 metrics 库是来自 Coda ...

  7. Flutter Widgets 之 RichText

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 基础用法 应用程序离不开文字的展示,因此文字的排版非常重要 ...

  8. 【视频+图文】带你快速掌握带continue语句的双重for循环

    双重for循环掌握后,我们就一起来看看双重for循环的进阶内容一之带continue语句的双重for循环. 上期双重for循环[视频+图文]讲解传输门:点击这里可去小乔的哔哩哔哩观看for循环视频~ ...

  9. 压力测试(九)-Jmeter压测课程总结和架构浅析

    安装常见问题 1.问题 [root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server Created remote object: UnicastServer ...

  10. Java程序员考研失败后的面试经历,oppo、VIVO、等面经

      温馨提示:有些可能会遗漏个别问题,都是最近一周的面试,有点忘了. 浪潮(一面挂) 你是网络工程的?对网络很了解? 解释一下什么是广播域 怎么划分子网 说一下CSS的几种分类器 数据库中有哪些聚集函 ...