1. 首页 > 电脑手机 >

spring入门(spring入门书籍推荐)

Spring框架入门

Spring是 分层 的JavaSE/EE ( 一站式 ) 轻量级 开源的 容器框架 ,以 IOC (Inverse of Control 控制反转:对象之间的关系由容器创建,降低了程序之间的依赖性)和 AOP (Aspect Oriented Programming 面向切面编程)为内核的容器框架

spring入门(spring入门书籍推荐)spring入门(spring入门书籍推荐)


一站式、分层:

JavaEE的有三层结构:web层、业务层、数据访问层(持久层,集成层),而Spring框架有对三层的每层解决方案:

web层:Spring MVC

持久层:JDBC Template (applicationContext.xml)

业务层:Spring的Bean管理(Bean:是spring根据用户提供相应的需求创建的对象,由IOC管理)(service)

spring官网:

Spring的英文翻译为春天,可以说是给Java程序员带来了春天,因为它 极大地简化了开发,有效的解决了当时软件开发比较复杂的问题 (当时采用EJB开发JAVA EE应用,但EJB存在着学习成本太高,开发效率比较低,资源消耗很高的问题)。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。可以说Spring是一个提供了更完善开发环境的一个框架,可以为POJO(Plain Ordinary Java Object)对象提供企业级的服务。

Spring的优秀之处:

1、最完善的轻量级核心框架。

2、简化了开发,方便解耦

4、集成了Toplink, Hibernate, JDO, and iBATIS SQL Maps等优秀框架。

5、强大的AOP功能:Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。

6、 方便程序的测试:Spring对Junit4支持,可以通过注解方便的测试Spring程序

这是Spring框架最基础的部分,所有的Spring模块都是在核心容器之上构建的。它提供了依赖注入(DependencyInjection)特征来实现容器对Bean的管理。这里最基本的概念是BeanFactory,它是任何Spring应用的核心。BeanFactory是工厂模式的一个实现,它使用IOC(控制反转)将应用配置和依赖说明从实际的应用代码中分离出来。

核心模块的BeanFactory使Spring成为一个容器,而上下文模块使它成为一个框架。这个模块扩展了BeanFactory的概念,增加了对国际化(I18N)消息、事件传播以及验证的支持(Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息)。

另外,这个模块提供了许多企业服务,例如电子邮件、JNDI访问、EJB集成、远程以及时序调度(scheduling)服务。也包括了对模版框架例如Velocity和FreeMarker集成的支持。

Spring在它的AOP模块中提供了对面向切面编程的丰富支持。这个模块是在Spring应用中实现切面编程的基础。为了确保Spring与其它AOP框架的互用性,Spring的AOP支持基于AOP联盟定义的API。AOP联盟是一个开源项目,它的目标是通过定义一组共同的接口和组件来促进AOP的使用以及不同的AOP实现之间的互用性。通过访问他们的站点,你可以找到关于AOP联盟的更多内容。

Spring的AOP模块也将元数据编程引入了Spring。使用Spring的元数据支持,你可以为你的源代码增加注释,指示Spring在何处以及如何应用切面函数。

使用JDBC经常导致大量的重复代码,取得连接、创建语句、处理结果集,然后关闭连接。Spring的JDBC和DAO模块抽取了这些重复代码,因此你可以保持你的数据库访问代码干净简洁,并且可以防止因关闭数据库资源失败而引起的问题。

这个模块还在几种数据库服务器给出的错误消息之上建立了一个有意义的异常层。使你不用再试图破译神秘的私有的SQL错误消息!

另外,这个模块还使用了Spring的AOP模块为Spring应用中的对象提供了事务管理服务。

对那些更喜欢使用对象/关系映射工具而不是直接使用JDBC的人,Spring提供了ORM模块。Spring并不试图实现它自己的ORM解决方案,而是为几种流行的ORM框架提供了集成方案,包括Hibernate、JDO和iBATIS SQL映射。Spring的事务管理支持这些ORM框架中的每一个也包括JDBC。

Web上下文模块建立于应用上下文模块之上,提供了一个适合于Web应用的上下文。另外,这个模块还提供了一些面向服务支持。例如:实现文件上传的multipart请求,它也提供了Spring和其它Web框架的集成,比如Struts、WebWork。

Spring为构建Web应用提供了一个功能全面的MVC框架。虽然Spring可以很容易地与其它MVC框架集成,例如Struts,但Spring的MVC框架使用IoC对控制逻辑和业务对象提供了完全的分离。

UserService的接口

UserService的实现类

【springboot 入门篇】第3篇 从controller开始学起

在写web项目的时候,controller里的返回值一般分为两种,一种是返回页面,也就是ModeAndView,另一种是直接返回数据,比如json格式的数据。

返回一个页面,我们需要用到一些模板引擎,比如熟知的jsp,模板引擎后面会详细讲解。

返回数据一般会选择返回json数据,我们之前的demo项目中使用的@RestController就是一个返回数据的注解。

spring-boot 支持多种模版引擎包括:

我们在讲前后端分离之前,都会使用Thymeleaf模板引擎,先简单的介绍一下它。

Thymeleaf是一个java类库,它是一个xml/xhtml/html5的模板引擎,可以作为mvc的web应用的view层。

Thymeleaf还提供了额外的木块与spring mvc集成,所以使用ssm框架的也可以使用这个模板引擎。

接下来,我们通过一个项目,来实践一下两种不同的返回结果。

先看一下最终的目录结构:

这里我们使用了Thymeleaf模板引擎来获得后台传来的数据并解析,使用bootstrap框架显示数据。可以看到,Thymeleaf的用法和jsp还是有点像的。可以直接通过${}的形式来获得attribute中的数据。

可以看到,我们成功的在前端获取到了数据。方式就是将数据保存在attribute中,然后再前端页面获取。

我们修改了注解,发现结果变了,直接显示了“index”,是因为@RestController会直接返回数据,而不是渲染页面,所以直接返回了index(这个index,是return语句中的)

访问

获得了json格式的数据

访问

列表也可以直接渲染为json。

访问

访问

会发现这两个都报错了,因为@Controller注解是渲染视图的,而我们返回的是对象或者集合,不能完成正常的渲染。

本文主要讲解了spring boot 如何渲染视图和数据,讲解了@Controller和@RestController的区别与用法。如果有什么疑问,请及时联系我。

我之前写过一个重新认识java系类(还没写完,会写完的。。),篇幅很长,每一篇文章多的有7、8千字,和多人抱怨说看到一半就不想看了,因为太长了,所以 spring boot 这个系类会尽量的短小精悍,每篇文章只讲一个知识点,这样看着不累~

Spring Cloud入门系列-前期准备

在写这一系列的文章之前,觉得很有必要阐述一下什么是Spring Cloud。不像Spring(Spring Framework),大体上能够理解为它是一个管理bean的容器。也不想SpringBoot,可以理解为它是加强版的Spring,集成了SSM和其它一些框架,并且大量支持和推荐注解开发。

但是对于Spring Cloud,它是一个微服务架构的框架, 它不是单独的某个项目,是多个项目的集成 。也就是说如果想学习Spring Cloud,实际上是在 学习多个有关微服务的项目。

所谓微服务呢,就是把原本一站式解决的业务拆分成具体的某个模块,每个模块只做一个事情,然后还顺便衍生出了统一管理这些服务的模块,以及服务的保护措施等模块。归结起来就是5个核心, 服务发现(注册)、负载均衡、断路器、服务网关和分布式配置。

在几个星期前,当我想建一个模块的时候,可能会选择采用 Spring Initializer 来创建,但是最近觉得还是直接建立一个新模块比较舒服。每个人的习惯都不一样,自己怎么舒服怎么来。

下面就演示一下如何利用maven创建一个 module

修改模块名就可以创建想要的模块,这样的好处是能够集成父模块中导入的依赖,相比于 Spring Initializer 会简单多了,因为后者需要手动配置模块的父子关系才可以(或者懂怎么搞的小伙伴也可以留言一手)。

为了更好的学习,首先建立了一个总的工程,同样是用了maven来建立一个项目,建立完后结构如下所示

接下来要做的就是把整个src目录给删掉,因为后续也用不到它;其次就是修改pom文件

各位小伙伴需要修改的第7和第8行的 groupId 和 artifactId 。这样对于必须用的依赖,可以在根模块中,也就是该pom文件声明即可。比如上面的 spring-boot-starter-web 在所有的子模块中都有整个依赖。

甚至如果足够懒,那你完全可以把所有的依赖都写在父模块中,这样后续建立子模块的过程中就可以不管pom文件了。

Spring IOC核心功能快速入门

IOC: 控制反转,是一种理论,概念,思想。把对象的创建,赋值,管理工作交给代码之外的容器实现,也就是对象的创建是由其他的外部资源完成。

Spring 容器是 Spring 框架的核心。容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁。Spring 容器使用依赖注入(DI)来管理组成一个应用程序的组件,这些对象被称为 Spring Beans。

通过阅读配置元数据提供的指令,容器知道对哪些对象进行实例化,配置和组装。配置元数据可以通过 XML,Java 注释或 Java 代码来表示。 Spring IoC 容器利用 Java 的 POJO 类和配置元数据来生成完全配置和可执行的系统或应用程序。

IOC 容器具有依赖注入功能的容器,它可以创建对象,IOC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实例,控制权由程序员控制,而"控制反转"是指new实例工作不由程序员来做而是交给Spring容器来做。在Spring中BeanFactory是IOC容器的实际代表者。

使用IoC的目的:减少对代码的改动,也能实现不同功能。实现解耦合。

第一步:创建一个Maven工程

导入Spring和junit依赖到pom.xml中:

第二步:创建一个接口

第三步:创建接口实现类

第四步:在resource资源文件目录下创建application.xml文件

第五步:创建测试类

Spring框架的核心功能之一就是通过依赖注入的方式来管理Bean之间的依赖关系。在spring的XML配置文件中,给java对象的属性赋值。DI注入:创建对象,给属性赋值。

当容器调用一个无参的构造函数或一个无参的静态 factory 方法来初始化你的 bean 后,通过容器在你的 bean 上调用设值函数,基于设值函数的 DI 就完成了。

第一步:创建一个实体类

第二步:在resource目录下编写application.xml文件

第三步:编写测试类

构造注入:

当容器调用带有一组参数的类构造函数时,基于构造函数的 DI 就完成了,其中每个参数代表一个对其他类的依赖。

第一步:创建实体类

第二步:在resource目录下编写application.xml文件

第三步:编写测试类

注入内部 Beans:

Java 内部类是在其他类的范围内被定义的,同理,inner beans 是在其他 bean 的范围内定义的 bean。因此 或 元素中的 元素称为内部bean。

内部 Bean 的定义不需要指定 id 和 name 。如果指定了,容器也不会将其作为区分 Bean 的标识符,反而会无视内部 Bean 的 scope 属性。所以内部 Bean 总是匿名的,而且总是随着外部 Bean 创建。

第一步:创建实体类

第二步:在resource目录下编写application.xml文件

第三步:编写测试类

第一步:创建实体类

第二步:在resource目录下编写application.xml文件

第三步:创建测试类

注入Bean引用:

注入 null 和空字符串的值:

自动装配就是指 Spring 容器在不使用 和 标签的情况下,可以自动装配(autowire)相互协作的 Bean 之间的关联关系,将一个 Bean 注入其他 Bean 的 Property 中。

下列自动装配模式,它们可用于指示 Spring 容器为来使用自动装配进行依赖注入。你可以使用 元素的 autowire 属性为一个 bean 定义指定自动装配模式。

当自动装配始终在同一个项目中使用时,它的效果最好。如果通常不使用自动装配,它可能会使开发人员混淆的使用它来连接只有一个或两个 bean 定义。不过,自动装配可以显著减少需要指定的属性或构造器参数,但你应该在使用它们之前考虑到自动装配的局限性和缺点。

第一步:创建实体类

第二步:在resource目录下编写application.xml文件

第三步:创建测试类

ByType:

这种模式由属性类型指定自动装配。Spring 容器看作 beans,在 XML 配置文件中 beans 的 autowire 属性设置为 byType。然后,如果它的 type 恰好与配置文件中 beans 名称中的一个相匹配,它将尝试匹配和连接它的属性。如果找到匹配项,它将注入这些 beans,否则,它将抛出异常。

第一步:创建实体类

第二步:在resource目录下编写application.xml文件

第三步:创建测试类

由构造函数自动装配

这种模式与 byType 非常相似,但它应用于构造器参数。Spring 容器看作 beans,在 XML 配置文件中 beans 的 autowire 属性设置为 constructor。然后,它尝试把它的构造函数的参数与配置文件中 beans 名称中的一个进行匹配和连线。如果找到匹配项,它会注入这些 bean,否则,它会抛出异常。

通过spring的注解完成Java对象的创建,属性的赋值。代替xml文件

在 XML 注入之前进行注解注入,因此后者的配置将通过两种方式的属性连线被前者重写。

注解连线在默认情况下在 Spring 容器中不打开。因此,在可以使用基于注解的连线之前,我们将需要在我们的 Spring 配置文件中启用它。所以如果你想在 Spring 应用程序中使用的任何注解,可以考虑到下面的配置文件。

1)@Component

可以使用此注解描述 Spring 中的 Bean,但它是一个泛化的概念,仅仅表示一个组件(Bean),并且可以作用在任何层次。使用时只需将该注解标注在相应类上即可。

2)@Repository

用于将数据访问层(DAO层)的类标识为 Spring 中的 Bean,其功能与 @Component 相同。

3)@Service

通常作用在业务层(Service 层),用于将业务层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。

4)@Controller

通常作用在控制层(如 Struts2 的 Action、SpringMVC 的 Controller),用于将控制层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。

5)@Autowired

可以应用到 Bean 的属性变量、属性的 setter 方法、非 setter 方法及构造函数等,配合对应的注解处理器完成 Bean 的自动配置工作。默认按照 Bean 的类型进行装配。

6)@Resource

作用与 Autowired 相同,区别在于 @Autowired 默认按照 Bean 类型装配,而 @Resource 默认按照 Bean 实例名称进行装配。

@Resource 中有两个重要属性:name 和 type。

Spring 将 name 属性解析为 Bean 的实例名称,type 属性解析为 Bean 的实例类型。如果指定 name 属性,则按实例名称进行装配;如果指定 type 属性,则按 Bean 类型进行装配。如果都不指定,则先按 Bean 实例名称装配,如果不能匹配,则再按照 Bean 类型进行装配;如果都无法匹配,则抛出 NoSuchBeanDefinitionException 异常。

7)@Qualifier

与 @Autowired 注解配合使用,会将默认的按 Bean 类型装配修改为按 Bean 的实例名称装配,Bean 的实例名称由 @Qualifier 注解的参数指定。

第一步:创建实体类

第二步:在resource目录下编写application.xml文件

第三步:创建测试类

扫描多个包:

第一步:创建实体类

第二步:xml配置文件

properties配置文件

第三步:编写测试类

原文链接:

一个项目中使用多个数据源的需求,我们在日常工作中时常会遇到。

以商城系统为例,有一个 MySQL 的数据库负责存储交易数据。公司还有一套 ERP 企业信息化管理系统,要求订单信息同步录入 ERP 数据库,便于公司统一管理,而该 ERP 系统采用的数据库为 SQL Server 。

此时,就可以在 Spring Boot 项目中配置多个数据源。另外,使用多数据源后,需要采用分布式事务来保持数据的完整性。

本小节我们使用 Spring Boot 开发一个商城系统的订单生成功能,订单信息同时进入 MySQL 与 SQL Server 数据库。

首先创建 MySQL 数据库 shop ,并新建订单表 order ,表结构如下:

order 表结构

然后创建 SQL Server 数据库 erpshop ,并新建订单表 erp_order ,表结构如下。注意 id 是自增长的唯一标识,out_id 是对应订单在 MySQL 数据库中的唯一标识,以便在两个库中比对订单。

erp_order 结构

接下来,我们开始实现 Spring Boot 后端项目,数据持久层采用 MyBatis 框架,同时访问两个数据源。

Spring Boot 版本选择 2.2.5 ,Group 为 com.imooc , Artifact 为 spring-boot-multidb,生成项目后导入 Eclipse 开发环境。

我们引入热部署依赖、 Web 依赖、数据库访问相关依赖及测试相关依赖,具体如下:

实例:

由于我们要同时访问两个数据库,所以需要在配置文件中添加两个数据源的配置信息。注意配置多数据源时, url 配置需要使用 spring.datasource.db1.jdbc-url=xxx 的形式。

实例:

多个数据源的情况下, 我们需要通过配置类,将数据源注册为组件放入 Spring 容器中。

实例:

通过这个配置类, Spring 容器中就有两个数据源组件,这两个组件分别采用 spring.datasource.db1 和 spring.datasource.db2 开头的配置信息。所以通过这两个组件,就能分别操作 MySQL 数据源 1 和 SQL Sever 数据源 2 。

多数据源情况下, MyBatis 中的关键组件 SqlSessionFactory 和 SqlSessionTemplate 也需要单独配置,我们需要为两个数据源分别配置一套组件。

实例:

通过上面的配置类, com.imooc.springbootmultidb.mapper1 包中的 DAO 数据访问接口会自动调用 sqlSessionTemplate1 组件实现具体数据库操作,而 sqlSessionTemplate1 操作的数据源已经通过配置类设置为 db1 。同时, DAO 数据访问接口对应的映射文件已经指定到 classpath:mapper1/ 目录去寻找。这样数据源 – DAO 数据访问接口 – 映射文件三者的对应关系就建立起来了。

数据源 2 的配置方法是一样的, com.imooc.springbootmultidb.mapper2 包中的 DAO 数据访问接口会自动调用 sqlSessionTemplate2 组件,其操作的数据源即为 db2 ,其对应的映射文件指定到 classpath:mapper2/ 目录去寻找。

实例:

数据访问接口的位置已经在配置类指定,首先在 com.imooc.springbootmultidb.mapper1 创建 OrderDao ,操作的是数据源 1 中的 order 表。

实例:

然后在 com.imooc.springbootmultidb.mapper2 创建 ErpOrderDao ,操作的是数据源 2 中的 erporder 表。

实例:

这两个接口中使用的数据对象比较简单,代码如下:

实例:

分别针对 OrderDao 、 ErpOrderDao 编写对应的映射文件,然后按照配置类指定的位置,两个文件分别放到 resources/mapper1 和 resources/mapper2 目录下。

实例:

实例:

数据操作接口与对应的映射文件均已编写完毕,现在可以通过测试类进行多数据源测试了,我们在测试类中同时向两个库插入记录。

实例:

运行测试方法后,两个数据库表中均新增数据成功,这样我们就成功的使用 Spring Boot 同时操作了两个数据源。

采用多数据源之后,事务的实现方式也随之发生变化。当某个数据源操作出现异常时,该数据源和其他数据源的事务都需要回滚。这种涉及多个数据源的事务,称为分布式事务,接来下我们就来具体实现一下。

在 pom.xml 引入 Atomikos 事务管理器相关的依赖项, Atomikos 是一个开源的事务管理器,支持分布式事务。

实例:

需要将默认的数据源更换为支持分布式事务的数据源, MySQL 对应的数据源为 MysqlXADataSource , SQL Server 对应的数据源为 SQLServerXADataSource 。

实例:

继续修改 DataSourceConfig 类,在其中配置分布式事务管理器组件。当项目中使用事务时,会通过配置的分布式事务管理器管理分布式事务操作。

实例:

在测试方法上添加 @Transactional 开启事务,然后在两个数据源操作中间模拟抛出异常。

实例:

此时运行测试类,可以发现数据源 1 的事务已回滚,验证成功!

在开发 Spring Boot 项目时,如果默认配置满足不了我们的需求,可以通过手工配置组件实现我们需要的功能。这些组件可能是各个公司提供的,我们根据相应文档,为其配置各个属性即可。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至836084111@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息