Spring 에 대해 많은 사람들이 듣고 있습니다. 사람들은 웹에서 Spring이 웹 개발을위한 좋은 프레임 워크라고 말하고 있습니다. 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의 단순성, 우아함 및 안정성 외에도 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 ). 누군가가 봄에 대해 이야기 할 때, 그가 이야기 하고있는 봄 프로젝트 , 스프링 프레임 워크 라고 알려진 스프링 코어 또는 다른 봄 프로젝트 인지 알아야 합니다.
너무 언급 할 가치가있는 일부 봄 프로젝트는 다음과 같습니다.
응용 프로그램에 대해 더 많은 기능을 지정해야하는 경우 여기에서도 찾을 수 있습니다.
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은 무엇입니까? 그것은 :
UserLister
) 만 필요하기 때문에 예제가 작동 하지만 여러 서비스가 필요한 경우 다른 자녀 와 공유하지 않는 경우 는 BaseView
어떻습니까? Java에는 (다행히) 다중 상속이 없습니다.
봄은 세 가지입니다.
문제는 Spring DI가 실제로 잘 생각되고 다른 것들을 감싸는 래퍼는 다른 것들이 모든 것을 생각하고 Spring이 멋지게 감싸는다는 점에서 잘 생각된다는 것입니다. MVC와 REST의 스프링 구현과 다른 모든 것들이 잘 수행되지는 않지만 (YMMV, IMHO) 예외가 있습니다 (Spring Security는 다 폭탄입니다). 그래서 DI와 Spring에 멋진 래퍼를 사용하는 경향이 있지만 웹 (Tapestry를 많이 좋아함), REST (Jersey는 정말 강력합니다) 등의 다른 것들을 선호합니다.
Spring을 사용하여 웹 애플리케이션에서 원하는 것-
또한 Spring은 거대합니다. 따라서 Spring AOP 또는 Spring Security와 같은 웹 앱에서 사용하고 싶은 다른 것들이 많이 있습니다. 그러나 위에 나열된 4 가지 사항은 웹 앱에서 사용되는 Spring의 공통 구성 요소를 설명합니다.
이 부분에 두 부분이 있습니다.
Spring MVC를 사용하지 않고도 웹 애플리케이션에서 Spring을 완벽하게 사용할 수 있습니다. Wicket, Struts, Seam 등과 같은 다른 웹 프레임 워크를 사용하면서 대부분의 Java 웹 응용 프로그램 이이 작업을 수행한다고 말합니다.
Spring은 클래스 인스턴스를 함께 붙이기에 좋습니다. 당신은 당신의 Hibernate 클래스들이 항상 데이터 소스를 필요로한다는 것을 알고있다.
데이터 액세스 객체는 항상 Hibernate 액세스가 필요합니다. Spring은 Hibernate 클래스를 DAO에 연결합니다.
또한 Spring은 기본적으로 여러 라이브러리의 견고한 구성을 제공하며, 그에 따라 사용할 라이브러리에 대한 지침을 제공합니다.
봄은 정말 훌륭한 도구입니다. (저는 기본 프레임 워크 인 Spring MVC에 대해 이야기하지 않았습니다).
Spring이 구성에 대한 다양한 주석을 지원하기 때문에 허용 된 답변에는 주석 사용법이 포함되지 않습니다.
XML 파일을 사용하여 클래스를 연결하는 또 다른 방법은 주석입니다. 이제 허용 대답에서 예제를 사용하자 주석 중 하나를 사용하여 클래스에서 직접 콩을 등록 @Component
, @Service
, @Repository
또는를 @Configuration
:
@Component
public class UserListerDB implements UserLister {
public List<User> getUsers() {
// DB access code here
}
}
이 방법으로 뷰를 만들면 마술처럼 UserLister를 사용할 수 있습니다.
위의 진술은 XML 파일 사용이 필요없고 @Autowired
관련 구현을 찾아서 삽입하는 다른 주석과의 배선이 필요없는 약간의 보너스로 유효합니다 .
@Autowired
private UserLister userLister;
@Bean
Bean 구현을 주입하는 데 사용되는 메소드에 주석을 사용하십시오 .
@Bean
수업 수준 에서는 주석을 사용할 수 없습니다 . 중 하나 여야합니다 @Component
, @Service
, @Repository
등 나머지 맞습니다. 이런 방식으로 인터페이스 자동 배선은 주입에 적합한 클래스 경로에 후보 클래스가 하나만있는 경우에만 작동하고 그렇지 않으면 스프링 애플리케이션 오류가 발생 함을 지적해야합니다.
장점은 의존성 주입 (DI) 입니다. 객체 생성 작업을 아웃소싱하는 것을 의미합니다. 예를 들어 설명하겠습니다.
public interface Lunch
{
public void eat();
}
public class Buffet implements Lunch
{
public void eat()
{
// Eat as much as you can
}
}
public class Plated implements Lunch
{
public void eat()
{
// Eat a limited portion
}
}
이제 내 코드에는 다음과 같이 LunchDecide 클래스가 있습니다.
public class LunchDecide {
private Lunch todaysLunch;
public LunchDecide(){
this.todaysLunch = new Buffet(); // choose Buffet -> eat as much as you want
//this.todaysLunch = new Plated(); // choose Plated -> eat a limited portion
}
}
위의 클래스에서는 기분에 따라 Buffet () 또는 Plated ()를 선택합니다. 그러나이 시스템은 밀접하게 연결되어 있습니다. 다른 유형의 Object가 필요할 때마다 코드를 변경해야합니다. 이 경우 줄을 주석 처리하십시오! 50 명의 다른 사람들이 사용하는 50 개의 다른 클래스가 있다고 상상해보십시오. 엉망이 될 것입니다. 이 경우 시스템을 분리해야합니다. LunchDecide 클래스를 다시 작성해 봅시다.
public class LunchDecide {
private Lunch todaysLunch;
public LunchDecide(Lunch todaysLunch){
this.todaysLunch = todaysLunch
}
}
new 키워드를 사용하여 객체를 만드는 대신 점심 유형의 객체에 대한 참조를 생성자에 매개 변수로 전달했습니다. 여기서는 객체 생성이 아웃소싱됩니다. 이 코드는 Xml 구성 파일 (레거시) 또는 Java 주석 (현대)을 사용하여 연결할 수 있습니다. 어느 쪽이든, 어떤 유형의 객체가 만들어 질지에 대한 결정은 런타임 중에 수행됩니다. Xml에 의해 코드에 객체가 주입됩니다. 코드는 해당 작업의 Xml에 의존합니다. 따라서 의존성 주입 (DI). DI는 시스템을 느슨하게 연결하는 데 도움이 될뿐만 아니라 종속성을 조롱 할 수 있기 때문에 단위 테스트 작성을 단순화합니다. 마지막으로 DI는 AOP (Aspect Oriented Programming)를 간소화하여 모듈의 추가 분리 및 증가로 이어집니다. 또한 위의 DI는 생성자 주입입니다.
Spring Framework help you with several things like, don't reinvent the wheel. you can connect very easily with some database just using Spring Data, or create schedule tasks like CronJob or Windows Task. amazing !
Spring은 EJB (Enterprise JavaBeans) 기술 의 좋은 대안 입니다. 또한 웹 프레임 워크 및 웹 서비스 프레임 워크 구성 요소가 있습니다.
Spring은 매우 간단한 의존성 주입 시스템으로 시작했습니다. 이제는 거대하고 그 안에 모든 것이 있습니다 (잠정적 인 부엌 싱크대 제외).
그러나 걱정하지 마십시오. 모듈 식이므로 원하는 조각 만 사용할 수 있습니다.
모든 것이 시작된 곳을 보려면 :
오래되었지만 훌륭한 책입니다.
이번에 스프링에 전념 한 또 다른 좋은 책은 다음을 참조하십시오.
또한 이전 버전의 Spring을 참조하지만 확실히 볼 가치가 있습니다.
Spring은 처음에는 의존성 주입이었고 거의 모든 것 (JPA 구현에 대한 래퍼)에 래퍼 킹을 추가했습니다.
긴 이야기 ... Spring preffer XML 솔루션 (XML 스크립팅 엔진 ... brrrr)의 대부분은 DI이므로 Guice를 사용합니다.
좋은 라이브러리이지만 점점 커지는 depnedenciec와 함께 Spring JDBC (실제 이름 매개 변수가있는 Java jdbc 솔루션 일 수 있음)는 다음 4-5에서 가져옵니다.
웹 개발을 위해 Spring MVC ( "빅 스프링"의 일부)를 사용합니다 ... "요청 기반"프레임 워크입니다. "요청 대 컴포넌트"라는 거룩한 전쟁이 있습니다 ...
과거에는 순수한 기술적 관점에서 스프링 프레임 워크에 대해 생각했습니다.
팀 작업 경험과 엔터프라이즈 웹 애플리케이션 개발 경험을 감안할 때 Spring은 개별 요소 (빈)를 분리 하여 애플리케이션 (웹 애플리케이션) 을 더 빠르게 개발 하기위한 것 입니다. 개발 속도가 빠르면 인기가 높아집니다. Spring은 애플리케이션을 Spring 프레임 워크에 빌드 (배선)하는 책임을 바꿉니다. 스프링 프레임 워크의 의존성 주입 은 개별 빈을 작동하는 애플리케이션에 연결 / 배선하는 역할을한다.
이런 식으로 개발자는 Bean 간의 인터페이스가 정의되는 즉시 개별 컴포넌트 (beans) 개발에 더 집중할 수 있습니다.
이러한 응용 프로그램의 테스트는 쉽습니다. 개별 빈에 중점을 둡니다. 쉽게 분리하고 조롱 할 수 있으므로 단위 테스트가 빠르고 효율적입니다.
Spring 프레임 워크는 웹 목적을 제공하기 위해 @Controller ( @Restcontroller ), @Repository , @Component 와 같은 여러 특수화 된 Bean을 정의 합니다. Maven과 함께 Spring은 개발자에게 직관적 인 구조를 제공합니다. 개별 요소가 분리되어 재사용 될 수 있으므로 팀 작업이 쉽고 빠릅니다.
스프링 프레임 워크는 웹 개발에 적합하고 편안한 API 서비스에 더 구체적입니다.
스프링 보안 , 스프링 aop , mvc 프레임 워크 , 마이크로 서비스 와 같은 다른 모듈과 의 의존성 주입 및 통합으로 인해 위의 이점에 적합합니다.
모든 응용 프로그램에서 보안은 아마도 요구 사항 일 것입니다.
긴 유지 관리가 필요한 제품을 구축하려는 경우 Aop 개념을 활용해야합니다.
애플리케이션에 많은 트래픽이 발생하여로드가 증가하는 경우 마이크로 서비스 개념을 사용해야합니다.
Spring은 이러한 모든 기능을 하나의 플랫폼에서 제공합니다. 많은 모듈을 지원 합니다 .
가장 중요한 것은 스프링은 오픈 소스 이며 확장 가능한 프레임 워크이며, 라이프 사이클에서 커스텀 코드를 통합 할 수있는 곳이라면 어디든지 갈고리가 있습니다.
Spring Data 는 프로젝트와의 통합을 제공하는 하나의 프로젝트입니다.
따라서 스프링은 거의 모든 요구 사항에 적합합니다.