011、谈谈 Spring 中都用到了哪些设计模式?

  • 工厂模式:Spring 使用工厂模式通过 BeanFactoryApplicationContext 创建 bean 对象。
  • 代理模式:Spring AOP 通过动态代理实现。
  • 单例模式:Spring 中的 Bean 默认都是单例的。
  • 模板模式:Spring 中 jdbcTemplatehibernateTemplate 等以 Template 结尾的对数据库操作的类都使用到了模板模式。
  • 适配器模式:Spring MVC 中用适配器模式适配 Controller

012、Spring 中管理事务的方式有几种?

  1. 编程式事务,在代码中硬编写,不推荐使用。
  2. 声明式事务,在配置文件中进行配置,推荐使用。

声明式事务可分为两种:基于 XML 的声明式事务基于注解的声明式事务

013、Spring 中事务隔离级别有哪几种?

  • TransactionDefinition.ISOLATION_DEFAULT:使用数据库默认的隔离级别,MySQL 默认采用的 REPEATABLE_READ 隔离级别。
  • TransactionDefinition.ISOLATION_READ_UNCOMMITTED:允许读取还有变更未提交的数据,可能会导致脏读、幻读或不可重复读
  • TransactionDefinition.ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
  • TransactionDefinition.ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被当前事务自己所修改的,可以阻止脏读和不可重复读,但幻读仍有可能发生
  • TransactionDefinition.ISOLATION_SERIALIZABLE:完全服从 ACID 的隔离级别,所有的事务逐个执行,这样事务之间就完全不可能产生干扰,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能,通常情况下也不会用到该级别。

014、Spring 中事务有哪几种传播行为?

支持当前事务的情况

  • TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)

不支持当前事务的情况

  • TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

其他情况

  • TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 TransactionDefinition.PROPAGATION_REQUIRED。

015、@Transactional(rollbackFor = Exception.class)注解了解吗?

@Transactional 注解作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,当然,我们也可以在方法级别使用该注解来覆盖类级别的定义。如果类或者方法加了这个注解,那么这个类里面的方法抛出异常就会回滚,数据库里面的数据也会回滚。

Exception 分为运行时异常 RuntimeException 和非运行时异常,在 @Transactional 注解中如果不配置 rollbackFor 属性,那么事务只会在遇到 RuntimeException 的时候才会回滚,加上 rollbackFor=Exception.class,可以让事务在遇到非运行时异常时也回滚。

016、Spring 中如何读取配置文件?

  1. @value:直接在属性上加上 @Value("${配置文件中定义的名字}")
// application.yml 中定义如下
itming: 天下无敌

// Java 代码中使用如下
@Value("${itming}")
String itming;
  1. @ConfigurationProperties
// application.yml 中定义如下
library:
  location: 湖北武汉加油中国加油
  books:
    - name: 天才基本法
      description: 二十二岁的林朝夕在父亲确诊阿尔茨海默病这天,得知自己暗恋多年的校园男神裴之即将出国深造的消息——对方考取的学校,恰是父亲当年为她放弃的那所。
    - name: 时间的秩序
      description: 为什么我们记得过去,而非未来?时间“流逝”意味着什么?是我们存在于时间之内,还是时间存在于我们之中?卡洛·罗韦利用诗意的文字,邀请我们思考这一亘古难题——时间的本质。
    - name: 了不起的我
      description: 如何养成一个新习惯?如何让心智变得更成熟?如何拥有高质量的关系? 如何走出人生的艰难时刻?
     
// Java 代码中使用如下
@Component
@ConfigurationProperties(prefix = "library")
@Data
class LibraryProperties {
    private String location;
    private List<Book> books;

    @Data
    static class Book {
        String name;
        String description;
    }
}
  1. @PropertySource:可以读取指定的配置文件
@Component
@PropertySource("classpath:website.properties")
@Data
class WebSite {
    @Value("${url}")
    private String url;
}

详细使用方法请参考:https://snailclimb.gitee.io/springboot-guide/#/./docs/basis/read-config-properties

017、Spring 加载配置文件的优先级?

优先级从高到低依次是:根目录 config 文件夹内的配置文件、resources 目录 config 文件夹内的配置文件、resources 目录下的配置文件

spring默认有RedisTemplate对象 spring默认的是什么模式_自动装配

018、什么是 Spring Boot Starters?

Spring Boot Starters 是一系列依赖关系的集合,因为它的存在,项目的依赖之间的关系对我们来说变的更加简单了。

举个例子:在没有 Spring Boot Starters 之前,在开发 REST 服务或 Web 应用程序时,我们需要使用像 Spring MVC,Tomcat 和 Jackson 这样的库,这些依赖我们需要手动一个一个添加。但是,有了 Spring Boot Starters 我们只需要添加 spring-boot-starter-web 这一个依赖就可以了,这个依赖中包含了我们开发 REST 服务需要的所有依赖。

019、介绍一下 @SpringBootApplication 注解?

@SpringBootApplication 是一个组合注解,主要包含以下三个注解:

  • @SpringBootConfiguration:实际上和 @Configuration 注解是一样的,允许在上下文中注册额外的 bean 或导入其他配置类。
  • @EnableAutoConfiguration:用来开启自动化配置。
  • @ComponentScan:默认扫描当前类所在的包下的所有类,检测到被 @Component 注解的类会将其装配到 bean 容器中。

020、Spring Boot 的自动装配是如何实现的?

首先我们要明白什么是自动装配?

Spring Boot 定义了一套标准,对于外部 jar 包来说,只需要按照 Spring Boot 定义的标准,就能将自己的功能装置进 Spring Boot,而我们在使用的时候只需要通过注解或者一些简单的配置就能在 Spring Boot 的帮助下实现某块功能。

那自动装配的原理是什么呢?

自动装配实现的关键是 @EnableAutoConfiguration 注解,这个注解是用来开启自动装配的,这个注解内部通过 Spring 提供的 @Import 注解导入了 AutoConfigurationImportSelector 类,这个类就是实现自动装配的核心。

AutoConfigurationImportSelector 类中 getCandidateConfigurations 方法会将所有自动配置类的信息以 List 的形式返回,自动配置类是非常多的,但并不是每个都会生效,只有满足 @Conditional 及其衍生注解中的所有条件的类才会生效。