이틀 전 친구가 인터뷰 중에 스타터에 대해 다시 질문을 받았습니다. 제가 모의면접을 할 때 커스텀 스타터는 직접 작성해야 한다라고 일부러 강조했는데, 아니나 다를까 면접에서 이에 대한 질문을 받았습니다.
아마 Servlet에서 Spring MVC까지 경험해보지 않으신 분들이라면 구성이 꽤 번거롭다는 걸 아실 겁니다. 그래서 Spring Boot는 포함되지 않습니다.
Spring Boot를 공부한 친구들은 Spring Boot를 설명하는 속담이 있다는 것을 알아야 합니다: Convention is great than Configuration.
Spring Boot를 구성보다 규칙이라고 부르는 이유는 무엇입니까?
Spring Boot를 "구성보다 관례"라고 부르는 이유는 구성보다 관례라는 디자인 개념을 채택했기 때문입니다. 전통적인 Java 개발에는 XML 파일, 주석 등과 같은 많은 양의 구성이 필요하며 이러한 구성은 개발자가 직접 지정해야 합니다. Spring Boot는 몇 가지 기본 구성과 규칙을 제공하여 개발자가 수행해야 하는 수동 구성 작업의 양을 줄여 개발 프로세스를 단순화합니다.
Spring Boot는 데이터 소스 자동 구성, 웹 서버 자동 구성, 로그 자동 구성 등과 같은 일부 기본 구성 속성 및 규칙을 통해 몇 가지 일반적인 구성 작업을 자동으로 완료합니다. 개발자는 작동하는 애플리케이션을 신속하게 구축하기 위해 합의된 방식으로 코드와 구성 파일을 구성하기만 하면 됩니다.
구성보다 관례라는 이 디자인 개념을 통해 개발자는 더 이상 기존 구성 세부 사항에 주의를 기울일 필요가 없으며 비즈니스 논리 구현에 더 집중할 수 있습니다. 동시에 Spring Boot는 확장 가능한 구성 옵션도 제공하므로 개발자는 필요에 따라 사용자 정의하고 확장할 수 있습니다.
일반적으로 Spring Boot의 구성보다 관례라는 설계 개념을 통해 개발자는 애플리케이션을 보다 빠르고 효율적으로 개발할 수 있으며 구성 복잡성을 줄일 수 있습니다. 이는 Spring Boot가 Java 개발에서 널리 사용되는 프레임워크 중 하나가 될 수 있는 이유이기도 합니다.
인터뷰에서 Spring Boot의 자동 조립 원리에 대해 이야기해 달라고 요청했는데, 간단하게 이렇게 대답할 수 있습니다.
Spring Boot의 자동 조립 원리는
@EnableAutoConfiguration
注解和spring.factories
파일을 통해 구현됩니다.
@EnableAutoConfiguration
주석은 자동을 활성화하는 데 사용됩니다. 어셈블리 기능의 경우 이 주석은 일반적으로 애플리케이션의 기본 클래스에 배치됩니다.@EnableAutoConfiguration
注解是用来开启自动装配的功能,该注解通常放在应用的主类上。
spring.factories
文件是一个位于META-INF目录下的配置文件,其中定义了各个自动装配类的全限定名。当Spring Boot启动时,会加载classpath下的所有
spring.factories
文件,并根据其中定义的自动装配类的全限定名,将其实例化并添加到Spring应用上下文中。自动装配类通常会通过
@Configuration
注解来标注,同时会使用各种注解(如@ComponentScan
、@Import
等)来实现相应的自动装配逻辑。通过
spring.factories 파일은 다음 위치에 있습니다. META-INF 디렉터리의 구성 파일은 각 자동 어셈블리 클래스의 정규화된 이름을 정의합니다.@EnableAutoConfiguration
注解和spring.factories
Spring Boot가 시작되면 spring. factory
파일을 생성하고 정의된 autowired 클래스의 정규화된 이름을 기반으로 이를 Spring 애플리케이션 컨텍스트에 인스턴스화하고 추가합니다.
@Configuration
주석 표시하는 데 사용되며 다양한 주석이 사용됩니다(예: @ComponentScan
, @Import
등) 해당 자동 조립 논리를 구현합니다.
By@EnableAutoConfiguration
주석 및 spring.factories
파일, Spring Boot 종속성 및 구성 정보를 자동으로 로드하고 해당 구성요소를 구성하여 애플리케이션 구성 및 개발 프로세스를 단순화합니다.
사실 스타터를 맞춤설정하는 방법을 알고 있다면 위 질문에 답하는 것이 훨씬 쉬울 것입니다.
🎜🎜Spring Boot를 사용하여 개발할 때 가장 일반적인 것은 다양한 스타터입니다. 🎜🎜공통 스타터🎜🎜Spring Boot에는 일반적으로 사용되는 스타터가 많이 있습니다. 다음은 몇 가지 일반적인 스타터입니다.이 스타터는 애플리케이션의 필요에 따라 선택하고 사용할 수 있으며 다양한 기능과 편의성을 제공하여 애플리케이션 개발 및 구성 프로세스를 단순화합니다.
이름에서 찾을 수 있습니다: spring- <code rgba : mono consolas monaco menlo monospace break-all rgb>spring-boot-starter-xxx
. spring-boot-starter
开头的spring-boot-starter-xxx
。
但,我们在项目中也简单过这样的:mybatis-spring-boot-starter
mybatis-spring-boot-starter
는 위의 이름 지정 방법이 아닙니다. 🎜실제로 우리는 보통 spring-boot-starter-xxx
는 봄 공식에서 우리를 위해 만들어졌습니다. xxx -spring-boot-starter
이 형식은 직접 만든 것으로 이름만 붙일 뿐입니다. spring-boot-starter-xxx
是spring官方给咱们搞的,xxx-spring-boot-starter
这种格式就是自己搞的,只是个命名而已。
我们为何不能自己也来搞个starter过过瘾呗,哈哈哈,开搞。
我们来搞一个redisson的starter。
第一步创建一个Spring Boot项目,命名为:redisson-spring-boot-starter
。
其中,pom依赖重点:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.3.1.RELEASE</version> <!-- 不让jar进行传递 避免jar包冲突--> <optional>true</optional> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.13.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> </dependencies>
创建配置解析类:RedissonProperties
/** * @author tianwc 公众号:java后端技术全栈、面试专栏 * @version 1.0.0 * @date 2023年07月20日 11:35 * 在线刷题 1200+题和1000+篇干货文章:<a href="http://woaijava.cc/">博客地址</a> * * 解析配置项 */ @ConfigurationProperties(prefix = "tian.redisson") public class RedissonProperties { private String host="localhost"; private int port=6379; private int timeout; //get set 省略 }
自动装配类:RedissonAutoConfiguration
/** * @author tianwc 公众号:java后端技术全栈、面试专栏 * @version 1.0.0 * @date 2023年07月20日 11:27 * 在线刷题 1200+题和1000+篇干货文章:<a href="http://woaijava.cc/">博客地址</a> */ //(条件装配)只有在我们的classpath目录下有Redisson.class 我们才自动装配RedissonClient bean //@ConditionalOnClass(Redisson.class) @EnableConfigurationProperties(RedissonProperties.class) @Configuration public class RedissonAutoConfiguration { private static final String PREFIX="redis://"; @Bean public RedissonClient redissonClient(RedissonProperties redissonProperties){ Config config=new Config(); //redis单机模式 config.useSingleServer().setAddress(PREFIX+redissonProperties.getHost()+":"+redissonProperties.getPort()) .setConnectTimeout(redissonProperties.getTimeout()); return Redisson.create(config); } }
然后,在resources目录下创建:META-INF目录,在这个目录下创建spring.factories
文件,文件内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.tian.RedissonAutoConfiguration
完事,这么就搞定了。是不是还没缓过神来?
再创建个spring Boot项目,把我们自定义的starter引入进来。
<dependency> <groupId>com.tian</groupId> <artifactId>charge-sms-spring-boot-starter</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
由于我们在RedissonProperties
redisson-spring-boot-starter
. 그 중 pom 종속성의 핵심 사항:
tian.redisson.host=localhost tian.redisson.port=6379 tian.redisson.timeout=1000
구성 구문 분석 클래스 생성: RedissonProperties
{ "properties": [ { "name": "tian.redisson.host", "type": "java.lang.String", "description": "redis服务地址ip", "defaultValue": "localhost" }, { "name": "tian.redisson.port", "type": "java.lang.Integer", "description": "redis服务端口号", "defaultValue": 6379 }, { "name": "tian.redisson.timeout", "type": "java.lang.Integer", "description": "redis连接超时时间", "defaultValue": 1000 } ] }
RedissonAutoConfiguration
🎜@Slf4j @RestController @RequestMapping("/test") public class TestController { @Resource private RedissonClient redissonClient; @GetMapping("/redisson") public String redisson() { RBucket bucket = redissonClient.getBucket("name"); if(bucket.get()==null){ bucket.set("公众号:java后端技术全栈"); } return bucket.get().toString(); } }
spring.factories
파일, 파일 내용: 🎜rrreee🎜완료되었습니다. 그게 다입니다. 아직 회복하지 못하셨나요? 🎜要想有这个提示,还得在redisson-spring-boot-starter
中搞点事情。
相关jar上面都已经引入了这里不再赘述。
同样是在META-INF下面创建一个文件(文件名需要注意不要写错):additional-spring-configuration-metadata.json
内容如下:
{ "properties": [ { "name": "tian.redisson.host", "type": "java.lang.String", "description": "redis服务地址ip", "defaultValue": "localhost" }, { "name": "tian.redisson.port", "type": "java.lang.Integer", "description": "redis服务端口号", "defaultValue": 6379 }, { "name": "tian.redisson.timeout", "type": "java.lang.Integer", "description": "redis连接超时时间", "defaultValue": 1000 } ] }
properties
对应一个数组,每个配置项占一个。
name
:就是我们的配置项type
:配置项类型description
:配置项的描述defaultValue
:默认值
重新打包,在使用的项目里执行Reload All Maven。
接着,再去properties文件里配置,就会有对应的提示了。
我们写一个controller来使用:
@Slf4j @RestController @RequestMapping("/test") public class TestController { @Resource private RedissonClient redissonClient; @GetMapping("/redisson") public String redisson() { RBucket bucket = redissonClient.getBucket("name"); if(bucket.get()==null){ bucket.set("公众号:java后端技术全栈"); } return bucket.get().toString(); } }
执行结果:
到这里,我们就搞定了一个自定义starter。
在实际项目中,在自定义starter时,可能还会用到下面这些注解,请注意收藏:
@Conditional: 특정 조건에 따라 판단하여 조건이 충족되면 Bean을 컨테이너에 등록합니다
@Conditional
:按照一定的条件进行判断,满足条件给容器注册bean
@ConditionalOnMissingBean
:给定的在bean不存在时,则实例化当前Bean
@ConditionalOnProperty
:配置文件中满足定义的属性则创建bean,否则不创建
@ConditionalOnBean
:给定的在bean存在时,则实例化当前Bean
@ConditionalOnClass
:当给定的类名在类路径上存在,则实例化当前Bean
@ConditionalOnMissingClass
@ConditionalOnMissingBean
: 지정된 Bean이 존재하지 않으면 현재 Bean을 인스턴스화합니다
@ConditionalOnProperty
: 구성 파일에 정의된 속성이 충족되면 Bean이 생성되고, 그렇지 않으면 생성되지 않습니다@ConditionalOnBean
: 지정된 Bean이 존재하면 현재 Bean을 인스턴스화합니다
@ConditionalOnClass
: 해당 클래스 이름이 존재하는 경우 클래스 경로에서 현재 Bean
@ConditionalOnMissingClass
: 클래스 경로에 클래스 이름이 없으면 현재 Bean을 인스턴스화합니다
위에서 독립 실행형 버전을 만들었습니다. 실제로 다양한 버전의 마스터-슬레이브도 만들 수 있습니다. sentinel, Cluster 등을 사용하거나 SSL 액세스 방식을 만들 수 있습니다. 위 내용은 스타터를 사용자 정의하는 방법을 배우는 데 지치셨나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!