公告

👇微信扫码添加好友👇

图片
Skip to content

12-31 ​

Spring Boot 如何配置多个数据源? ​

SpringBoot 可以通过 @ConfigurationProperties 注解来配置多个数据源,该注解可以用在类上,也可以用在方法上。

java
@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.one")
    public DataSource dataSourceOne() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.two")
    public DataSource dataSourceTwo() {
        return DataSourceBuilder.create().build();
    }
}
properties
spring.datasource.one.url=jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
spring.datasource.one.username=root
spring.datasource.one.password=root
spring.datasource.one.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.two.url=jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
spring.datasource.two.username=root
spring.datasource.two.password=root
spring.datasource.two.driver-class-name=com.mysql.cj.jdbc.Driver

12-30 ​

Spring Boot 如何定义不同环境配置? ​

SpringBoot 可以通过 application-{profile}.properties 或者 application-{profile}.yml 文件来定义不同环境配置。

配置可以通过 spring.profiles.active 属性来指定,也可以通过 SPRING_PROFILES_ACTIVE 环境变量来指定。

也可以在 maven 的 pom.xml 文件中指定,如下:

xml
<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <activatedProperties>dev</activatedProperties>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <activatedProperties>prod</activatedProperties>
        </properties>
    </profile>
</profiles>

12-29 ​

Spring Boot 配置加载顺序是怎样的? ​

SpringBoot 配置加载顺序是从外向内,从内向外,优先级从高到低。

  • 从外向内:SpringBoot 会从 application.properties 或者 application.yml 文件中加载配置。
  • 从内向外:SpringBoot 会从 @PropertySource 注解中加载配置。

优先级:

  1. 命令行参数。
  2. 系统环境变量。
  3. @PropertySource 注解中的配置。
  4. application.properties 或者 application.yml 文件中的配置。

12-28 ​

Spring Boot 有哪几种热部署方式? ​

SpringBoot 有两种热部署方式,分别是 devtools 和 springloaded。

  • devtools:devtools 是 SpringBoot 提供的一种热部署方式,可以实现代码修改后自动重启应用程序。
  • springloaded:springloaded 是 SpringBoot 提供的一种热部署方式,可以实现代码修改后自动重载应用程序。

12-27 ​

Spring Boot 怎么注册 Servlet? ​

SpringBoot 可以通过 @ServletComponentScan 注解来注册 Servlet,该注解可以用在类上,也可以用在方法上。

12-26 ​

Spring Boot 中的 Starters 是什么? ​

SpringBoot 中的 Starters 是一组依赖项的集合,可以通过引入 Starters 来快速构建 Spring 应用程序。

12-25 ​

SpringBoot 如何开启自动注解? ​

SpringBoot 可以通过 @EnableAutoConfiguration 注解来开启自动注解,该注解可以用在类上,也可以用在方法上。

由于 @SpringBootApplication 注解包含了 @EnableAutoConfiguration 注解,所以一般情况下不需要再使用 @EnableAutoConfiguration 注解。

12-24 ​

Spring Boot 自动配置原理是什么? ​

SpringBoot 自动配置原理是基于 Spring 的条件注解实现的,SpringBoot 会根据条件注解的条件判断是否需要自动配置。

如下:

java
// 使用 ChatGPT 生成

// 这是一个Spring Boot自动配置类,用于配置数据源(DataSource)。
@Configuration
// 当类路径中存在DataSource类时,才会启用这个配置类。
@ConditionalOnClass({DataSource.class})
// 启用对DataSourceProperties类的配置属性支持。
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {

    // 定义一个名为dataSource的Bean。
    @Bean
    // 当容器中不存在同名的Bean时才会创建。
    @ConditionalOnMissingBean
    public DataSource dataSource(DataSourceProperties properties) {
        // 调用DataSourceProperties的initializeDataSourceBuilder方法创建并返回一个数据源。
        return properties.initializeDataSourceBuilder().build();
    }
}

12-23 ​

Spring Boot 中的默认内嵌容器是? ​

SpringBoot 默认内嵌容器是 Tomcat,但是也支持其他内嵌容器,比如 Jetty、Undertow 等。

12-22 ​

什么是 restful? ​

restful 是一种软件架构风格,它是一种设计风格而不是标准,它提供了一组设计原则和约束条件,主要用于客户端和服务器之间的通信。

12-21 ​

SpringBoot 如何提供网络服务? ​

SpringBoot 可以通过 @RestController 注解来提供网络服务,该注解可以用在类上,也可以用在方法上。

java
@RestController
public class MyController {

    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

12-20 ​

SpringBoot 怎么解决跨域问题? ​

可以通过@CrossOrigin 注解来解决跨域问题,该注解可以用在类上,也可以用在方法上。也可以通过 WebMvcConfigurer 接口来配置跨域。

java
@RestController 
@CrossOrigin
public class MyController {

    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}
java
@Configuration
public class MyConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedHeaders("*")
                .allowedMethods("*")
                .allowedOrigins("*");
    }
}

12-19 ​

SpringBoot 怎么根据指定条件注册 bean? ​

SpringBoot 可以通过 @Conditional 注解来根据指定条件注册 bean,该注解可以用在类上,也可以用在方法上。

java
@Configuration
public class MyConfig {

    @Bean
    @Conditional(MyCondition.class)
    public MyBean myBean() {
        return new MyBean();
    }
}
java
public class MyCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return true;
    }
}

12-18 ​

什么是模板引擎? ​

模板引擎是一种将模板和数据结合起来生成 html 文档的工具,模板引擎可以将模板和数据结合起来生成 html 文档,然后将 html 文档返回给浏览器。

常见的模板引擎有:Freemarker、Thymeleaf、Velocity 等。

12-18 ​

Spring Boot 如何配置随机端口? ​

SpringBoot 可以通过 server.port=0 来配置随机端口,也可以通过 server.port=${random.int(1024,65535)} 来配置随机端口。

12-17 ​

Spring Boot 有哪几种运行方式? ​

SpringBoot 有三种运行方式,分别是打包运行、命令行运行和 Maven 插件运行。

12-16 ​

为什么要用 SpringBoot? ​

SpringBoot 可以快速构建 Spring 应用程序,快速整合其他框架。并实现了对 Spring 的自动配置,且内置 Tomcat 应用服务器,能够简化 Spring 应用程序的初始搭建和开发过程。

12-15 ​

Spring Boot 支持哪些日志框架? ​

SpringBoot 默认日志框架为 Logback,但是也支持其他日志框架,比如 Log4j、Log4j2、JUL(java.util.logging)和 Logback。

12-14 ​

SpringBootApplication 由哪些注解组成? ​

@SpringBootApplication 注解源码如下:

java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
    ......
}

该注解由 @SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan 注解组成。

  • @SpringBootConfiguration 注解标识一个配置类,该注解继承自 @Configuration 注解,用于定义配置类。
  • @EnableAutoConfiguration 注解用于启用 SpringBoot 的自动配置特性。
  • @ComponentScan 注解用于启用组件扫描,该注解继承自 @ComponentScans 注解,用于定义多个 @ComponentScan 注解。

12-13 ​

Spring Boot 的核心注解是什么? ​

SpringBoot 核心注解是 @SpringBootApplication,该注解标识一个配置类,并同步启用自动配置以及组件扫描。是 SpringBoot 自动配置特性的核心。

12-12 ​

Spring Boot 是什么? ​

根据 Spring 官网简介,SpringBoot 提供了丰富的 Spring 模块化支持,可以基于 SpringBoot 开发单个微服务,SpringBoot 可以快速构建基于 Spring 的应用程序。

它实现了自动配置,可以基于约定俗成的配置快速构建独立的 Spring 应用程序,简化了 Spring 应用程序的初始搭建和开发过程。

12-11 ​

Spring MVC 框架有什么用? ​

SpringMVC 解决了 V-C 交互的问题,即 V(View:视图) 和 C(Controller:控制器) 之间的交互问题。

用户可以通过视图将请求数据提交给服务器端的控制器,而控制器可以接收到相关数据后进行处理,最终,给予客户端某个视图,使得客户端得到响应结果。

12-10 ​

Spring 框架用到了哪些设计模式? ​

  1. 工厂方法:Spring 使用工厂方法模式通过 BeanFactory、ApplicationContext 创建 bean 实例。
  2. 单例模式:Spring 中的 bean 默认都是单例的。
  3. 代理模式:Spring AOP 功能的实现就是基于动态代理。
  4. 模板方法:Spring 中很多类都使用了模板方法模式,比如 JdbcTemplate、RestTemplate 等。
  5. 观察者模式:Spring 事件驱动模型就是观察者模式的一种实现。
  6. 适配器模式:Spring MVC 中的 HandlerAdapter 就是适配器模式的一种应用。
  7. 装饰器模式:Spring 中的 BeanWrapperImpl 就是装饰器模式的一种应用。
  8. 策略模式:Spring 中的 InstantiationStrategy 就是策略模式的一种应用。

12-09 ​

Spring 支持哪些事务管理类型? ​

Spring 支持编程式事务管理和声明式事务管理。

  • 编程式事务可以满足在代码中显示的调用开启事务、提交事务、回滚事务的相关方法。
  • 声明式事务是建立在 AOP 的基础之上,本质是对方法进行拦截,在目标方法之前创建或加入一个事务,在之后根据执行情况提交或回滚事务。

12-08 ​

为什么不推荐使用 @Autowired 注解注入 bean? ​

@Autowired 注解是 Spring 提供的,如果使用了这个注解,那么就会和 Spring 框架产生了耦合,不利于代码的解耦。

12-07 ​

Spring 自动装配有哪些方式? ​

Spring 自动装配有三种方式,分别是 byName、byType 和 constructor。

  • byName:根据 bean 的名称进行装配,如果 bean 的名称和属性名称一致,那么就会进行装配。
  • byType:根据 bean 的类型进行装配,如果 bean 的类型和属性类型一致,那么就会进行装配。
  • constructor:根据构造器进行装配,如果 bean 的构造器参数类型和属性类型一致,那么就会进行装配。

12-6 ​

Spring 装配是指什么? ​

Spring 装配是指创建应用对象之间协作关系的行为,Spring 通过依赖注入(DI)来进行装配。

12-5 ​

Spring 怎么注入 Java 集合类型? ​

Spring 可以通过 util 命名空间注入集合类型,比如 List、Set、Map 等。

xml
<util:list id="list">
    <value>1</value>
    <value>2</value>
    <value>3</value>
</util:list>

12-4 ​

Spring @Required 注解有什么用? ​

@Required 注解可以用在字段、方法和构造器上,用来检查 bean 的必需属性是否已经被设置。

如果设置了 required 属性为 true,那么当检查到 bean 的属性没有被设置时,会抛出 BeanInitializationException 异常。

12-3 ​

Spring @Autowired 注解有什么用? ​

@Autowired 注解可以用在字段、构造器、方法和参数上,让 Spring 完成 bean 的自动装配工作。

默认按照类匹配的方式进行装配,如果匹配到多个 bean,那么会按照字段名或者参数名进行匹配。 使用 @Qualifier 注解可以指定 bean 的名称,从而避免歧义。

12-2 ​

Spring bean 为什么默认为单例? ​

Spring bean 默认为单例,这是因为 Spring 容器中的 bean 默认都是单例的,这样做的好处是减少了创建 bean 的开销,节省了内存资源。

但是单例的 bean 也有一些缺点,比如线程安全问题,如果一个单例的 bean 中有一个成员变量,如果这个成员变量是可变的,那么就会出现线程安全问题。

12-1 ​

请描述 bean 的作用域。 ​

Spring 创建的 Bean 默认是单利的,每一个实例只会被创建一次,通过 getBean() 方法获取的是同一个实例。可以直接通过 scope 来制定一个 Bean 的作用域。

xml
<!-- 作用域:prototype -->
<bean name="accountDao" scope="prototype"     class="com.zejian.spring.springIoc.dao.impl.AccountDaoImpl"/>