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 ). 누군가가 봄에 대해 이야기 할 때, 그가 이야기 하고있는 봄 프로젝트 , 스프링 프레임 워크 라고 알려진 스프링 코어 또는 다른 봄 프로젝트 인지 알아야 합니다.
너무 언급 할 가치가있는 일부 봄 프로젝트는 다음과 같습니다.
- 스프링 보안 -http : //projects.spring.io/spring-security/
- 스프링 웹 서비스-http : //projects.spring.io/spring-ws/
- 스프링 통합 -http : //projects.spring.io/spring-integration/
응용 프로그램에 대해 더 많은 기능을 지정해야하는 경우 여기에서도 찾을 수 있습니다.
배치 애플리케이션 개발을 지원하도록 설계된 스프링 배치 배치 프레임 워크- HATEOAS 원칙에 기반한 REST API의 Spring HATEOAS 손쉬운 작성
- 모바일 애플리케이션 개발을위한 Spring Mobile 및 Spring Andriod
- Spring Shell 은 모든 기능을 갖춘 쉘 (일명 명령 행) 애플리케이션을 빌드합니다.
- 클라우드 애플리케이션을위한 Spring Cloud 및 Spring 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은 무엇입니까? 그것은 :
- 무리를 따르는 맹인 개발자
- Uni에서 그런 프레임 워크를 가르치지 않기 때문에 대학원 프로그래머를 고용하고 싶지 않은 고용주
- 나쁜 디자인으로 시작하여 패치 워크가 필요한 프로젝트 (빅터 휴고의 예에서 보듯이)
답변
아주 간단히 요약하면 Spring은 응용 프로그램에서 “접착제”라고 말할 것입니다. 다른 프레임 워크와 사용자 고유의 코드를 통합하는 데 사용됩니다.
답변
봄은 세 가지입니다.
- 스프링은 의존성 주입을 처리하고 의존성 주입에 대한 Martin Fowler의 훌륭한 소개를 읽는 것이 좋습니다.
- Spring이 두 번째로하는 일은 애플리케이션에서 사용하기에 매우 훌륭한 방식으로 우수한 Java 라이브러리를 래핑하는 것입니다. 좋은 예는 Spring이 어떻게 Task Executors와 Quartz Scheduler를 감싸는지를보십시오.
- 셋째, 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의 공통 구성 요소를 설명합니다.