原创声明
本文首发于微信公众号[程序员黄小斜]
本文思维导图
什么是 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" 即可免费领取.
写在最后
如果觉得本文对你有帮助的话, 请你也不要吝啬你的 "好看" 哈, 转发朋友圈就是对我最大的支持啦, 你们的支持是对我最大的鼓励.
对本系列文章有什么建议和意见, 也欢迎留言告诉我, 期待你的回馈.
来源: https://www.cnblogs.com/xll1025/p/12577975.html