Последние несколько дней я использовал Spring Scala для игрушечного проекта, и должен сказать, что это фантастический проект, который еще больше упрощает настройку Spring по сравнению с уже простой конфигурацией, основанной исключительно на Spring Java Config .
Позвольте мне продемонстрировать это, начав с примера на основе Cake Pattern :
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
// =======================// service interfacestrait OnOffDeviceComponent { val onOff: OnOffDevice trait OnOffDevice { def on: Unit def off: Unit }}trait SensorDeviceComponent { val sensor: SensorDevice trait SensorDevice { def isCoffeePresent: Boolean }}// =======================// service implementationstrait OnOffDeviceComponentImpl extends OnOffDeviceComponent { class Heater extends OnOffDevice { def on = println("heater.on") def off = println("heater.off") }}trait SensorDeviceComponentImpl extends SensorDeviceComponent { class PotSensor extends SensorDevice { def isCoffeePresent = true }}// =======================// service declaring two dependencies that it wants injectedtrait WarmerComponentImpl { this: SensorDeviceComponent with OnOffDeviceComponent => class Warmer { def trigger = { if (sensor.isCoffeePresent) onOff.on else onOff.off } }}// =======================// instantiate the services in a moduleobject ComponentRegistry extends OnOffDeviceComponentImpl with SensorDeviceComponentImpl with WarmerComponentImpl { val onOff = new Heater val sensor = new PotSensor val warmer = new Warmer}// =======================val warmer = ComponentRegistry.warmerwarmer.trigger |
Шаблон Cake — это чистый способ определения зависимостей в Scala.
Теперь, если бы нам нужно было указать эту зависимость с помощью нативной конфигурации Java Spring, но с языком Scala, позвольте мне сначала начать с компонентов, которые должны быть соединены вместе:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
trait SensorDevice { def isCoffeePresent: Boolean } class PotSensor extends SensorDevice { def isCoffeePresent = true } trait OnOffDevice { def on: Unit def off: Unit } class Heater extends OnOffDevice { def on = println("heater.on") def off = println("heater.off") } class Warmer(s: SensorDevice, o: OnOffDevice) { def trigger = { if (s.isCoffeePresent) o.on else o.off } } |
и конфигурация, которая связывает эти компоненты вместе с образцом, который использует эту конфигурацию:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Bean @Configuration class WarmerConfig { @Bean def heater(): OnOffDevice = new Heater @Bean def potSensor(): SensorDevice = new PotSensor @Bean def warmer() = new Warmer(potSensor(), heater()) } import org.springframework.context.annotation.AnnotationConfigApplicationContext val ac = new AnnotationConfigApplicationContext(classOf[WarmerConfig]) val warmer = ac.getBean("warmer", classOf[Warmer]) warmer.trigger |
В дальнейшем мы используем проект Spring-Scala для определения зависимостей, конфигурации и примера:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
import org.springframework.context.annotation.Configurationimport org.springframework.context.annotation.Beanimport org.springframework.scala.context.function.FunctionalConfigurationclass WarmerConfig extends FunctionalConfiguration { val h = bean("heater") { new Heater } val p = bean("potSensor") { new PotSensor } bean("warmer") { new Warmer(p(), h()) }}import org.springframework.context.annotation.AnnotationConfigApplicationContextimport org.springframework.scala.context.function.FunctionalConfigApplicationContextval ac = FunctionalConfigApplicationContext[WarmerConfig]val warmer = ac.getBean("warmer", classOf[Warmer])warmer.trigger |
Суть проекта Spring Scala, описанного в этой вики, заключается в том, что метод «bean» происходит от черты «FunctionalConfiguration». Этот метод можно вызывать для создания bean-компонента, передавая параметры для указания, при необходимости, имени bean-компонента, псевдонима, область действия и функция, которая возвращает экземплярный компонент.
Надеемся, что этот пример дает хорошее представление о простоте Spring Java Config и о том, насколько проще проект Spring-Scala делает его для проектов на основе Scala.
| Ссылка: | Образец конфигурации bean-компонентов Spring Scala от нашего партнера JCG Биджу Кунджуммена из блога all and sundry. |