[java] Spring Framework는 정확히 무엇입니까? [닫은]

Spring 에 대해 많은 사람들이 듣고 있습니다. 사람들은 웹에서 Spring이 웹 개발을위한 좋은 프레임 워크라고 말하고 있습니다. Spring Framework는 정확히 무엇입니까?



답변

기본적으로 Spring은 이는 매우 분리 된 시스템을 구축 할 수있는 패턴입니다.

문제

예를 들어, 시스템 사용자를 나열하여 다음과 같은 인터페이스를 선언해야한다고 가정하십시오 UserLister.

public interface UserLister {
    List<User> getUsers();
}

그리고 모든 사용자를 얻기 위해 데이터베이스에 액세스하는 구현 일 수도 있습니다.

public class UserListerDB implements UserLister {
    public List<User> getUsers() {
        // DB access code here
    }
}

보기에는 인스턴스에 액세스해야합니다 (예를 들어, 기억하십시오).

public class SomeView {
    private UserLister userLister;

    public void render() {
        List<User> users = userLister.getUsers();
        view.render(users);
    }
}

위의 코드는 변수를 초기화하지 않았습니다 userLister. 우리는 무엇을해야합니까? 다음과 같이 명시 적으로 객체를 인스턴스화하면 :

UserLister userLister = new UserListerDB();

… DB에 액세스하는 클래스의 구현과 견해를 결합했습니다. DB 구현에서 쉼표로 구분 된 파일에서 사용자 목록을 가져 오는 다른 구현으로 전환하려면 어떻게해야합니까 (예시)? 이 경우 코드로 다시 이동하여 위의 행을 다음과 같이 변경하십시오.

UserLister userLister = new UserListerCommaSeparatedFile();

이와 같은 작은 프로그램에는 아무런 문제가 없지만 수백 개의 뷰와 유사한 수의 비즈니스 클래스가있는 프로그램에서는 어떻게됩니까? 정비는 악몽이된다!

스프링 (의존성 주입) 접근

Spring이하는 일은 XML 파일이나 주석을 사용하여 클래스 를 연결 하는 것입니다. 이렇게하면 모든 객체가 Spring에 의해 인스턴스화되고 초기화되고 올바른 위치 (서블릿, 웹 프레임 워크, 비즈니스 클래스, DAO 등)에 주입 됩니다. …).

Spring의 예제로 돌아가서 userLister필드에 대한 setter 가 있고 다음과 같은 XML 파일이 필요합니다.

<bean id="userLister" class="UserListerDB" />

<bean class="SomeView">
    <property name="userLister" ref="userLister" />
</bean>

또는 단순히 뷰 클래스에 정리 된 파일에 @Inject다음 과 같이 주석을 답니다 .

@Inject
private UserLister userLister;

뷰가 만들어집니다이 방법 마술은 해야합니다 UserLister작업을 준비합니다.

List<User> users = userLister.getUsers();  // This will actually work
                                           // without adding any line of code

대단해! 그렇지 않습니까?

  • UserLister인터페이스의 다른 구현을 사용하려면 어떻게합니까? XML 만 변경하면됩니다.
  • UserLister구현이 준비 되지 않은 경우 어떻게 합니까? 일시적인 모의 구현을 프로그래밍 UserLister하고 뷰 개발을 용이하게합니다.
  • Spring을 더 이상 사용하지 않으려면 어떻게해야합니까? 그냥 사용하지 마십시오! 응용 프로그램이 연결되어 있지 않습니다. 제어 상태 반전 : “응용 프로그램이 프레임 워크를 제어하는 ​​것이 아니라 응용 프로그램이 프레임 워크를 제어합니다”.

의존성 주입에 대한 다른 옵션이 있습니다. 내 의견으로는 Spring의 단순성, 우아함 및 안정성 외에도 SpringSource를 유명하게 만든 이유는 SpringSource의 사람들이 Spring을 다른 많은 공통 프레임 워크와 통합하는 데 도움이되는 많은 POJO를 프로그래밍했다는 것입니다 응용 프로그램에 방해가되지 않습니다. 또한 Spring에는 Spring MVC, Spring WebFlow, Spring Security와 같은 몇 가지 좋은 하위 프로젝트가 있으며 다시 등 다양한 목록이 있습니다.

도움이 되었기를 바랍니다. 어쨌든, 나는 의존성 주입과 제어 반전에 관한 Martin Fowler의 기사 를 읽으십시오 . 기본 사항을 살펴 가지고 이해 한 후 봄 문서를 내 의견으로는, 됩니다 로 사용 지금까지 최고의 봄 책.


답변

봄이 포함 ( Skaffman 바르게 지적 MVC 프레임 워크를). 간단히 말해 여기에 내 의견이 있습니다. Spring은 서비스 계층, 웹 계층 및 비즈니스 계층의 분리를 지원하지만 실제로 가장 잘하는 것은 객체의 “주입”입니다. 따라서 예를 들어 아래 예를 고려하십시오.

public interface FourWheel
{
   public void drive();
}

public class Sedan implements FourWheel
{
   public void drive()
   {
      //drive gracefully
   }
}

public class SUV implements FourWheel
{
   public void drive()
   {
      //Rule the rough terrain
   }
}

이제 코드에는 RoadTrip이라는 클래스가 있습니다.

public class RoadTrip
{
    private FourWheel myCarForTrip;
}

이제 여행 인스턴스를 원할 때마다; 때로는 SUV가 FourWheel을 초기화하거나 때로는 세단을 원할 수도 있습니다. 특정 상황에 따라 실제로 원하는 것에 달려 있습니다.

이 문제를 해결하려면 팩토리 패턴을 생성 패턴으로 사용하려고합니다. 팩토리가 올바른 인스턴스를 반환하는 곳. 결국에는 객체를 올바르게 인스턴스화하기 위해 많은 접착제 코드가 생깁니다. Spring은 글루 코드없이 글루 코드 작업을 가장 잘 수행합니다. XML로 매핑을 선언하면 객체가 자동으로 초기화됩니다. 또한 인스턴스에 싱글 톤 아키텍처를 많이 사용하며 메모리 사용을 최적화하는 데 도움이됩니다.

이를 Inversion Of Control이라고도합니다. 이를위한 다른 프레임 워크는 Google guice, Pico 컨테이너 등입니다.

이 외에도 Spring은 유효성 검사 프레임 워크, JDBC, iBatis 및 Hibernate (및 그 이상)와 공동으로 DAO 계층을 광범위하게 지원합니다. 데이터베이스 트랜잭션에 대한 탁월한 트랜잭션 제어 기능을 제공합니다.

“Pro Spring”과 같은 좋은 책에서 읽을 수있는 Spring에는 더 많은 것이 있습니다.

다음 URL도 도움이 될 수 있습니다.
http://static.springframework.org/docs/Spring-MVC-step-by-step/
http://en.wikipedia.org/wiki/Spring_Framework
http://www.theserverside.com/tt/articles/article .tss? l = SpringFramework


답변

예전에는 Spring 은 ( Guice , PicoContainer , …) 와 같은 의존성 주입 프레임 작업 이었지만 현재는 엔터프라이즈 애플리케이션 을 구축하기위한 토탈 솔루션입니다 .

봄 의존성 주입은 물론 봄의 핵심은 여전히 ​​있으며 (여기에서 다른 좋은 대답을 검토 할 수 있음) 봄부터 더 있습니다 …

Spring은 이제 많은 하위 프로젝트를 가진 많은 프로젝트를 가지고 있습니다 ( http://spring.io/projects ). 누군가가 봄에 대해 이야기 할 때, 그가 이야기 하고있는 봄 프로젝트 , 스프링 프레임 워크 라고 알려진 스프링 코어 또는 다른 봄 프로젝트 인지 알아야 합니다.

너무 언급 할 가치가있는 일부 봄 프로젝트는 다음과 같습니다.

응용 프로그램에 대해 더 많은 기능을 지정해야하는 경우 여기에서도 찾을 수 있습니다.


  • 배치 애플리케이션 개발을 지원하도록 설계된 스프링 배치 배치 프레임 워크
  • HATEOAS 원칙에 기반한 REST API의 Spring HATEOAS 손쉬운 작성
  • 모바일 애플리케이션 개발을위한 Spring MobileSpring Andriod
  • Spring Shell 은 모든 기능을 갖춘 쉘 (일명 명령 행) 애플리케이션을 빌드합니다.
  • 클라우드 애플리케이션을위한 Spring CloudSpring Cloud 데이터 흐름

spring-social-facebook과 같은 작은 프로젝트도 있습니다 ( http://projects.spring.io/spring-social-facebook/ )

Spring Framework 프로젝트의 Spring MVC일부인 모듈 이 있으므로 웹 개발에 spring을 사용할 수 있습니다 . 또는 struts2 와 같은 다른 웹 프레임 워크와 함께 spring을 사용할 수 있습니다 .


답변

Spring이란 무엇입니까? 나는 그 질문에 곧 대답 할 것이지만, 먼저 빅토르 휴고의 예를 다시 살펴 보겠습니다. 새로운 프레임 워크의 필요성을 정당화하지 않기 때문에 좋은 예는 아닙니다.

public class BaseView {
  protected UserLister userLister;

  public BaseView() {
    userLister = new UserListerDB(); // only line of code that needs changing
  }
}

public class SomeView extends BaseView {
  public SomeView() {
    super();
  }

  public void render() {
    List<User> users = userLister.getUsers();
    view.render(users);
  }
}

끝난! 따라서 수백 또는 수천 개의 뷰가 있더라도 Spring XML 접근 방식과 마찬가지로 여전히 한 줄의 코드 만 변경하면됩니다. 그러나 코드 줄을 바꾸려면 여전히 XML 편집과 달리 재 컴파일해야합니까? 내 까다로운 친구 야, 개미와 대본을 써라

그렇다면 Spring은 무엇입니까? 그것은 :

  1. 무리를 따르는 맹인 개발자
  2. Uni에서 그런 프레임 워크를 가르치지 않기 때문에 대학원 프로그래머를 고용하고 싶지 않은 고용주
  3. 나쁜 디자인으로 시작하여 패치 워크가 필요한 프로젝트 (빅터 휴고의 예에서 보듯이)

추가 자료 : http://discuss.joelonsoftware.com/?joel.3.219431.12


답변

아주 간단히 요약하면 Spring은 응용 프로그램에서 “접착제”라고 말할 것입니다. 다른 프레임 워크와 사용자 고유의 코드를 통합하는 데 사용됩니다.


답변

봄은 세 가지입니다.

  1. 스프링은 의존성 주입을 처리하고 의존성 주입에 대한 Martin Fowler의 훌륭한 소개를 읽는 것이 좋습니다.
  2. Spring이 두 번째로하는 일은 애플리케이션에서 사용하기에 매우 훌륭한 방식으로 우수한 Java 라이브러리를 래핑하는 것입니다. 좋은 예는 Spring이 어떻게 Task Executors와 Quartz Scheduler를 감싸는지를보십시오.
  3. 셋째, Spring은 REST, MVC 웹 프레임 워크 등과 같은 여러 가지 웹 구현을 제공합니다. 처음 두 가지에 Spring을 사용하고 있기 때문에 웹 응용 프로그램에 필요한 모든 것에 사용할 수 있습니다.

문제는 Spring DI가 실제로 잘 생각되고 다른 것들을 감싸는 래퍼는 다른 것들이 모든 것을 생각하고 Spring이 멋지게 감싸는다는 점에서 잘 생각된다는 것입니다. MVC와 REST의 스프링 구현과 다른 모든 것들이 잘 수행되지는 않지만 (YMMV, IMHO) 예외가 있습니다 (Spring Security는 다 폭탄입니다). 그래서 DI와 Spring에 멋진 래퍼를 사용하는 경향이 있지만 웹 (Tapestry를 많이 좋아함), REST (Jersey는 정말 강력합니다) 등의 다른 것들을 선호합니다.


답변

Spring을 사용하여 웹 애플리케이션에서 원하는 것-

  • 2.5 이상이 포함 된 Spring MVC를 사용하면 POJO를 컨트롤러 클래스로 사용할 수 있습니다. 즉 Struts 또는 Spring pre-2.5와 같이 특정 프레임 워크에서 확장 할 필요가 없습니다. 컨트롤러 클래스는 의존성 주입 덕분에 테스트하기가 간단합니다.
  • 해당 ORM 솔루션으로 작업을 단순화하는 Hibernate와의 스프링 통합 (대부분의 경우)
  • 웹 응용 프로그램에 Spring을 사용하면 모든 수준의 응용 프로그램에서 도메인 객체를 사용할 수 있습니다. Hibernate를 사용하여 매핑 된 동일한 클래스는 “양식 Bean”으로 사용하는 클래스입니다. 본질적으로 이것은 클래스 수를 줄이므로 부분적으로 더 강력한 도메인 모델로 이어질 것입니다.
  • 스프링 폼 태그를 사용하면 번거 로움없이 쉽게 폼을 만들 수 있습니다.

또한 Spring은 거대합니다. 따라서 Spring AOP 또는 Spring Security와 같은 웹 앱에서 사용하고 싶은 다른 것들이 많이 있습니다. 그러나 위에 나열된 4 가지 사항은 웹 앱에서 사용되는 Spring의 공통 구성 요소를 설명합니다.