大家好,又见面了,我是你们的朋友全栈君。
优效学院,名师执教,学习更优效,IT在线教育领导者。三人行必有我师,人生是需要不断学习的,在这里我们相遇就是缘分,欢迎大家加群—-四六零五七零八二四—-让我们共同进步!希望各位可以看完这篇文章,也欢迎大家在下面留言讨论,天冷了,也动动手指转发收藏一下,谢谢大家!
Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目得是简化企业开发。
使用Spring可以降低组件之间的耦合度,实现软件各层之间的解耦。可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务.也不需处理复杂的事务传播。容器提供单例模式支持,开发人员不再需要自己编写实现代码。容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。容器提供的众多辅作类,使用这些类能够加快应用的开发,如: JdbcTemplate、 HibernateTemplate。Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样更便于应用的开发。
Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的作用就是完全解耦类之间的依赖关系,一个类如果要依赖什么,那就是一个接口。至于如何实现这个接口,这都不重要了。只要拿到一个实现了这个接口的类,就可以轻松的通过xml配置文件把实现类注射到调用接口的那个类里。所有类之间的这种依赖关系就完全通过配置文件的方式替代了。所以Spring框架最核心的就是所谓的依赖注射和控制反转。
针对Spring的学习,第一步就是理解IoC和AOP,这可以说是基础。
IoC控制反转,对象创建责任的反转。我们知道,Spring中的BeanFacotory是IoC容器的核心接口,负责实例化、定位、配置应用程序中对象及监理这些对象间的依赖。XmlBeanFacotory实现BeanFactory接口,通过获取xml配置文件数据,组成应用对象及对象间的依赖关系。
顺便说一下,在Spring中有三种注入方式,第一种是set注入,第二种是接口注入,还有一种是构造方法注入。
AOP面向切面编程,也就是纵向的编程。在OOP面向对象的使用中,无可避免的会出现代码重复,而且使用面向对象的编程方式,这种重复无法避免,比如用户权限判断中,根据相应的权限执行相应的方法;在servlet中设置编码格式时,同样相同的代码出现很多次,而且还根业务无关,很容易忘记写,结果运行的时候就出现乱码。这种重复代码不仅使编码麻烦,而且还不容易维护。而AOP则将这些代码整理起来,将解决某个切面问题的代码单独的放在某个模块中,然后再织入到程序中。
Spring框架中AOP的使用步骤,
第一步拷贝jar包
第二步spring配置文件中增加命名空间和约束文件
第三步写被代理的类和扩展类第
四步由配置文件声明
弄清楚了IoC和AOP之后,要学习的是SpringMVC。想要弄清楚Spring是怎么配置的,就要学会Servlet和JSP。学习Servlet是一定不能省的,现在流行的SpringMVC和Struts2都是基于Servlet的,Servlet是MVC模型最为基本的表现形态。只有深入了解Servlet才能理解后边的新技术。
我们在浏览器点击链接和按钮产生的消息不是发送给Servlet的,而是发送给web容器的。Web容器接收消息后转交给Servlet处理。而web容器和Servlet的交流依赖于Servlet接口。Servlet是一种接口规范,所以只要我们编写的Java类符合Servlet规范,那么就能被Web容器识别并被容器管理。Servlet容器通过向方法的参数赋值,HttpServletRequest或者HttpServletResponse传递来实现请求和响应。
JSP是面向服务器的。我们在写JSP时预设客户端是浏览器,JSP就是一个Servlet。
最后,如果想有一群“臭味相投”的朋友来一起交流学习的话,欢迎大家搜索群460570824,让我们共同进步!
====================================================================================
-
Spring AOP:采用了面向切面编程的思想,使Spring框架管理的对象支持AOP,同时这个模块也提供了事务管理,可以不依赖具体的EJB组件,就可以将事务管理集成到应用程序中。
-
Spring ORM:提供了对现有的ORM框架的支持,例如Hibernate,JDo等;
-
Spring DAO:提供了对DAO(Data Access Object,数据访问对象)模式和JDBC的支持。DAO可以实现将业务逻辑与数据库访问的代码分离,从而降低代码的耦合度。通过对JDBC的抽象,简化了开发工作,同时简化了对异常的处理(可以很好的处理不同数据库厂商抛出的异常);
-
Spring Web:提供了Servlet监听器的Context和Web应用的上下文。同时还集成了一些现有的Web框架,例如Struts
-
Spring Context:扩展核心容器,提供了Spring上下文环境,给开发人员提供了很多非常有用的服务,例如国际化,Email和JNDI访问等;
-
Spring Web MVC:提供了一个构建Web应用程序的MVC的实现
-
Spring Core:Spring框架的核心容器,他提供了Spring框架的基本功能。这个模块中最主要的一个组件为BeanFactory,它使用工厂模式来创建所需的对象。同时BeanFactory使用IOC思想,通过读取XML文件的方式来实例化对象,可以说BeanFactory提供了组件生命周期的管理,组件的创建,装配以及销毁等功能。
==========================================================================================
如今做Java尤其是web几乎是避免不了和Spring打交道了,但是Spring是这样的大而全,新鲜名词不断产生,学起来给人一种凌乱的感觉,我就在这里总结一下,理顺头绪。
Spring
Spring 概述
Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的(替代更加重量级的企业级Java技术, 尤其是EJB),它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率。
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式如下图:
组成 Spring 框架的每个模块都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
-
Spring 核心容器:核心容器提供 Spring 框架的基本功能,管理着Spring应用中bean的创建和配置。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用 DI 将应用程序的配置和依赖性规范与实际的应用程序代码分开。
-
Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息,提供了一种框架式的对象访问方法,有些像JNDI注册器。Context封装包的特性得自于Beans封装包,并添加了对国际化(I18N)的支持(例如资源绑定),事件传播,资源装载的方式和Context的透明创建,比如说通过Servlet容器。Spring 上下文和Bean工厂都是 bean 容器 的实现。
-
Spring AOP:通过配置管理特性,Spring AOP 模块直接将向切面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。
-
Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
-
Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
-
Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。
-
Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
Spring 核心特点:IOC和AOP
控制反转模式(IOC)也称作依赖性介入(DI)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,在配置文件中描述哪一个组件需要哪一项服务。容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。
Rod Johnson是第一个高度重视以配置文件来管理Java实例的协作关系的人,他给这种方式起了一个名字:控制反转(Inverse of Control,IoC)。后来Martine Fowler为这种方式起了另一个名称:依赖注入(Dependency Injection),因此不管是依赖注入,还是控制反转,其含义完全相同。
当某个Java对象(调用者)需要调用另一个Java对象(被依赖对象)的方法时,在传统模式下通常有两种做法
原始做法: 调用者主动创建被依赖对象,然后再调用被依赖对象的方法
简单工厂模式: 调用者先找到被依赖对象的工厂,然后主动通过工厂去获取被依赖对象,最后再调用被依赖对象的方法.
注意上面的主动二字,这必然会导致调用者与被依赖对象实现类的硬编码耦合,非常不利于项目升级的维护。使用Spring框架之后,调用者无需主动获取被依赖对象,调用者只要被动接受Spring容器为调用者的成员变量赋值即可,由此可见,使用Spring后,调用者获取被依赖对象的方式由原来的主动获取,变成了被动接受——所以Rod Johnson称之为控制反转。
另外从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量——相当于为调用者注入它依赖的实例,因此Martine Fowler称之为依赖注入。
AOP(Aspect Orient Programming)也就是面向切面编程,作为面向对象编程的一种补充,已经成为一种比较成熟的编程方式。其实AOP问世的时间并不太长,AOP和OOP互为补充,面向切面编程将程序运行过程分解成各个切面。
AOP专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在JavaEE应用中,常常通过AOP来处理一些具有横切性质的系统级服务,如日志、事务管理、安全检查、缓存、对象池管理等,AOP已经成为一种非常常用的解决方案。
在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上,这样 Java 类就不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用 Spring AOP 编写的应用程序代码是松散耦合的。
Spring 优点总结
-
低侵入式设计,代码的污染极低:很多框架通过强迫应用继承它们的类或实现它们的接口而导致应用与框架绑死,而Spring是通过spring特有的注解和通用的pojo结合。Spring的非侵入编程模型意味着这个类在Spring应用和非Spring应用中都可以发挥同样的作用。Spring的组件就是普通的Java Bean,这也使得单元测试可以不再依赖容器,编写更加容易。
-
使用模板消除样板式代码: 如Spring的JdbcTemplate使得执行数据库操作时避免传统的JDBC样板代码(创建一个数据库连接,然后再创建一个语句对象,最后你才能进行查询,关闭数据库连接、语句和结果集)成为了可能。
-
独立于各种应用服务器:基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺。
-
Spring的IoC容器降低了业务对象替换的复杂性,降低了了组件之间的耦合性:对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定,所以对象无需自行创建或管理它们的依赖关系,依赖关系将被自动注入到需要它们的对象当中去。而且如果一个对象只通过接口而不是具体实现或初始化过程来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换。
-
Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理: 将核心业务和系统服务分离,保持POJO的简单性和内聚性,从而使他们各自达到更好的复用。
-
Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问:
-
Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部:当Spring不能满足需求时, 完全可以考虑其他选择。事实上, Spring甚至提供了与其他第三方框架和类库的集成点, 这样你就不需要自己编写这样的代码了。比如以前常用的SSH框架,现在常用的SSM框架
Spring包含许多项目,下面挑一些最常用的出来总结一下。
Spring MVC
Spring MVC是Spring中的基础 Web 框架,基于模型-视图-控制器(Model-View-Controller,MVC)模式实现,它能够帮你构建像Spring框架那样灵活和松耦合的Web应用程序。
在该框架下,一次web请求大致可以分为如下图几个步骤,这些划分分离了职责,使得代码灵活、维护性更好。
为了使用该框架,我们首先要配置DispatchServlet,也就 是前端控制器,然后启用Spring MVC,并编写控制器,视图,模型等等。
其中,DispatcherServlet是Spring MVC的核心,DispatcherServlet启动的时候,它会创建Spring应用上下文,并加载配置文件或配置类中所声明的bean或者自动扫描的bean,但是在Spring Web应用中,通常还会有另外一个应用上下文,这个应用上下文是由ContextLoaderListener创建的。DispatcherServlet加载包含Web组件的bean,如控制器、视图解析器以及处理器映射,而ContextLoaderListener要加载应用中的其他bean,通常是驱动应用后端的中间层和数据层组件。
Spring MVC是一个强大灵活的Web框架。借助于注解,Spring MVC提供了近似于POJO的开发模式,这使得开发处理请求的控制器变得非常简单,同时也易于测试。而且Spring MVC还支持多种视图解析器如JSP,Tiles,Thymeleaf,使得前端界面的功能更强大,编写更容易。
Spring Web Flow
Spring Web Flow是Spring MVC的一个扩展, 它为基于流程的会话式Web应用(购物车或者向导功能)提供了支持。简言之,它是一个流程框架,能够引导用户执行一系列向导步骤。
在Spring Web Flow中,流程是由三个主要元素定义的:状态、转移和流程数据。状态( State)是流程中事件发生的地点,在流程中通过转移的方式从一个状态到另一个状态,流程的当前状况称为流程数据。
状态分为:
-
行为( Action) 行为状态是流程逻辑发生的地方
-
决策( Decision) 决策状态将流程分成两个方向, 它会基于流程数据的评估结果确定流程方向
-
结束( End) 结束状态是流程的最后一站。 一旦进入End状态, 流程就会终止
-
子流程( Subflow) 子流程状态会在当前正在运行的流程上下文中启动一个新的流程
-
视图( View) 视图状态会暂停流程并邀请用户参与流程
转移连接了流程中的状态。流程中除结束状态之外的每个状态,至少都需要一个转移,这样就能够知道一旦这个状态完成时流程要去向哪里。状态可以有多个转移,分别对应于当前状态结束时可以执行的不同的路径。
当流程从一个状态进行到另一个状态时,它会带走一些流程数据。有时候,这些数据只需要很短的时间(可能只要展现页面给用户)。有时候,这些数据会在整个流程中传递并在流程结束的时候使用。
Spring Web Flow 可以构建会话式应用程序的Web框架,这是好的,但是感觉其配置只能用xml这个设计不太合理,尤其是当bean很多或者流程节点很多时都不好维护。
Spring Security
安全对于许多应用都是一个非常关键的切面,因为安全性是超越应用程序功能的一个关注点,应用系统的绝大部分内容都不应该参与到与自己相关的安全性处理中。尽管我们可以直接在应用程序中编写安全性功能相关的代码,但更好的方式还是将安全性相关的关注点与应用程序本身的关注点进行分离,作为系统的一个切面。Spring Security就是通过AOP和Filter来为应用程序实现安全性的。
使用Servlet规范中的Filter保护Web请求并限制URL级别的访问。Spring Security还能够使用Spring AOP保护方法调用——借助于对象代理和使用通知,能够确保只有具备适当权限的用户才能访问安全保护的方法。
Spring Security非常灵活,能够基于各种数据存储来认证用户。它内置了多种常见的用户存储场景,如内存、关系型数据库以及LDAP。但我们也可以编写并插入自定义的用户存储实现。
当为浏览器渲染HTML内容时,你可能希望视图中能够反映安全限制和相关的信息。一个简单的样例就是渲染用户的基本信息( 比如显示“您已经以……身份登录”)。或者你想根据用户被授予了什么权限,有条件地渲染特定的视图元素。Spring Security本身提供了一个JSP标签库,而Thymeleaf通过特定的方言实现了与Spring Security的集成。借助于这些,可以很容易的实现对视图的保护。
Spring Data
Spring Data 是为了简化构建基于 Spring 框架应用的数据访问技术,包括关系数据库、NoSQL、Map-Reduce 框架、云数据服务等等,旨在提供一种通用、统一的编码模式(但是并不是代码完全一样),使得在Spring中使用任何数据库都变得非常容易。
Spring Data作为Spring Source的其中一个父项目,旨在统一和简化对各类型持久化存储,而不拘泥于是关系型数据库还是NoSQL数据存储。
目前的Spring Data 包含如下的模块(或者说子项目):
-
Spring Data Commons
-
Spring Data JPA
-
Spring Data KeyValue
-
Spring Data LDAP
-
Spring Data MongoDB
-
Spring Data Gemfire
-
Spring Data REST
-
Spring Data Redis
-
Spring Data for Apache Cassandra
-
Spring Data for Apache Solr
-
Spring Data Couchbase (community module)
-
Spring Data Elasticsearch (community module)
-
Spring Data Neo4j (community module)
无论是哪种持久化存储,数据访问对象(DAO,即Data Access Objects)通常都会提供对单一域对象的CRUD(创建、读取、更新、删除)操作、查询方法、排序和分页方法等。Spring Data则提供了基于这些层面的统一接口(CrudRepository,PagingAndSortingRepository)以及对持久化存储的实现。
你可能接触过某一种Spring模型对象——比如JdbcTemplate——来编写访问对象的实现。但是在基于Spring Data的数据访问对象,我们只需定义和编写一些查询方法的接口(基于不同的持续化存储, 定义有可能稍有不同),Spring Data会在运行时间生成正确的实现。
所有Spring Data的子项目都支持:
-
模板:处理资源分配和异常处理
-
对象、数据存储映射:如ORM
-
对数据访问对象的支持: 帮助我们编写一些模板式语句如分页排序
然而一些Spring Data子项目,如Spring Data Redis和Spring Data Riak都只是提供模板,这是由于其相应的数据存储都只支持非结构化的数据,而不适用于对象的映射和查询。
Spring Boot
Spring诞生时是Java企业版(Java Enterprise Edition, JEE,也称J2EE)的轻量级代替品。无需开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法。
虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多的XML配置,即使后来有基于注解的改善,我们依然难逃大量配置的魔爪。而Spring Boot让这一切成为了过去,如果说Spring的目的是简化程序的开发,那么Spring Boot就是为了简化Spring本身的开发。
Spring Boot依赖于自动配置技术将Spring应用中样板式的配置移除掉,这样就能让我们免受于一大堆的配置之苦,更加专注于业务功能。Spring Boot同时还提供了多个Starter项目,拿来即可用,极大地简化了编程任务。
它提供了四个主要的特性,能够改变开发Spring应用程序的方式:
-
Spring Boot Starter: 它将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中,这里可以找到目前所有的starter项目。
-
自动配置: Spring Boot的自动配置特性利用了Spring 4对条件化配置的支持,合理地推测应用所需的bean并自动化配置它们,减少了你自己需要配置的数量。
-
命令行接口(Command-line interface,CLI):Spring Boot的CLI发挥了Groovy编程语言的优势,并结合自动配置进一步简化Spring应用的开发。
-
Actuator: 它为Spring Boot应用添加了一定的管理特性。
Spring Cloud
在进入主题之前,首先来看看微服务,简单说来就是将原本单个独立的大系统拆分为分布式的多个小型的服务,这些小型服务各自独立运行,他们通过HTTP和RestFul API进行通信。
一个微服务一般完成某个特定的功能,比如下单管理、客户管理等等。每一个微服务都是微型六角形应用,都有自己的业务逻辑和适配器。一些微服务还会发布API给其它微服务和应用客户端使用。其它微服务完成一个Web UI,运行时,每一个实例可能是一个云VM或者是Docker容器。
微服务具有分布式系统的特性,如服务发现,负载均衡,故障转移,多版本,灰度升级,服务降级,分布式跟踪。
Spring Cloud是一套完整的分布式系统解决方案,它的子项目涵盖了所有实现分布式系统所需要的基础软件设施(包括配置管理、服务治理、智能路由、全局锁等等)。基于Spring Boot,Spring Boot做较少的配置,便可成为Spring Cloud中的一个微服务,使用Spring Cloud的开发者可以快速的启动服务或构建应用、同时能够快速和云平台资源进行对接,使得开发部署极其简单。
Spring Cloud专注于提供良好的开箱即用经验的典型用例和可扩展性机制覆盖:
-
分布式/版本化配置:Spring Cloud Config
-
服务注册和发现:Netflix Eureka 或者 Spring Cloud Eureka(对前者的二次封装)
-
路由:Spring Cloud Zuul 基于 Netflix Zuul
-
service – to – service调用:Spring Cloud Feign
-
负载均衡:Spring Cloud Ribbon 基于 Netflix Ribbon 实现
-
断路器:Spring Cloud Hystrix
-
分布式消息传递:Spring Cloud Bus
后记
总结了一大堆,感觉Spring Boot是趋势,毕竟效率是王道。然后就是Spring Data的各个项目,因为如今的数据源是越发的丰富。最后,近几年微服务的概念挺火的,所以Spring Cloud也要多多了解。
如果你也想在IT行业拿高薪,可以参加我们的训练营课程,选择最适合自己的课程学习,技术大牛亲授,7个月后,进入名企拿高薪。我们的课程内容有:Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点。如果你想拿高薪的,想学习的,想就业前景好的,想跟别人竞争能取得优势的,想进阿里面试但担心面试不过的,你都可以来,群号为:575745314
注:加群要求
1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加。
2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。
3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。
4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。
5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!
6.小号或者小白之类加群一律不给过,谢谢。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157056.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...