可能部分人没有经历过从Servlet到SpringMVC,如果经历过就知道那配置是相当的繁琐,于是后面除了个SpringBoot。
学过SpringBoot的朋友应该知道,有句话用来形容SpringBoot:约定大于配置。
为什么说SpringBoot会被称为约定大于配置呢?
SpringBoot被称为"约定大于配置"的原因是因为它采用了约定优于配置的设计理念。传统的Java开发需要进行大量的配置,如XML文件、注解等,这些配置需要开发人员自己指定。而SpringBoot则通过提供一些默认配置和约定来简化开发过程,减少了开发人员需要手动配置的工作量。
SpringBoot通过一些默认的配置属性和约定来自动完成一些常见的配置工作,如自动配置数据源、自动配置Web服务器、自动配置日志等。开发人员只需按照约定的方式组织代码和配置文件,即可快速构建一个可运行的应用程序。
总的来说,SpringBoot的约定大于配置的设计理念使得开发人员能够更加快速、高效地开发应用程序,并且减少了配置的复杂性。这也是SpringBoot能够成为Java开发中广泛使用的框架之一的原因。
在面试中,问你说一下SpringBoot自动装配原理,咱们可以简单的这么来回答:
背一遍或许两天就忘了,再背一遍也许能记住个大概。
其实,我们只要清楚如何自定义一个starter,再去回答上面的问题会轻松很多。
我们在使用SpringBoot开发时,最常见的就是各种starter。
常见starterSpringBoot常用的starter有很多,以下是一些常见的starter:
spring-boot-starter-web:用于构建Web应用程序的starter,包括SpringMVC和Tomcat服务器。它提供了处理HTTP请求和响应的功能。
spring-boot-starter-data-jpa:用于与关系型数据库进行交互的starter,包括SpringDataJPA和Hibernate。它简化了与数据库的交互,提供了常见的CRUD操作。
spring-boot-starter-security:用于添加安全性功能的starter,包括SpringSecurity和OAuth2。它提供了身份验证、授权和安全配置的功能。
spring-boot-starter-test:用于编写单元测试和集成测试的starter,包括JUnit和SpringTest。它提供了测试框架和工具,方便进行单元测试和集成测试。
spring-boot-starter-actuator:用于监控和管理应用程序的starter,包括健康检查、指标收集和远程管理功能。它提供了监控应用程序运行状态的功能。
spring-starter-cache:用于添加缓存支持的starter,包括SpringCache和Ehcache。它提供了缓存数据的功能,提高应用程序的性能。
spring-boot-starter-data-redis:用于与Redis数据库进行交互的starter,包括SpringDataRedis。它简化了与Redis的交互,提供了常见的操作方法。
spring-boot-starter-mail:用于发送电子邮件的starter,包括JavaMail和SpringMail。它提供了发送电子邮件的功能。
spring-boot-starter-log4j2:用于使用Log4j2进行日志记录的starter。它提供了日志记录的功能,方便调试和错误追踪。
spring-boot-starter-thymeleaf:用于使用Thymeleaf模板引擎的starter。它提供了使用Thymeleaf进行页面渲染的功能。
这些starter可以根据应用程序的需求选择使用,它们提供了各种功能和便利,简化了应用程序的开发和配置过程。
从命名上大家会发现都是以spring-boot-starter开头的spring-boot-starter-xxx。
但,我们在项目中也简单过这样的:mybatis-spring-boot-starter,并不是上面的那种命名方式。
其实,我们通常称以spring-boot-starter开头的spring-boot-starter-xxx是spring官方给咱们搞的,xxx-spring-boot-starter这种格式就是自己搞的,只是个命名而已。
我们为何不能自己也来搞个starter过过瘾呗,哈哈哈,开搞。
自定义starter我们来搞一个redisson的starter。
第一步创建一个SpringBoot项目,命名为:redisson-spring-boot-starter。
其中,pom依赖重点:
/groupIdartifactIdspring-boot-starter//version!--不让jar进行传递避免jar包冲突--optionaltrue/optional//groupIdartifactIdredisson//version//groupIdartifactIdspring-boot-configuration-processor/artifactIdoptionaltrue/optional/depency/depencies
创建配置解析类:RedissonProperties
/***@authortianwc公众号:java后端技术全栈、面试专栏*@*@date2023年07月20日11:35*在线刷题1200+题和1000+篇干货文章:ahref=""博客地址/a**解析配置项*/@ConfigurationProperties(prefix="")publicclassRedissonProperties{privateStringhost="localhost";privateintport=6379;privateinttimeout;//getset省略}自动装配类:RedissonAutoConfiguration
/***@authortianwc公众号:java后端技术全栈、面试专栏*@*@date2023年07月20日11:27*在线刷题1200+题和1000+篇干货文章:ahref=""博客地址/a*///(条件装配)只有在我们的classpath目录下有我们才自动装配RedissonClientbean//@ConditionalOnClass()@EnableConfigurationProperties()@ConfigurationpublicclassRedissonAutoConfiguration{privatestaticfinalStringPREFIX="redis://";@BeanpublicRedissonClientredissonClient(RedissonPropertiesredissonProperties){Configconfig=newConfig();//redis单机模式().setAddress(PREFIX+()+":"+()).setConnectTimeout(());(config);}}然后,在resources目录下创建:META-INF目录,在这个目录下创建文件,文件内容:
=\
完事,这么就搞定了。是不是还没缓过神来?
使用自定义starter再创建个springBoot项目,把我们自定义的starter引入进来。
/groupIdartifactIdcharge-sms-spring-boot-starter//version/depency
由于我们在RedissonProperties类中对host和port赋了默认值,所以我们在文件中,不配任何参数时就是用到的是默认值。
如果配置的话,如下:
==6379=1000
但是,你真的在这么玩的时候,会发现我们平时要配置个什么的时候,基本上都会提示的,比如:
这样提示可不就爽了吗?
要想有这个提示,还得在redisson-spring-boot-starter中搞点事情。
相关jar上面都已经引入了这里不再赘述。
同样是在META-INF下面创建一个文件(文件名需要注意不要写错):
内容如下:
{"properties":[{"name":"","type":"","description":"redis服务地址ip","defaultValue":"localhost"},{"name":"","type":"","description":"redis服务端口号","defaultValue":6379},{"name":"","type":"","description":"redis连接超时时间","defaultValue":1000}]}properties对应一个数组,每个配置项占一个。
重新打包,在使用的项目里执行ReloadAllMaven。
接着,再去properties文件里配置,就会有对应的提示了。
我们写一个controller来使用:
@Slf4j@RestController@RequestMapping("/test")publicclassTestController{@ResourceprivateRedissonClientredissonClient;@GetMapping("/redisson")publicStringredisson(){RBucketbucket=("name");if(()==null){("公众号:java后端技术全栈");}().toString();}}执行结果:
到这里,我们就搞定了一个自定义starter。
在实际项目中,在自定义starter时,可能还会用到下面这些注解,请注意收藏:
上面我们只是搞了一个单机版的,其实还可以搞各种版本的主从、哨兵、cluster等,也可以搞成ssl访问方式。
自定义会了,那么就该如何在实际项目中使用了,咱们不能老是停留在在demo里,得用到项目中才是王道。