公告

👇微信扫码添加好友👇

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 有两种热部署方式,分别是 devtoolsspringloaded

  • 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 使用工厂方法模式通过 BeanFactoryApplicationContext 创建 bean 实例。
  2. 单例模式:Spring 中的 bean 默认都是单例的。
  3. 代理模式:Spring AOP 功能的实现就是基于动态代理。
  4. 模板方法:Spring 中很多类都使用了模板方法模式,比如 JdbcTemplateRestTemplate 等。
  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 自动装配有三种方式,分别是 byNamebyTypeconstructor

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

12-6

Spring 装配是指什么?

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

12-5

Spring 怎么注入 Java 集合类型?

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

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"/>