Spring で properties に書いた値をプログラム内で使用する場合の方法です。
Spring では、 @Value
を使うと properties に書いた値を使うことができるようになります。
サンプルコード
properties に書いた AWS アクセスキー の情報をプログラム内で使用できるようにします。
たとえばコントローラの中に直接書いてもいいのですが、 properties の値を受けるクラスを作り、 他のクラスから直接 properties の値を取得しなくてもいいようにします。 クラスは Kotlin で記述しています。
1 2 3 4 |
## AWS S3 my.s3.bucket_name=bucket-name my.s3.access_key=ABCDEFGHIJKLMN my.s3.access_secret=THIS/IS/ACCESS/SECRET |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.example.sample.config import com.amazonaws.auth.AWSCredentials import com.amazonaws.auth.BasicAWSCredentials import org.springframework.beans.factory.annotation.Value import org.springframework.stereotype.Component @Configuration open class AwsConfig { @Value("${my.s3.bucket_name}") lateinit var bucketName: String @Value("${my.s3.access_key}") lateinit var accessKey: String @Value("${my.s3.access_secret}") lateinit var accessSecret: String val credentials: AWSCredentials get() = BasicAWSCredentials(accessKey, accessSecret) } |
@Value
の中には properties の中にあった設定値を記述します。 私は、ライブラリなどで使用されている値と区別するため、 独自に設定したプロパティには my
で始まる名前をつけています。
この仕組みは、 production や development など、 環境を複数作った場合で、環境に応じて変更する値がある場合に使えます。
上の AwsConfig
クラス には @Configuration
アノテーション をつけていますが、 @Component
でも大丈夫です。
Configクラスの使い方
上で例に出した AwsConfig
クラスを使ったサンプルコードを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@Component open class AwsS3Gateway { @Autowired lateinit var awsConfig: AwsConfig var s3ClientCache: AmazonS3Client? = null private fun getS3Client(): AmazonS3Client { // ToDo; S3Client Session Management if (s3ClientCache == null) s3ClientCache = generateS3Client() return s3ClientCache!! } private fun generateS3Client(): AmazonS3Client { return AmazonS3Client(awsConfig.credentials) } // ... } |
@Autowired
で Spring が変数 awsConfig
に Configrationクラス のインスタンスをアサインしてくれるようにします。