spring第五版学习笔记

请添加图片描述

第一章

1.1 什么是Spring

Spring的核心是提供了一个容器 (Container),通常称为Spring应用的上下文(Spring application context),它们会创建和管理应用组件。这些组件也可以称为bean,会在Spring应用上下文中装配在一起,从而形成一个完整的应用程序。这就像砖块、砂浆、木材、管道和电线组合在一起,形成一栋房子似的。我们在第4版中可知道我们的应用对象是生存于Spring容器中的。

将bean装配在一起的行为是通过一种基于依赖注入(dependency injection,DI)的模式实现的。此时,组件不会再去创建它所依赖的组件并管理它们的生命周期,使用依赖注入的应用依赖于单独的实体(容器)来创建和维护所有的组件,并将其注入到需要它们的bean中。通常,这是通过构造器参数和属性访问方法来实现的。

举例来说,假设在应用的众多组件中,有两个是我们需要处理的:库存服务(用来获取库存水平)和商品服务(用来提供基本的商品信息)。商品服务需要依赖于库存服务,这样它才能提供商品的完整信息。图1.1阐述这些bean和Spring应用上下文之间的关系。

图1.1 应用组件通过Spring的应用上下文来进行管理并实现互相注入

在核心容器之上,Spring及其一系列的相关库提供了Web框架、各种持久化可选方案、安全框架、与其他系统集成、运行时监控、微服务支持、反应式编程以及众多现代应用开发所需的特性。

讲bean注入到Sprng 容器中可以使用xml文件也可以通过Java配置

方式一:xml文件

该xml文件中描述了两个Bean,CmsSubjectServiceImpl和OmsOrderServiceImpl,并且通过构造器参数将CmsSubjectServiceImpl装配到OmsOrderServiceImpl中。

    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="example1" class="com.macro.mall.service.impl.CmsSubjectServiceImpl"/>
    <bean id="example2" class="com.macro.mall.service.impl.OmsOrderServiceImpl">
        <constructor-arg ref="example1"/>
    </bean>
</beans>

方式二:Java配置

package com.macro.mall.common;

import com.macro.mall.service.impl.CmsSubjectServiceImpl;
import com.macro.mall.service.impl.OmsOrderServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanConfig {
@Bean
public CmsSubjectServiceImpl cmsSubjectService(){
   return new CmsSubjectServiceImpl();
}

@Bean
public OmsOrderServiceImpl omsOrderService(){
   return new OmsOrderServiceImpl(cmsSubjectService());
}

}

其中用的注解

@Configuration注解会告知Spring这是一个配置类,会为Spring应用上下文提供bean。这个配置类的方法使用@Bean注解进行了标注,表明这些方法所返回的对象会以bean的形式添加到Spring的应用上下文中(默认情况下,这些bean所对应的bean ID与定义它们的方法名称是相同的)。

相对于基于XML的配置方式,基于Java的配置会带来多项额外的收益,包括更强的类型安全性以及更好的重构能力。即便如此,不管是使用Java还是使用XML的显式配置,只有当Spring不能进行自动配置的时候才是必要的。

在Spring技术中,自动配置起源于所谓的自动装配(autowiring)和组件扫描(componentscanning)。借助组件扫描技术,Spring能够自动发现应用类路径下的组件,并将它们创建成Spring应用上下文中的bean。借助自动装配技术,Spring能够自动为组件注入它们所依赖的其他bean。

最近,随着Spring Boot的引入,自动配置的能力已经远远超出了组件扫描和自动装配。SpringBoot是Spring框架的扩展,提供了很多增强生产效率的方法。最为大家所熟知的增强方法就是自动配置(autoconfiguration),Spring Boot能够基于类路径中的条目、环境变量和其他因素合理猜测需要配置的组件并将它们装配在一起。

1.2 初始化Spring应用

第五版中使用的是Spring Initializr初始化应用,我直接使用idea来创建的Spring Boot项目

1、创建一个maven项目

2.添加pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
<groupId>SpringBootTest</groupId>
<artifactId>TestDemo</artifactId>
<version>1.0-SNAPSHOT</version>
 
<!--打包为jar包-->
<packaging>jar</packaging>
 
<!--Spring boot 为2.0.4版本-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/>
</parent>
 
<properties>
    <project.build.sourceEncodeing>UTF-8</project.build.sourceEncodeing>
    <project.reportint.outputEncoding>UTF-8</project.reportint.outputEncoding>
</properties>
 
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>htmlunit-driver</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
 
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
</project>

3.创建应用运行类

@SpringBootApplication注解明确表明这是一个Spring Boot应用。但是,@SpringBootApplication远比看上去更强大。@SpringBootApplication是一个组合注解,它组合了3个其他的注解

@SpringBootConfiguration:该注解声明为配置类。尽管这个类目前还没有太多的配置,但是后续我们可以按需添加基于Java的Spring框架配置。这个注解实际上是@Configuration注解的特殊形式。
@EnableAutoConfiguration:启用Spring Boot的自动配置。我们随后会介绍自动配置的更多功能。就现在来说,我们只需要知道这个注解会告诉Spring Boot自动配置它认为我们会用到的组件。
@ComponentScan:启用组件扫描。这样我们能够通过像@Component、@Controller、@Service这样的注解声明其他类,Spring会自动发现它们并将它们注册为Spring应用上下文中的组件。
4。创建一个测试类

@SpringBootTest会告诉JUnit在启动测试的时候要添加上Spring Boot的功能。

注解
启动类注解

@SpringBootApplication注解明确表明这是一个Spring Boot应用,是一个组合注解

@SpringBootConfiguration:将该类声明为配置类,实际上是@Configuration注解的特殊形式

@EnableAutoConfiguration:启用Spring Boot的自动配置

@ComponentScan:启用组件扫描。这样我们能通过像@Compent、@Controller、@Service这样的注解声明其他类,Spring会自动发现它们并将它们注册为Spring应用上下文中的组件

测试类注解

@RunWith(SpringRunner.class)注解:@RunWith是Junit的注解,它会提供一个测试运行器(runner)来指导Junit如何运行测试。可以将其想象为给Junit应用的一个插件,以提供自定义的测试行为。在本例中,为Junit提供的是SpringRunner,这是一个Spring提供的测试运行器,它会创建测试运行所需的Spring应用上下文。

SpringRunner是SpringJUnit4ClassRunner的别名

@SpringBootTest会告诉Junit在启动测试的时候要加上SpringBoot的功能。

@WebMvcTest是Spring Boot所提供的一个特殊测试注解,它会让这个测试在Spring MVC应用的上下文中执行,例如@WebMvcTest(HomeController.class)会将HomeController注册到Spring MVC中,这样就可以在测试类中对它发送请求了

一般注解

修饰类:

Lombok 实战 —— @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

@RequiredArgsConstructor 写在类上可以代替@AutoWired注解,需要注意的是成员变量在注入时需要用final定义或者使用@notnull注解

注解在类上,会生成构造方法(可能带参数也可能不带参数)。

该注解还可以用 @RequiredArgsConstructor(staticName=“methodName”) 的形式生成一个指定名称的静态方法,返回一个调用相应的构造方法产生的对象

@NoArgsContructor 注解在类上,为类提供一个无参的构造方法

当类中有final字段没有被初始化时,编译器会报错,此时可用@NoArgsContructor(force=true),然后就会为没有初始化final字段设置默认值0/false/null

对于具有约束的字段(例如@NonNull字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些无效。

@AllArgsConstructor

注解在类上,为类提供一个全参的构造方法

默认生成的方法是public的,如果要修改方法修饰符可以设置AssessLevel的值

例如:@Getter(access = AccessLevel.PROTECTED)

修饰成员变量:

@NotNull @NotBlank @NutEmpty

@NotEmpty 用在集合类上面加了@NotEmpty的String类、Collection、Map、数组,是不能为null或者长度为0的(String Collection Map的isEmpty()方法)

@NotBlank只用于String,不能为null且trim()之后size>0

@NotNull:不能为null,但可以为empty,没有Size的约束

@Size(min=5,massage=“姓名必须至少5字符,list必须至少五个元素”)

@CreditCardNumber该属性的值必须是合法的信用卡卡号

@Pattern(regexp=)正则表达式校验

@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度

@SessionAttributes注解是Spring MVC中的注解,默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要跨页面使用,那么需要使用到session。而@SessionAttributes注解就可以使用模型中的数据存储一份到session域中。

参数:

1.name:这是一个字符串数组,里面应该写需要存储到session中数据的名称

2.types:根据指定参数的类型,将模型中对应类型的参数存储到session中

3.value:其实和name是一样的。

@ModelAttribute在SpringMVC中使用@ModelAttribute时,应用位置包括应用在方法上,应用在方法的参数上,应用在方法上并且方法也使用了@RequestMapping 详情请看主页@ModelAttribute博客

修饰参数:

@Valid主要是用来校验绑定的参数是否符合预订的要求

了解Spring Boot DevTools
DevTools为Spring开发人员提供了一些便利的开发期工具,其中包括:

代码变更后应用会自动重启;

当面向浏览器的资源(如模板、JavaScript、样式表)等发生变化时,会自动刷新浏览器;

自动禁用模板缓存;

如果使用H2数据库的话,内置了H2控制台

DevTools并不是插件,它也不需要使用特定的IDE

详解以上四点:

①当DevTools运行的时候,应用程序会被加载到Java虚拟机两个独立的类加载器中,其中一个类加载器会加载你的Java代码、属性文件以及项目中“src/main"路径下几乎所有的内容。另外一个类加载器会加载依赖的哭,这些库不太可能经常发生变化。

当探测到变更时,DevTools只会重新加载包含项目代码的类加载器并重启Spring应用上下文,在这个过程中另一个类加载器会原封不动,减少了应用启动时间。

不足之处就是自动重启无法反映依赖项的变化。也就是当我们添加、变更或移除依赖的时候为了让变更生效,我们需要重新启动应用

②模板方案在配置时会缓存模板解析的结果,在每个请求提供服务的时候,模板就不用重新解析了。在生产环境中,这是一个很好的方式可以带来一些性能收益。

在开发期,缓存模板就不太好。因为在应用运行的时候,如果缓存模板,那么我们刷新浏览器就无法看到模板变更的效果了,即便我们对模板做了修改,在重启应用之前,缓存的模板依然有效。

DevTools通过禁用所有模板缓存就解决了这个问题,对模板进行任意数量修改之后只需要刷新一下浏览器就可以看到效果

③如果使用H2数据库进行开发,DevTools将会自动启用H2。我们可以通过Web浏览器进行访问

小结

Spring旨在简化开发人员开发难度,比如创建Web应用程序、处理数据库、保护应用程序以及实现微服务

SpringBoot构建在Spring之上,通过简化依赖管理、自动配置和运行时洞察、使Spring更加以用

在Spring应上下文中,组件(bean)既可以使用Java或XML显式声明也可以通过组件扫描发现还可以使用Spring Boot自动配置功能实现自动化配置

使用Spring Data JPA持久化数据
Spring Data JPA是一个非常大的伞形项目,由多个子项目组成,其中大多数子项目都关注对不同数据库类型进行数据持久化。比较流行的几个Spring Data项目包括:

Spring Data JPA:基于关系型数据库进行JPA持久化

Spring Data MongoDB:持久化到Mongo文档数据库

Spring Data Neo4j:持久化到Neo4j图数据库

Spring Data Redies:持久化到Redies key-value存储

Spring Data Cassandra:持久化到Cassandra数据库

第二章

  1. 开发web 应用
    2.1 展现信息
    在Spring Web应用中,获取和处理数据是控制器的任务,而将数据渲染到HTML中的并在浏览器中展现的则是视图的任务,为了支撑taco的创建页面,我们需要构建如下组件。

用来定义taco配料属性的领域类
用来获取配料信息并将其传递至视图的SpringMVC 控制器类。
用来在用户的浏览器中渲染配料列表的视图模板
2.1.1 构建领域类
程序清单 2.1 定义taco配料

package sia.tacocloud.entity;

import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Required;

@Data
@RequiredArgsConstructor
public class Ingredient {
    private final String id;
    private final String name;
    private final Type type;
    public static enum Type{
        WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
    }
}

@Data:生成所有缺失的方法。
@NoArgsConstructor : 生成一个无参数的构造方法,这个annotation在与其他的annotation配合起来使用的时候更加能凸显出他的重要性,例如在使用hibernate这种框架的时候,如果有一个有参数的构造方法的时候,NoArgsConstructor会展示出他的作用。

@RequiredArgsConstructor: 会生成一个包含常量,和标识了NotNull的变量 的构造方法。生成的构造方法是private,如何想要对外提供使用可以使用staticName选项生成一个static方法。

@AllArgsContructor: 会生成一个包含所有变量,同时如果变量使用了NotNull annotation , 会进行是否为空的校验。

<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值