java 框架面试题-Spring Boot自定义配置与自动配置共存_自定义配置类 java

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

假设我们有一个服务类HelloService,它需要一个名为message的属性值作为欢迎信息。

public class HelloService {
private String message;
public HelloService(String message) {
this.message = message;
}
public void sayHello() {
System.out.println(message);
}
}

现在我们需要使用Spring Boot来配置HelloService,并将message属性值设置为"Hello, World!"。我们可以定义一个配置类HelloConfig:

@Configuration
public class HelloConfig {
@Bean
public HelloService helloService() {
return new HelloService(“Hello, World!”);
}
}

在上面的代码中,@Configuration注解表示这是一个配置类,@Bean注解表示定义了一个Bean对象helloService。在helloService方法中,我们创建了一个HelloService对象,并将message属性值设置为"Hello, World!",然后将它返回。

现在我们可以在其他组件中注入HelloService对象,并调用它的sayHello方法了。比如我们可以在一个控制器类中注入HelloService对象,并在某个请求处理方法中调用它:

@RestController
public class HelloController {
@Autowired
private HelloService helloService;
@GetMapping(“/hello”)
public void hello() {
helloService.sayHello();
}
}

在上面的代码中,@RestController注解表示这是一个控制器类,@Autowired注解表示要自动注入HelloService对象。在hello方法中,我们调用HelloService的sayHello方法输出欢迎信息。
通过这个案例,我们可以看到Spring Boot的自定义配置原理其实就是通过IoC容器和Bean生命周期来管理Bean对象,并提供了一种简单方便的方式来定义和配置这些对象。

我们只需要在配置类中使用@Configuration和@Bean注解来定义Bean对象,然后在其他组件中使用@Autowired注解来自动注入它们即可。

三. Spring Boot自动配置的过程

Spring Boot的自动配置是Spring Boot框架的核心特性之一,它可以根据类路径中存在的依赖关系自动配置Spring应用程序,减少了Spring应用程序的配置量,提高了开发效率。
下面让我们通过一个代码案例来详细分析Spring Boot的自动配置过程:

首先,我们需要创建一个Spring Boot项目,并在http://pom.xml文件中添加以下依赖:

org.springframework.boot spring-boot-starter-web

这里我们添加了spring-boot-starter-web依赖,它包含了Spring Boot Web应用程序的所有必需依赖项。
然后,我们创建一个简单的Java类HelloController,代码如下:

@RestController
public class HelloController {

@GetMapping(“/hello”)
public String hello() {
return “Hello, World!”;
}

}

在这个Java类中,我们使用了Spring框架中的@RestController注解,将该类声明为一个Web控制器,同时使用了@GetMapping注解来定义HTTP GET请求的映射路径。

接下来,我们启动Spring Boot应用程序,可以发现在控制台输出了一系列的自动配置信息,其中包含了Tomcat服务器的自动配置信息,如下所示:

2023-04-10 17:06:50.581 INFO 19944 — [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path ‘/actuator’
2023-04-10 17:06:51.325 INFO 19944 — [ main] o.s.b.web.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ‘’
2023-04-10 17:06:51.328 INFO 19944 — [ main] com.example.demo.DemoApplication : Started DemoApplication in 2.233 seconds (JVM running for 2.844)

从输出结果可以看出,Spring Boot已经自动配置了Tomcat服务器,并且将应用程序部署在了端口号为8080的位置。

如果我们希望对Tomcat服务器进行更加细致的配置,可以在application.properties或application.yml中添加对应的属性配置项,例如:

server:
port: 8888

这样就可以将Tomcat服务器的端口号配置为8888。

总的来说,Spring Boot的自动配置过程就是在应用程序启动时,根据类路径中存在的依赖关系和配置文件中的属性配置,自动配置Spring应用程序的各种组件和功能。这种自动配置的方式极大地提高了开发效率,让开发人员能够更加专注于业务逻辑的实现。

四. Spring Boot自动配置的原理

Spring Boot 的自动配置是 Spring Boot 的一大特色,它能够自动配置大量的框架和组件,使得开发者只需少量的代码就能快速搭建一个 Spring Boot 应用。下面将通过代码案例详细分析 Spring Boot 自动配置的原理。

Spring Boot 的自动配置基于 Spring 的条件化配置(Conditional Configuration)机制实现。条件化配置是指在 Spring 容器中只有满足特定条件的 bean 才会被创建和注册到容器中,这样可以根据不同的场景选择不同的配置。Spring Boot 利用了这一机制,通过配置类中的 @Conditional 注解来判断是否需要自动配置。

下面以 Spring Boot 自动配置 MyBatis 数据库访问框架为例,演示自动配置的原理。
首先在 Maven 或 Gradle 中引入 MyBatis 和 MyBatis-Spring 的依赖:

org.mybatis mybatis 3.5.6 org.mybatis.spring.boot mybatis-spring-boot-starter 2.2.0

然后,在配置类中添加 @MapperScan 注解,指定需要扫描的 Mapper 接口所在的包:

@Configuration
@MapperScan(“com.example.mapper”)
public class MyBatisConfig {
}

在这个配置类中,@MapperScan 注解会触发自动配置,自动配置会扫描 com.example.mapper 包下的所有 Mapper 接口,并为这些接口创建代理对象并注册到 Spring 容器中。

自动配置的原理在 MyBatis-Spring 的源码中也可以看到。在 MybatisAutoConfiguration 类中,有一个 @ConditionalOnClass 注解,表示只有在类路径中存在 MybatisTemplate 类时才会启用自动配置:

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@AutoConfigureAfter(MybatisLanguageDriverAutoConfiguration.class)
@MapperScan(basePackages = MybatisAutoConfiguration.BASE_PACKAGE)
public class MybatisAutoConfiguration {

}

在这个类中,还有许多其他的条件判断,例如只有在存在 DataSource 类时才会配置数据源。这些条件的组合,最终决定了是否启用 MyBatis 的自动配置。
综上所述,Spring Boot 自动配置的原理是基于 Spring 的条件化配置机制实现的,通过在配置类中添加 @Conditional 注解来判断是否需要自动配置。在 MyBatis-Spring 中的实现,也是通过这种机制来判断是否需要启用自动配置。

五. Spring Boot自定义配置与自动配置共存

在 Spring Boot 中,我们通常可以使用自动配置(Auto-Configuration)来快速地配置应用程序。然而,在某些情况下,我们需要对 Spring Boot 的默认配置进行自定义,这就需要使用自定义配置(Custom Configuration)。
自定义配置和自动配置是可以共存的,本篇回答将通过一个 代码示例来详细分析如何实现这一点。

首先,我们需要在 Spring Boot 应用程序中定义一个自定义配置类。在这个类中,我们可以覆盖 Spring Boot 默认的配置,并指定一些自定义配置。例如,我们可以定义一个名为 MyConfig 的自定义配置类,如下所示:

@Configuration
public class MyConfig {

@Bean
public MyService myService() {
return new MyServiceImpl();
}
}

在上面的代码中,我们定义了一个名为 myService() 的 Bean,返回一个 MyServiceImpl实例。

接下来,我们需要创建一个自动配置类,以便让Spring Boot能够自动配置我们的应用程序。我们可以使用 @Configuration@ConditionalOnMissingBean注解来定义一个自动配置类,如下所示:

@Configuration
@ConditionalOnMissingBean(MyService.class)
public class MyAutoConfiguration {

@Bean
public MyService myService() {
return new MyServiceImpl();
}
}

在上面的代码中,我们使用@ConditionalOnMissingBean注解来判断是否需要自动配置Bean。如果 MyService这个 Bean已经被定义了,那么这个自动配置类就不会生效。如果 MyService这个 Bean没有被定义,那么 Spring Boot就会自动配置这个 Bean
最后,我们需要在 Spring Boot 应用程序的启动类中引入自动配置类和自定义配置类。可以使用@Import注解来引入这两个类,如下所示:

@SpringBootApplication
@Import({MyAutoConfiguration.class, MyConfig.class})
public class MyApplication {

public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}

在上面的代码中,我们使用@Import注解来引入自动配置类和自定义配置类。这样,我们就可以实现自定义配置和自动配置的共存。

总结一下,我们需要完成以下几个步骤来实现自定义配置和自动配置的共存:

●创建一个自定义配置类,覆盖 Spring Boot 默认的配置,并指定一些自定义配置。

最后:学习总结——MyBtis知识脑图(纯手绘xmind文档)

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)

image

除此之外,前文所提及的Alibaba珍藏版mybatis手写文档以及一本小小的MyBatis源码分析文档——《MyBatis源码分析》等等相关的学习笔记文档,也皆可分享给认可的朋友!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

——《MyBatis源码分析》等等相关的学习笔记文档,也皆可分享给认可的朋友!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-Ro5VVIeB-1713608693044)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 20
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值