2015-01-26 4 views
0

나는 교육 목적으로 Spring을 스칼라 프로젝트에 추가하려고합니다. 그러나 스프링 스칼라가 컴포넌트를 분리하는 이점을 이해하지 못합니다.스프링 스칼라를 사용하여 디커플링하는 방법은 무엇입니까?

import org.springframework.scala.context.function.FunctionalConfiguration 

class Configuration extends FunctionalConfiguration { 
    bean() { 
    new Service() 
    } 
} 

간단한 서비스 :

import org.springframework.scala.context.function.FunctionalConfigApplicationContext 

object Application extends App { 
    implicit val context = FunctionalConfigApplicationContext(classOf[Configuration]) 

    val service = context.getBean(classOf[Service]) 
    println(service.method) 
} 

이 그냥 내 해석이다 : 모두가 사용하는

class Service { 
    def method = "Bonjour tout le monde!" 
} 

다음 응용 프로그램

나는 간단한 구성을 만들었습니다 스프링 스칼라 예제의 구현.

내 응용 프로그램에는 여전히 Service 클래스에 대한 지식이 있습니다. 나는 다음과 같이 쓸 수있다 :

val service = new Service() // instead of asking for a Bean which has classname Service 
println(service.method) 

같은 효과.

내가 누락 된 항목이 있습니까?

+0

bean ("sophisticatedService") {...}이 가능하고 Bean을 텍스트로 정의한 다음 context.getBean ("sophisticatedService")을 사용하는 경우이를 이해하고 변경하려고 시도했습니다. 이후 이제는 텍스트 이름으로 분리됩니다. – springScala

+0

나를 위해 Spring에서 실제로 해결 한 유일한 문제는 주기적 종속성이었습니다. 하지만 난 (null을 피하기 위해) 게으른 vals로 이동하고 생성자 내부에서 이름으로 주입 된 매개 변수를 전달합니다. 따라서 스프링 IoC를 더 이상 사용하지 마십시오. 어떤 사람들은'@ Autowired'를 좋아하지만, 그 특성을 사용할 수 있습니다 (특성 내부의 의존성을 정의하고이 의존성이 이미 정의 된 일부 상황과 섞어서 사용합니다) - '케이크 패턴'을 검색하여 더 많은 것을보세요 – dk14

+0

케이스에 스프링을 사용할 수 있습니다 당신은 서비스를위한 인터페이스와 두 개의 구현을 가지고있다. 예를 들어, 애플리케이션은 UserRepository에 의존 할 것이다. FileUserRepository 구현을 할 수 있으며 응용 프로그램에서 해당 세부 사항을 완전히 분리 할 수 ​​있습니다.나중에 DatabaseUserRepository를 구현하고 코드를 건드리지 않고 구현을 전환 할 수 있습니다. 테스트를 위해 모의을 사용하고 UserRepository에 의존하는 코드는 그대로 사용할 수 있습니다. – chalimartines

답변

0

이렇게하면 Service의 사용을 분리합니다. 예 : 나중에 Service이 다른 InnerService에 의존하도록 변경되거나 어떤 이유로 생성자에서 수행 할 수없는 초기화가 있지만 사용되기 전에 메서드 호출에서 발생해야합니다 (.connectToDatabase() 또는 일부). 당신이 인터페이스보다는 구현 예에 프로그래밍하는 경우

val service = context.getBean(classOf[Service]) 
println(service.method) 

: 테스트를위한 모의 하나로 Service을 대체하고 싶어, 당신은 코드의 두 라인을 변경하지 않고이 작업을 수행 할 수 있습니다

trait IService { 
    def method: String 
} 
class Service extends IService... 

val service = context.getBean(classOf[IService]) 

는 당신은 또한 아마 내가 실제로 하나 이상의 구현을했다 때까지이 일을 귀찮게하지 않을 코드의 추가 라인을 제공하지만 쉽게 다른 구현을위한 Service을 교환 할 수 있습니다.

스프링이 자체 가중치 (매우 크고 복잡한 라이브러리)를 가지고 있는지, 특히 스칼라에서보다 간결한 생성자 구문을 사용하고 있는지 확실하지 않습니다. 그러나 Spring을 사용하든 사용하지 않든, 의존성 구성을 분리하고 응용 프로그램을 실제로 사용하지 못하게하는 것이 좋습니다. IMF는 Service을 사용하는 클래스 Foo을 생성자 class Foo(service: Service)을 통해 명시 적으로 받아 들여야하며 Service의 생성/초기화를 해당 클래스/전용 함수로 남겨 두어야합니다.

관련 문제