今更ですが、Spring 4.3でコンストラクタインジェクションを使う際に、@Autowiredを付けなくてもよくなったという話をちょっと試しておこうかと。
Scalaで。
pom.xmlは載せますが、長いので最後に。
確認用のコードを用意
とりあえず、2つ以上のBeanをインジェクションしたかったので、しょうもないですがこういうクラスを用意。
src/main/scala/org/littlewings/spring/DecolationService.scala
package org.littlewings.spring import org.springframework.stereotype.Service @Service class DecorationService(joinService: JoinService, wrapService: WrapService) { def apply(prefix: String, suffix: String, delimiter: Char, tokens: String*): String = wrapService(joinService(delimiter, tokens: _*), prefix, suffix) } @Service class JoinService { def apply(delimiter: Char, tokens: String*): String = tokens.mkString(delimiter.toString) } @Service class WrapService { def apply(token: String, prefix: String, suffix: String): String = s"${prefix}${token}${suffix}" }
内容は、お察しください…。
こちらが、コンストラクタでインジェクションできることを確認するポイント。
@Service
class DecorationService(joinService: JoinService, wrapService: WrapService) {
なにもないですが、エントリポイントも一応用意。
src/main/scala/org/littlewings/spring/App.scala
package org.littlewings.spring import org.springframework.boot.autoconfigure.SpringBootApplication @SpringBootApplication class App
テストコードで確認
では、テストコードで確認してみます。
src/test/scala/org/littlewings/spring/DecorationServiceTest.scala
package org.littlewings.spring import org.junit.Test import org.junit.runner.RunWith import org.scalatest.Matchers import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.test.context.junit4.SpringJUnit4ClassRunner @RunWith(classOf[SpringJUnit4ClassRunner]) @SpringBootTest(classes = Array(classOf[App])) class DecorationServiceTest extends Matchers { @Autowired private[spring] var decorationService: DecorationService = _ @Test def constructorInjection(): Unit = { decorationService("[", "]", ',', "Hello", "Spring", "with", "Scala") should be("[Hello,Spring,with,Scala]") } }
ここは、@Autowired使いますよね…。
で、このコードで普通に動きました。いいですね!
あと、バリエーション的に以下の両方とも試しておきましたが、どちらも動きました(そりゃそうだ的な)。
@Service class DecorationService(joinService: JoinService, wrapService: WrapService) { @Service class DecorationService(val joinService: JoinService, val wrapService: WrapService) {
ちょっと活用していこうかな?
最後に、pom.xmlも載せておきます。pom.xmlが、1番長い…。
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.littlewings</groupId> <artifactId>spring-scala-constructor-injection</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <scala.major.version>2.12</scala.major.version> <scala.version>${scala.major.version}.0</scala.version> <spring.boot.version>1.4.2.RELEASE</spring.boot.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring.boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>${scala.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.scalatest</groupId> <artifactId>scalatest_${scala.major.version}</artifactId> <version>3.0.1</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>3.2.2</version> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> </execution> </executions> <configuration> <scalaVersion>${scala.version}</scalaVersion> <args> <arg>-Xlint</arg> <arg>-unchecked</arg> <arg>-deprecation</arg> <arg>-feature</arg> </args> <recompileMode>incremental</recompileMode> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring.boot.version}</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>