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
spring-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时,可能还会用到下面这些注解,请注意收藏:
をインスタンス化します。上記ではスタンドアロン Bean を作成しました。バージョンは異なりますが、実際にはマスター/スレーブ、センチネル、クラスターなどのさまざまなバージョンを作成したり、SSL アクセス モードを使用したりできます。
@Conditional
: 一定の条件に従って判定し、条件を満たした場合に Bean をコンテナに登録します。
@ConditionalOnMissingBean
: 指定されたBean が存在しない場合、現在の Bean がインスタンス化されます#@ConditionalOnProperty
: Bean は、構成ファイルで定義されたプロパティが満たされる場合に作成され、それ以外の場合は作成されません
@ConditionalOnBean
: 指定された Bean が存在する場合、現在の Bean をインスタンス化します。
@ConditionalOnClass
: 指定されたクラス名がクラスパス上に存在する場合、現在の Bean をインスタンス化します。 Bean
@ConditionalOnMissingClass
: 指定されたクラス名がクラスパス上に存在しない場合、現在の Bean
カスタマイズ方法がわかったので、実際のプロジェクトで使用してみましょう。常にデモにとどまることはできません。最良の方法は、それを実際のプロジェクトで使用することです。プロジェクト。
充電パイル プロジェクトでは、テキスト メッセージの送信機能でカスタム スターターを使用し、テンプレート メソッド モードも使用しました。
以上がスターターをカスタマイズする方法、それを学ぶのに飽きていませんか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。