>  기사  >  Java  >  스타터를 사용자 정의하는 방법을 배우는 데 지치셨나요?

스타터를 사용자 정의하는 방법을 배우는 데 지치셨나요?

Java后端技术全栈
Java后端技术全栈앞으로
2023-08-15 16:02:061259검색

이틀 전 친구가 인터뷰 중에 스타터에 대해 다시 질문을 받았습니다. 제가 모의면접을 할 때 커스텀 스타터는 직접 작성해야 한다라고 일부러 강조했는데, 아니나 다를까 면접에서 이에 대한 질문을 받았습니다.

스타터를 사용자 정의하는 방법을 배우는 데 지치셨나요?


아마 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等)来实现相应的自动装配逻辑。

通过@EnableAutoConfiguration注解和spring.factories

spring.factories 파일은 다음 위치에 있습니다. META-INF 디렉터리의 구성 파일은 각 자동 어셈블리 클래스의 정규화된 이름을 정의합니다.

Spring Boot가 시작되면 spring. factory 파일을 생성하고 정의된 autowired 클래스의 정규화된 이름을 기반으로 이를 Spring 애플리케이션 컨텍스트에 인스턴스화하고 추가합니다.

Autowired 클래스는 일반적으로 @Configuration주석 표시하는 데 사용되며 다양한 주석이 사용됩니다(예: @ComponentScan, @Import 등) 해당 자동 조립 논리를 구현합니다.


By@EnableAutoConfiguration 주석 및 spring.factories 파일, Spring Boot 종속성 및 구성 정보를 자동으로 로드하고 해당 구성요소를 구성하여 애플리케이션 구성 및 개발 프로세스를 단순화합니다.

한 번 외우면 이틀이면 잊어버릴 수도 있어요.

사실 스타터를 맞춤설정하는 방법을 알고 있다면 위 질문에 답하는 것이 훨씬 쉬울 것입니다.

🎜🎜Spring Boot를 사용하여 개발할 때 가장 일반적인 것은 다양한 스타터입니다. 🎜🎜공통 스타터🎜🎜Spring Boot에는 일반적으로 사용되는 스타터가 많이 있습니다. 다음은 몇 가지 일반적인 스타터입니다.
  • spring-boot-starter-web: Spring MVC 및 Tomcat 서버를 포함한 웹 애플리케이션 구축을 위한 스타터입니다. HTTP 요청 및 응답을 처리하는 기능을 제공합니다.
  • spring-boot-starter-data-jpa: Spring Data JPA 및 Hibernate를 포함한 관계형 데이터베이스와 상호작용하기 위한 스타터. 이는 데이터베이스와의 상호 작용을 단순화하고 일반적인 CRUD 작업을 제공합니다.
  • spring-boot-starter-security: Spring Security 및 OAuth2를 포함한 보안 기능을 추가하기 위한 스타터입니다. 인증, 권한 부여 및 보안 구성 기능을 제공합니다.
  • spring-boot-starter-test: JUnit 및 Spring Test를 포함한 단위 테스트 및 통합 테스트 작성을 위한 스타터입니다. 단위 테스트와 통합 테스트를 용이하게 하는 테스트 프레임워크와 도구를 제공합니다.
  • spring-boot-starter-actuator: 상태 확인, 표시기 수집 및 원격 관리 기능을 포함하여 애플리케이션을 모니터링하고 관리하기 위한 스타터입니다. 애플리케이션의 실행 상태를 모니터링하는 기능을 제공합니다.
  • spring-starter-cache: Spring Cache 및 Ehcache를 포함한 캐시 지원을 추가하기 위한 스타터입니다. 데이터를 캐시하고 애플리케이션 성능을 향상시키는 기능을 제공합니다.
  • spring-boot-starter-data-redis: Spring Data Redis를 포함한 Redis 데이터베이스와 상호작용하기 위한 스타터입니다. Redis와의 상호 작용을 단순화하고 일반적인 작업 방법을 제공합니다.
  • spring-boot-starter-mail: JavaMail 및 Spring Mail을 포함한 이메일 전송을 위한 스타터입니다. 이메일을 보내는 기능을 제공합니다.
  • spring-boot-starter-log4j2: Log4j2를 사용하는 로깅용 스타터. 디버깅 및 오류 추적을 용이하게 하는 로깅 기능을 제공합니다.
  • spring-boot-starter-thymeleaf: Thymeleaf 템플릿 엔진을 사용하기 위한 스타터입니다. Thymeleaf를 사용하여 페이지 렌더링 기능을 제공합니다.
  • ......

이 스타터는 애플리케이션의 필요에 따라 선택하고 사용할 수 있으며 다양한 기능과 편의성을 제공하여 애플리케이션 개발 및 구성 프로세스를 단순화합니다.

이름에서 찾을 수 있습니다: 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过过瘾呗,哈哈哈,开搞。

自定义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

完事,这么就搞定了。是不是还没缓过神来?

使用自定义starter

再创建个spring Boot项目,把我们自定义的starter引入进来。

<dependency>
    <groupId>com.tian</groupId>
    <artifactId>charge-sms-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

由于我们在RedissonProperties

우리끼리 재미있게 시작하면 어떨까, 하하하, 해보자.

맞춤형 스타터

us 시작해보세요 재디송 스타터.

첫 번째 단계는 다음 이름의 Spring Boot 프로젝트를 만드는 것입니다. 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();
    }
}
🎜그런 다음 리소스 디렉토리에 META-INF 디렉토리를 생성하고 spring.factories 파일, 파일 내용: 🎜rrreee🎜완료되었습니다. 그게 다입니다. 아직 회복하지 못하셨나요? 🎜

맞춤 스타터 사용

🎜 다른 만들기 spring Boot 프로젝트를 시작하고 맞춤형 스타터를 소개합니다. 🎜rrreee🎜35, 0.05를 사용하고 있으므로);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);"> RedissonProperties class 기본값은 호스트와 포트에 할당되어 있으므로 application.properties 파일에 매개 변수를 구성하지 않으면 기본값을 사용합니다. 🎜🎜구성하면 다음과 같습니다.🎜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 액세스 방식을 만들 수 있습니다.

이제 사용자 정의 방법을 알았으니 실제 프로젝트에서 사용할 차례입니다. 항상 데모에만 머물 수는 없습니다.

🎜Charging Pile 프로젝트에서는 문자 메시지 전송 기능에 Custom Starter를 사용했고, 템플릿 방식의 패턴도 사용했습니다. 🎜🎜🎜🎜🎜🎜🎜🎜

위 내용은 스타터를 사용자 정의하는 방법을 배우는 데 지치셨나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Java后端技术全栈에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제