Статьи

Spring-boot и Scala

На самом деле нет ничего особенного в написании веб-приложения Spring-boot исключительно с использованием Scala, оно просто работает!

В этой записи блога я постепенно преобразую приложение Spring-boot на основе Java полностью в Scala — образец на основе Java доступен по адресу github — https://github.com/bijukunjummen/spring-boot-mvc-test

Начнем с того, что у меня была возможность выбрать сборку на основе maven или сборку на основе gradle — я решил использовать сборку на основе gradle, так как gradle имеет отличный плагин для scala, поэтому для поддержки scala единственные изменения в build.gradle Сценарий сборки выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
...
apply plugin: 'scala'
...
jar {
    baseName = 'spring-boot-scala-web'
    version =  '0.1.0'
}
 
 
dependencies {
    ...
    compile 'org.scala-lang:scala-library:2.10.2'
    ...
}

По сути, добавление в плагин Scala и указание версии библиотеки Scala.

Теперь у меня есть одна сущность, класс Hotel, она преобразуется в Scala следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
package mvctest.domain
 
....
 
@Entity
class Hotel {
 
  @Id
  @GeneratedValue
  @BeanProperty
  var id: Long = _
 
  @BeanProperty
  var name: String = _
 
  @BeanProperty
  var address: String = _
 
  @BeanProperty
  var zip: String = _
}

Каждое свойство помечено аннотацией @BeanProperty, чтобы дать команду scala генерировать переменные на основе bean-компонента Java для переменных.

При наличии сущности репозиторий Spring-data для операций CRUD над этой сущностью преобразуется из:

1
2
3
4
5
6
7
import mvctest.domain.Hotel;
 
import org.springframework.data.repository.CrudRepository;
 
public interface HotelRepository extends CrudRepository<Hotel, Long> {
 
}

в Scala следующее:

1
2
3
4
5
import org.springframework.data.repository.CrudRepository
import mvctest.domain.Hotel
import java.lang.Long
 
trait HotelRepository extends CrudRepository[Hotel, Long]

И контроллер на основе Scala, который использует этот репозиторий для перечисления отелей —

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
...
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.stereotype.Controller
import mvctest.service.HotelRepository
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.ui.Model
 
@Controller
@RequestMapping(Array("/hotels"))
class HotelController @Autowired() (private val hotelRepository: HotelRepository) {
 
  @RequestMapping(Array("/list"))
  def list(model: Model) = {
    val hotels = hotelRepository.findAll()
    model.addAttribute("hotels", hotels)
    "hotels/list"
  }
}

Здесь просто работает конструктор автопроводки от HotelRepository !. Обратите внимание на немного неуклюжий способ указания аннотации @Autowired для внедрения на основе конструктора.

Наконец, приложению на основе Spring-boot требуется главный класс для начальной загрузки всего приложения, где этот класс начальной загрузки выглядит следующим образом с Java:

1
2
3
4
5
6
7
8
9
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class SampleWebApplication {
 
 public static void main(String[] args) {
  SpringApplication.run(SampleWebApplication.class, args);
 }
}

В scala, хотя мне нужно было предоставить два класса, один для указания аннотации, а другой для начальной загрузки приложения, может быть лучший способ сделать это (вините в этом мое отсутствие глубины Scala!) —

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
package mvctest
 
import org.springframework.context.annotation.Configuration
import org.springframework.boot.autoconfigure.EnableAutoConfiguration
import org.springframework.context.annotation.ComponentScan
import org.springframework.boot.SpringApplication
 
@Configuration
@EnableAutoConfiguration
@ComponentScan
class SampleConfig
 
 
object SampleWebApplication extends App {
  SpringApplication.run(classOf[SampleConfig]);
}

и все, с этой настройкой все приложение просто работает, приложение может быть запущено с помощью следующего:

1
./gradlew build && java -jar build/libs/spring-boot-scala-web-0.1.0.jar

и пример конечной точки со списком отелей, доступных по этому URL: http: // localhost: 8080 / hotels / list

У меня есть весь проект git, доступный по адресу github : https://github.com/bijukunjummen/spring-boot-scala-web

В заключение можно сказать, что Scala можно считать первоклассным гражданином для приложения на основе Spring-boot, и для работы приложения на основе Scala на базе Spring не требуется специальной настройки. Это просто работает!

Ссылка: Spring-boot и Scala от нашего партнера JCG Биджу Кунджуммен в блоге « Все и вся» .