スターターをカスタマイズする方法、それを学ぶのに飽きていませんか?

リリース: 2023-08-15 16:02:06
転載
1263 人が閲覧しました

2日前、友人がインタビュー中にスターターについて再び質問されました。私が彼の模擬面接を行ったとき、 はカスタム スターター を自分で作成する必要があることを意図的に強調しました。そして、案の定、彼は面接中にそれについて質問されました。

スターターをカスタマイズする方法、それを学ぶのに飽きていませんか?


サーブレットから Spring MVC までを経験したことがない人もいるかもしれません。構成がかなり面倒なので、Spring Boot は後で含めません。

Spring Boot を勉強したことのある友人は、Spring Boot を説明するために使用されることわざがあることを知っているはずです。規約は構成よりも優れています

Spring Boot が構成よりも規約と呼ばれるのはなぜですか?

Spring Boot が「構成より規約」と呼ばれる理由は、Spring Boot が構成より規約という設計概念を採用しているためです。従来の Java 開発では、XML ファイル、アノテーションなどの大量の構成が必要であり、これらの構成は開発者自身が指定する必要があります。 Spring Boot は、いくつかのデフォルト構成と規則を提供することで開発プロセスを簡素化し、開発者が行う必要がある手動構成作業の量を削減します。

Spring Boot は、データ ソースの自動構成、Web サーバーの自動構成、ログの自動構成など、いくつかのデフォルトの構成プロパティと規則を通じて、いくつかの一般的な構成タスクを自動的に完了します。開発者は、合意された方法でコードと構成ファイルを整理するだけで、動作するアプリケーションを迅速に構築できます。

この構成よりも規約という設計概念により、開発者は従来の構成の詳細に注意を払う必要がなくなり、ビジネス ロジックの実装に集中できるようになります。同時に、Spring Boot はいくつかの拡張可能な構成オプションも提供し、開発者が独自のニーズに応じてカスタマイズおよび拡張できるようにします。

一般に、構成より規約という Spring Boot の設計概念により、開発者はアプリケーションをより迅速かつ効率的に開発できるようになり、構成の複雑さが軽減されます。これが、Spring Boot が Java 開発で広く使用されるフレームワークの 1 つになる理由でもあります。

インタビューで、Spring Boot の自動アセンブリ原理について話してほしいとお願いしましたが、これに簡単に答えることができます:

Spring Boot の自動アセンブリ原理は です。 @EnableAutoConfiguration Annotations および spring.factories ファイルが実装されます。

@EnableAutoConfigurationアノテーションは自動アセンブリ機能を有効にするために使用され、通常、このアノテーションはアプリケーションのメイン クラスに配置されます。

spring.factories ファイルは、META-INF ディレクトリにある構成ファイルで、各自動アセンブリ クラスの完全修飾名を定義します。

Spring Boot が開始すると、クラスパス下のすべての spring.factories ファイルがロードされ、その中で定義されている自動配線クラスの完全修飾名に基づいてインスタンス化され、 Spring アプリケーションのコンテキスト。

自動アセンブリ クラスは通常、@Configuration アノテーションを通じてアノテーションが付けられ、さまざまなアノテーション (@ComponentScan@Import など) が使用されます。 、など) を使用して、対応する自動アセンブリ ロジックを実装します。

@EnableAutoConfiguration アノテーションと spring.factories ファイルを通じて、Spring Boot はアプリケーションの依存関係と構成情報に基づいて、対応するコンポーネントを自動的にロードして構成できるため、作業が簡素化されます。アプリケーションの構成と開発プロセス。

一度暗唱すると忘れてしまうかもしれませんが、もう一度暗唱すると大まかに思い出せるかもしれません。

実際、スターターをカスタマイズする方法を知っていれば、上記の質問に答えるのははるかに簡単になります。

Spring Boot を使用して開発する場合、最も一般的なものはさまざまなスターターです。

一般的なスターター

Spring Boot には一般的に使用されるスターターが多数あります。一般的なスターターのいくつかを次に示します:

  • spring-boot-starter-web: Spring MVC や Tomcat サーバーなどの Web アプリケーションを構築するためのスターター。 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-boot-starterspring-boot-starter-xxx で始まることがわかります。

ただし、プロジェクトでは単純にこれを実行しました: mybatis-spring-boot-starter これは、上記の命名方法ではありません。

実際には、通常、spring-boot-starter で始まる spring-boot-starter-xxx を呼び出します。これは、Spring が公式に行ってくれたことです、xxx-spring-boot-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);
    }
}
ログイン後にコピー

次に、リソース ディレクトリに META-INF ディレクトリを作成し、このディレクトリに spring.factories ファイルを作成します。ファイルの内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.tian.RedissonAutoConfiguration
ログイン後にコピー

完了、 それでおしまい 。まだ回復してないんですか?

カスタム スターターを使用する

Spring Boot プロジェクトを作成し、カスタム スターターを導入します。

<dependency>
    <groupId>com.tian</groupId>
    <artifactId>charge-sms-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
ログイン後にコピー

RedissonProperties クラスでホストとポートにデフォルト値を割り当てたため、パラメータが設定されていない場合は application.properties ファイルのデフォルト値を使用します。

設定されている場合、次のようになります:

tian.redisson.host=localhost
tian.redisson.port=6379
tian.redisson.timeout=1000
ログイン後にコピー

ただし、実際にこのようにプレイしてみると、通常何かを設定するときに、基本的に次のようなプロンプトが表示されることがわかります。

スターターをカスタマイズする方法、それを学ぶのに飽きていませんか?

##このリマインダーを受け取ってはいかがでしょうか?

要想有这个提示,还得在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 をコンテナに登録します。

@ConditionalOnMissingBean: 指定されたBean が存在しない場合、現在の Bean がインスタンス化されます

#@ConditionalOnProperty: Bean は、構成ファイルで定義されたプロパティが満たされる場合に作成され、それ以外の場合は作成されません

@ConditionalOnBean : 指定された Bean が存在する場合、現在の Bean をインスタンス化します。

@ConditionalOnClass: 指定されたクラス名がクラスパス上に存在する場合、現在の Bean をインスタンス化します。 Bean

@ConditionalOnMissingClass: 指定されたクラス名がクラスパス上に存在しない場合、現在の Bean

をインスタンス化します。上記ではスタンドアロン Bean を作成しました。バージョンは異なりますが、実際にはマスター/スレーブ、センチネル、クラスターなどのさまざまなバージョンを作成したり、SSL アクセス モードを使用したりできます。

カスタマイズ方法がわかったので、実際のプロジェクトで使用してみましょう。常にデモにとどまることはできません。最良の方法は、それを実際のプロジェクトで使用することです。プロジェクト。

充電パイル プロジェクトでは、テキスト メッセージの送信機能でカスタム スターターを使用し、テンプレート メソッド モードも使用しました。

以上がスターターをカスタマイズする方法、それを学ぶのに飽きていませんか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:Java后端技术全栈
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート