12-31
Spring Boot 如何配置多个数据源?
SpringBoot 可以通过 @ConfigurationProperties
注解来配置多个数据源,该注解可以用在类上,也可以用在方法上。
@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();
}
}
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
文件中指定,如下:
<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
注解中加载配置。
优先级:
- 命令行参数。
- 系统环境变量。
@PropertySource
注解中的配置。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 会根据条件注解的条件判断是否需要自动配置。
如下:
// 使用 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
注解来提供网络服务,该注解可以用在类上,也可以用在方法上。
@RestController
public class MyController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
12-20
SpringBoot 怎么解决跨域问题?
可以通过@CrossOrigin
注解来解决跨域问题,该注解可以用在类上,也可以用在方法上。也可以通过 WebMvcConfigurer
接口来配置跨域。
@RestController
@CrossOrigin
public class MyController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
@Configuration
public class MyConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedHeaders("*")
.allowedMethods("*")
.allowedOrigins("*");
}
}
12-19
SpringBoot 怎么根据指定条件注册 bean?
SpringBoot 可以通过 @Conditional
注解来根据指定条件注册 bean,该注解可以用在类上,也可以用在方法上。
@Configuration
public class MyConfig {
@Bean
@Conditional(MyCondition.class)
public MyBean myBean() {
return new MyBean();
}
}
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
注解源码如下:
@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 框架用到了哪些设计模式?
- 工厂方法:Spring 使用工厂方法模式通过
BeanFactory
、ApplicationContext
创建 bean 实例。 - 单例模式:Spring 中的 bean 默认都是单例的。
- 代理模式:Spring AOP 功能的实现就是基于动态代理。
- 模板方法:Spring 中很多类都使用了模板方法模式,比如
JdbcTemplate
、RestTemplate
等。 - 观察者模式:Spring 事件驱动模型就是观察者模式的一种实现。
- 适配器模式:Spring MVC 中的
HandlerAdapter
就是适配器模式的一种应用。 - 装饰器模式:Spring 中的
BeanWrapperImpl
就是装饰器模式的一种应用。 - 策略模式: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
等。
<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 的作用域。
<!-- 作用域:prototype -->
<bean name="accountDao" scope="prototype" class="com.zejian.spring.springIoc.dao.impl.AccountDaoImpl"/>