《深入浅出Spring Boot2.x》读书笔记【第2-3章】

第二章 开发环境搭建和基本开发

2.1 搭建Spring Boot开发环境

根据自己的需要选择对应的starter进行依赖,后期可以修改

pom.xml会自动配置到你选中的starter依赖

2.2 Spring Boot的依赖和自动配置

为什么它能在很少的配置下就能够运行?

因为Spring Boot通过Maven依赖找到对应的jar包和嵌入的服务器,然后使用默认自动配置来创建默认的开发环境。

2.3 使用自定义配置

Spring Boot参数配置优先级

  • 命令行参数

  • 来自java:comp/env的JNDI 属性

  • Java系统属性(System.getProperties())

  • 操作系统环境变量

  • RandomValuePropertySource配置的random.*属性值

  • jar包外部的application-{profile}.properties 或 application.yml(带spring.profile)配置文件

  • jar包内部的application-{profile}.properties 或 application.yml(带spring.profile)配置文件

  • jar包外部的application.properties 或 application.yml(不带spring.profile)配置文件

  • jar包内部的application.properties 或 application.yml(不带spring.profile)配置文件

  • @Configuration注解类上的@PropertySource

  • 通过SpringApplication.setDefaultProperties指定的默认属性

    【事实上,yml文件的配置与properties文件只是简写和缩进的区别,差异并不大】

2.4 开发自己的Spring Boot 项目

Spring MVC的视图解析器——定位视图

最常用的视图是JSP

  • 在Maven的pom.xml中假如JSP和JSTL的依赖
  • 配置视图解析器(ViewResolver),修改application.properties
    • spring.nvc.view.prefix 视图前缀
    • spring.mvc.view.suffix 后缀配置
    • 前缀后缀之间还差一个文件名称,在Spring MVC中,名称由Controller控制器给出

第三章 全注解下的Spring IoC

IoC是一种通过描述来生成或者获取对象的计数。

一个系统可以生成各种对象,并且这些对象之间并不是孤立的,它们之间还可能存在依赖的关系,为了进行管理,我们需要一个容器。

在Spring中把每一个需要管理的对象称为Bean,而管理这些Bean的容器叫做IoC容器。

IoC容器需要具备两个基本功能:

  • 通过描述管理Bean,包括发布和获取Bean
  • 通过描述完成Bean之间的依赖关系

3.1 IoC容器简介

在Spring的定义中,要求所有的IoC容器都需要实现接口BeanFactory

  • BeanFactory源码中,有个getBean方法,它是IoC容器最重要的方法之一,它的意义是从IoC容器中获取Bean。
  • isSingleton方法是判断Bean是否在IoC中为单例。
  • 在IoC容器中,默认情况下,Bean都是以单例存在的,也就是使用getBean方法返回的都是同一个对象。
  • 与isSingleton方法相反的是isPrototype方法,如果它返回的是true,那么当getBean获取Bean的时候,IoC容器会创建一个新的Bean返回给被调用者。

ApplicationContext是BeanFactory的子接口,从下图可以看到,它是通过继承上级接口,进而继承BeanFactory接口,同时还扩展了很多接口,因此它的功能会更强大。

IoC容器接口设计

在Spring Boot中主要是用注解装配Bean到IoC容器中。

AnnotationConfigApplicationContext——基于注解的IoC容器

3.2 装配Bean

通过扫描装配Bean

使用注解@Bean一个个的注入很麻烦,所以我们可以进行扫描装配

@Component 标明哪个类被扫描进入Spring IoC容器

@ComponentScan 标明采用何种策略去扫描装配Bean(可以扫描指定包并排除对应类)

自定义第三方Bean

@Bean 注解

例如,要引入一个DBCP数据源,需要先在pom.xml上加入项目所需要的DBCP包和数据库驱动程序的依赖,接着将使用它提供的机制来生成数据源。

3.3 依赖注入(DI)

这是上文提及的IoC的第二个作用。

例如,人类有时利用动物去完成一些事情,比如用狗看门、用猫抓老鼠,于是做一些事就依赖于不同的动物了。

3.3.1 注解@Autowired

这是使用最多的注解之一,它注入的机制最基本的一条是根据类型(by type)。

@Autowired提供的规则是:首先根据类型找到对应的Bean,如果对应类型的Bean不是唯一的,那么它就会根据属性名称和Bean的名称进行匹配。如果匹配得上,就会使用该Bean;如果无法匹配,就会抛出异常。

注意:@Autowired是一个默认必须找到对应Bean的注解,如果不能确定标注属性一定会存在并且允许这个被标注的属性为null,那么可以配置@Autowired属性required为false。

3.3.2 消除歧义性——@Primary和@Qualifier

上节使用@Autowired会产生歧义性,为了解决这个问题,引入本节两个注解。

@Primary

是一个修改优先权的注解。当发现有多个同样类型的Bean时,IoC容器会优先使用被@Primary注解的Bean注入。

然而,当@Primary使用在多个类上时,IoC容器无法区分采用哪个Bean的实例进行注入,这时我们需要更加灵活的机制来实现注入。

@Qualifier

@Qualifier可以实现上述问题。它的配置项value需要一个字符串定义,它将与@Autowired组合在一起,通过类型和名称一起找到Bean(Bean名称在IoC容器中是唯一的标识),这样就可以消除歧义性了。

3.3.3 带有参数的构造方法类的装配

使用@Autowired注解对构造方法的参数进行注入。

@Component
public class BussinessPerson implements Person{
    
    private Animal animal = null; //属性
    
    public BussinessPerson(@Autowired @Qualifier("dog") Animal animal){ //参数
        this.animal = animal;
    }
    
    @Override
    public void service(){
        this.animal.use();
    }
    
    @Override
    public void setAnimal(Animal animal){ //方法
        this.animal = animal;
    }
}

可以看到,代码中取消了@Autowired对属性和方法的标注,而是在参数上加入了@Autowired和@Qualifier注解。

3.4 Bean 生命周期

它大致分为Bean的定义、Bean的初始化、Bean生存期和Bean的销毁四个部分。

Bean的定义

  • 资源定位并将Bean的定义发布到IoC容器
    • Spring通过我们的配置,比如@ConponmentScan定义的扫描路径去找到带有@Conponent的类
    • 找打资源后开始解析,并且将定义的信息保存起来
    • 把Bean的定义发布到Spring IoC容器中

Bean的初始化

  • 实例化:创建Bean的实例对象
  • 依赖注入
  • 调用set方法

Bean生存期

Bean的销毁

  • 通过构造方法创建bean实例(无参构造);
  • 为bean的属性设置值和对其它bean引用(调用set方法);
  • 把bean实例传递bean后置处理器的方法postProcessBeforeInitialization;
  • 调用bean的初始化方法(需要进行配置初始化的方法);
  • 把bean实例传递bean后置处理的方法postProcessAfterInitialization;
  • bean可以使用了(对象获取到了);
  • 当容器关闭的时候,调用bean的销毁的方法(需要进行配置销毁的方法)。

​ 【如果没有配置后置处理器,bean的生命周期将没有3和5】

3.5 使用属性文件

先在Maven配置中加载依赖,再直接使用aoolication.properties文件。

  • @value注解:使用${…}这样的占位符读取配置在属性文件的内容。它既可以加载属性,也可以加在方法上

  • @ConfigurationProperties注解,通过它使得配置文件减少。比如

    @ConfigurationProperties("database")
    

    这里在注解@ConfigurationProperties中配置字符串database,将与POJO的属性名称组成属性的全限定名去配置文件里查找,这样就能将对应的属性读入到POJO中。

  • @PropertySource 将properties配置文件中的值存储到Spring的 Environment中,Environment接口提供方法去读取配置文件中的值,参数是properties文件中定义的key值,可配合以上两个注解使用。

3.6 条件装配Bean

背景:有时候因为客观因素Bean无法进行初始化

@Conditional注解:配合Conditon接口

3.7 Bean的作用域

1)singleton

单例模式,使用 singleton 定义的 Bean 在 Spring 容器中只有一个实例,这也是 Bean 默认的作用域。

2)prototype

原型模式,每次通过 Spring 容器获取 prototype 定义的 Bean 时,容器都将创建一个新的 Bean 实例。

3)request

在一次 HTTP 请求中,容器会返回该 Bean 的同一个实例。而对不同的 HTTP 请求,会返回不同的实例,该作用域仅在当前 HTTP Request 内有效。

4)session

在一次 HTTP Session 中,容器会返回该 Bean 的同一个实例。而对不同的 HTTP 请求,会返回不同的实例,该作用域仅在当前 HTTP Session 内有效。

5)global Session

在一个全局的 HTTP Session 中,容器会返回该 Bean 的同一个实例。该作用域仅在使用 portlet context 时有效。

3.8 使用@Profile

在企业开发的过程中,项目往往要面临开发环境、测试环境、准生产环境和生产环境的切换,而每一套环境的上下文是不一样的,这时可以使用@Profile注解,可以方便地实现各个环境之间的切换。

对于属性配置(properties)文件而言,在SpringBoot中还存在一个约定,即允许比较方便的切换配置环境。

3.9 引入XML配置Bean

@ImportResource注解:通过它可以引入对应的XML文件来加载Bean。

3.10 使用Spring EL

使用率不高,略了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值