programing

Spring 프레임워크를 구성하는 방법에는 몇 가지가 있습니까?기술적으로 그들 사이의 차이점은 무엇입니까? (찬성도 반대도 아닙니다.)

css3 2023. 7. 24. 22:44

Spring 프레임워크를 구성하는 방법에는 몇 가지가 있습니까?기술적으로 그들 사이의 차이점은 무엇입니까? (찬성도 반대도 아닙니다.)

저는 이 책을 공부하고 있는데(강력히 추천하고 싶은 책), 저자들이 스프링 프레임워크를 구성할 수 있는 방법을 어떻게 설명하는지 혼란스럽습니다.

여기에서 책에 사용된 코드 예제를 볼 수 있습니다. (누구나 사용할 수 있습니다...)제가 언급하고 있는 코드는 2장의 코드입니다. 참고하시려면.

책에는 스프링 컨테이너를 구성하는 방법이 3가지가 있다고 나와 있습니다.


XML 기반 구성

이 경우 다음과 같은 xml 파일이 필요합니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" ...>

    <bean id="accountService" class="com.wiley.beginningspring.ch2.AccountServiceImpl">
        <property name="accountDao" ref="accountDao"/>
    </bean>
    
    <bean id="accountDao" class="com.wiley.beginningspring.ch2.AccountDaoInMemoryImpl">
    </bean>

</beans>

그런 다음 Spring을 부트스트랩하기 위해 사용될 코드는 다음과 같습니다.

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("/com/wiley/beginningspring/ch2/ch2-beans.xml");

저는 지금 어떤 혼란도 가지고 있지 않습니다.


Java 기반 구성

이 구성 방법에서는 다음과 같은 구성 클래스가 있습니다.

@Configuration
public class Ch2BeanConfiguration {

    @Bean
    public AccountService accountService() {
        AccountServiceImpl bean = new AccountServiceImpl();
        bean.setAccountDao(accountDao());
        return bean;
    }
    
    @Bean
    public AccountDao accountDao() {
        AccountDaoInMemoryImpl bean = new AccountDaoInMemoryImpl();
        return bean;
    }
}

그리고 부트스트랩 스프링을 담당하는 코드는 다음과 같습니다.

ApplicationContext applicationContext
            = new AnnotationConfigApplicationContext(Ch2BeanConfiguration.class);

그래서 여기까지는, 저는 모든 것이 확실합니다. (약간...)또한 여기에는 실제로 @Configuration...이라는 주석이 있습니다.


주석 기반 구성

이 책에서 설명하는 마지막 구성 방법은 주석 기반 구성입니다.

XML 기반 구성에서 사용한 것과 동일한 xml 파일이 있지만 훨씬 더 작은 파일이 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" ...>
    <context:component-scan base-package="com.wiley.beginningspring.ch2"/>
</beans>

모든 콩에는 다음과 같은 주석이 있습니다.

@Component, @Service

등등..

모든 종속성에는 다음과 같은 주석이 있습니다.

@Autowired

콩이 주입될 수 있도록.

이 구성 방법에서 Spring 프레임워크가 부팅되는 방법은 다음과 같습니다.

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("/ch2-beans.xml");

제 질문은 다음과 같습니다.

(일명의) 주석 기반 구성이 실제로 ClassPathXmlApplicationContext를 사용하지만 위의 AnnotationConfigApplicationContext는 사용하지 않는 이유는 무엇입니까?후자는 "주석 기반"이라는 단어가 포함된 구성에서 사용하는 것이 훨씬 더 적합한 것 같습니다.

이 책에서 설명한 Java 기반 구성은 주석 기반 구성이라고 해야 하는 것처럼 보입니다.

그리고 이 책에서 설명한 주석 기반 구성은 제가 보기에 다음과 같습니다. "자동 와이어 콩을 사용한 XML 기반 구성"."Java 기반 구성"에 있는 @Configuration 주석도 없습니다.

Spring 프레임워크를 구성하는 방법에는 몇 가지가 있습니까?

혼동을 피하기 위해 구성 정의와 bean 정의는 서로 다른 것임을 이해해야 합니다.구성을 정의하는 세 가지 방법은 다음과 같습니다. 기본적으로 봄 4에서 사용할 수 있습니다.

  • xml 파일에서 구성을 설명하는 경우 xml 기반 구성;
  • 구성이 Java 클래스인 경우 특정 주석으로 표시된 Java 기반 구성
  • 구성이 그루비 코드를 가진 파일인 경우 그루비 기반 구성;

응용프로그램에 빈 정의를 추가하는 두 가지 방법이 있습니다.

  • 구성에서 선언을 통해 수동으로 빈을 추가하는 경우 빈 정의 내부의 구성.

    이 경우 정의는 구성 유형을 기반으로 합니다. xml-config 파일이 .<bean/> 태그가 있는 구성 - 의 경우, Java 반의메 - 드소@Bean 및 주석및beans {...}그루비 공사.

  • 주석 기반 빈 정의, 특정 주석으로 빈 클래스를 표시하는 경우(예:@Component,@Service,@Controller등). 이 유형의 구성에서는 클래스 경로 검색을 사용합니다.

이 경우 검색 클래스 경로에 대한 지시문을 지정해야 합니다. xml-config 파일이 .<context:component-scan base-package="..."/> java-config - java-config 파일 -@ComponentScan 주석의 경우, 주석ctx.'component-scan'(...)

보시다시피 구성 및 bean 정의를 서로 다른 조합으로 사용할 수 있습니다.

구성을 주입 수 . 으로 xml을 xml 기에구사경는용우 xml 수동로으또는종주)을 할 수 @Autowire,@Required에는 등)을. 나중에 정의해야 할 경우<context:annotation-config/>그러나 빈 정의와 종속성 주입 제어를 혼동하지 마십시오.

이제 이러한 관점을 바탕으로 다음과 같은 질문에 대답해 보겠습니다.

(일명의) 주석 기반 구성이 실제로 ClassPathXmlApplicationContext를 사용하지만 위의 AnnotationConfigApplicationContext는 사용하지 않는 이유는 무엇입니까?

책의 저자는 개념을 혼동했습니다.실제로 이 구성은 주석 기반 빈 정의가 있는 xml 기반 구성입니다.

이 책에서 설명한 Java 기반 구성은 주석 기반 구성이라고 해야 하는 것처럼 보입니다.

맞습니다 - Java 기반 구성은 주석을 실제로 사용하며 주석 기반이라고 할 수 있습니다.하지만 주석은 자바의 일부입니다.또한 이 용어는 문서에 명시된 전통적인 용어입니다.

Spring 프레임워크를 구성하는 방법에는 몇 가지가 있습니까?

기본적으로 구성을 설명하는 세 가지 방법과 콩을 정의하는 두 가지 방법이 있습니다.Spring 프레임워크를 구성하는 6가지 방법이 있습니다(기본값).하지만 물론, 이 모든 방법들은 서로 결합하여 사용될 수 있습니다.

이것을 이해하는 가장 쉬운 방법은 이것이 어떻게 개발되었는지 프레임워크의 오랜 역사를 들여다보는 것입니다.

  • XML 기반 구성 - 처음부터 버전 1 - ClassPathXmlApplicationContext에 대한 javadoc을 참조하십시오.2004년 3월경 J2EE 1.4는 엄청난 xml 구성을 가지고 있었고 Spring은 큰 단순화(XML도 있지만 더 단순함)였습니다.이는 자동 배선 지정을 포함하여 모든 작업에 XML을 사용하거나 직접 사용하는 종속성(ref="accountDao" 예제)을 사용합니다.

  • 주석 기반 구성 - 봄 2.5 - Java EE 5에 대한 대응으로 @Autowired와 같은 새로운 주석이 도입되었으며 XML 파일에는 여전히 일부 컨텍스트 구성이 있습니다. 일반적으로 어떤 패키지를 검색할지 정의하고 나머지는 주석을 기반으로 자동으로 수행됩니다. 따라서 이름이 지정되었습니다.

  • Java 기반 구성은 Spring 3과 함께 제공되었으며 이후 버전에서 개선되었습니다.AnnotationConfigApplicationContext 및 Configuration 주석이 도입되었을 때 XML을 완전히 삭제할 수 있습니다. > java 기반 구성.aop, jdbc 등에 대한 많은 xml 도우미 태그 때문에 버전 4+ 이후에야 실용화되었지만,

이 세 가지 외에도(실제로 2는 1과 2가 동일한 ApplicationContext 클래스를 사용함) 컨텍스트를 만드는 다른 방법이 있습니다.

먼저, 저는 켄 베코프의 더 현명한 답변에 감사드리고 싶습니다.저는 누구나 이 분야에 대해 더 배울 수 있도록 그의 대답을 즉흥적으로 하려고 노력했습니다.

구성 정의:

스프링 4에는 구성을 정의하는 세 가지 방법이 있습니다.그들은 그렇다.

enter image description here

주석의 장점:

  1. 든모.information is in a single file하기 위해 두을 열 가 없습니다).

  2. , 수이바뀌면업,,no need to modify the xml file

  3. 애노테이션은 응용 프로그램 코드를 재팩터링할 때 더 직관적이고 강력하다고 종종 말합니다.또한 guise가 제공하는 것과 같은 더 나은 IDE 지침의 혜택도 받습니다.그러나 애플리케이션 코드와 DI 문제를 혼합합니다.응용프로그램은 프레임워크에 의존하게 됩니다.명확한 분리는 거의 불가능합니다.Annotations are also limited when describing different injection behaviour at the same place (constructor, field) dependent on other circumstances (e.g. robot legs problem).또한 외부 클래스(라이브러리 코드)를 사용자 자신의 소스처럼 취급할 수 없습니다.보다 더 실행되는 으로 간주됩니다. XML은 XML보다 더 실행됩니다.

xml 파일의 장점:

  1. POJO와 POJO 동작 간의 명확한 분리

  2. 어떤 POJO가 동작에 대해 책임이 있는지 모를 때 해당 POJO(모든 소스 코드가 아닌 파일의 하위 집합에서 검색)를 찾는 것이 더 쉽습니다.

  3. XML은 응용 프로그램 코드 자체와 명확하게 구분되어 정의된 선언형 스타일의 유일한 이점을 제공합니다.그것은 DI 문제와 독립적으로 유지됩니다.은 점은단입니다.verbosity,poor re-factoring robustness그리고.a general runtime failure 일반에 비해 이 거의 .Java와 같은 IDE 지원에 비해 이점이 거의 없는 일반(XML) 도구 지원만 있습니다. 이 일반적으로 "XML"과 "XML"이 있습니다.slower than code solutions.

XML 및 주석 기반 링크:

  1. http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/ #beans-consation-config
  2. 주석 대 XML, 장점 및 단점
  3. Java 종속성 주입: XML 또는 주석
  4. 봄 주석 기반 DI 대 xml 구성?
  5. XML 구성 대 주석 기반 구성

그루비 기반 링크:

  1. https://objectpartners.com/2016/01/12/using-groovy-based-spring-configuration/
  2. http://blog.andresteingress.com/2014/02/14/grails-java-based-spring-config/

콩의 정의:

정의가 되는 두 가지 방법이 있습니다.

클래스 경로 검색 중:

xml-config의 경우 다음과 같습니다.<context:component-scan base-package="..."/>java-config의 경우 -@ComponentScan 주석의 경우, 주석ctx.'component-scan'(...)

종속성 주입:

에서 xml은dependency injection에서 수동으로 수행할 수 있습니다.xml또는 를 사용하여annotations(@자동 배선, @필수 등).그런 경우에는 정의할 필요가 있습니다.<context:annotation-config/>

질의응답:

Q1: (일명의) 주석 기반 구성이 실제로 ClassPathXmlApplicationContext를 사용하지만 위의 AnnotationConfigApplicationContext는 사용하지 않는 이유는 무엇입니까?

Ans: 주석 기반 빈 정의가 있는 xml 기반 구성입니다.

응용 프로그램 컨텍스트:

  1. http://docs.spring.io/spring/docs/4.2.0.RELEASE/javadoc-api/org/springframework/context/ApplicationContext.html

AnnotationConfigApplicationContext:

1.NotationConfigApplicationContext상위 컨텍스트

ClassPathXml 응용 프로그램 컨텍스트:

  1. http://www.tutorialspoint.com/spring/spring_applicationcontext_container.htm
  2. http://www.mkyong.com/spring3/spring-3-hello-world-example/

Q2: 이 책에서 설명한 Java 기반 구성은 주석 기반 구성이라고 해야 하는 것처럼 보입니다.

앤스: 그 경우에 대해서는 당신이 옳습니다.Java 기반 구성은 주석을 사용하며 주석 기반 구성이라고 합니다.그러나 주석은 자바의 한 부분일 뿐, 다른 것은 없습니다.

하지만 이 계층 구조가 xml에서 주석 기반으로, 그리고 마지막으로 그루비 기반으로 어떻게 생성되는지 자세히 이해해야 합니다.

XML 설정에 대한 대안은 각도 브래킷 선언 대신 구성 요소를 연결하기 위해 바이트 코드 메타데이터에 의존하는 주석 기반 구성을 통해 제공됩니다.개발자는 빈 배선을 설명하기 위해 XML을 사용하는 대신 관련 클래스, 메서드 또는 필드 선언에 주석을 사용하여 구성 요소 클래스 자체로 구성을 이동합니다."예: 주석과 함께 BeanPostProcessor를 사용하는 필수 주석 BeanPostProcessor"는 Spring IoC 컨테이너를 확장하는 일반적인 수단입니다.예를 들어, Spring 2.0은 필요한 속성을 적용할 수 있는 가능성을 도입했습니다.@Required주석

Spring 2.5는 Spring의 의존성 주입을 촉진하기 위해 동일한 일반적인 접근 방식을 따를 수 있게 했습니다.기본적으로,@Autowired주석은 섹션 6.4.5, "자동 배선 공동작업자"에 설명된 것과 동일한 기능을 제공하지만 보다 세밀한 제어와 광범위한 적용 가능성을 제공합니다.

Spring 2.5는 다음과 같은 JSR-250 주석에 대한 지원을 추가했습니다.@PostConstruct,그리고.@PreDestroy.

다음과 같은 javax.inject 패키지에 포함된 JSR-330(Java용 종속성 주입) 주석에 대한 지원이 봄 3.0에 추가되었습니다.@Inject그리고.@Named이러한 주석에 대한 자세한 내용은 관련 섹션에서 확인할 수 있습니다.

Q3: Spring 프레임워크를 구성하는 방법에는 몇 가지가 있습니까?

응답:

Theoretically,구성을 설명하는 3가지 방법과 콩을 정의하는 2가지 방법.3*2 = 6가지 방법으로 스프링 프레임워크를 구성합니다(기본값).이 모든 방법은 서로 조합하여 사용할 수 있습니다.

But Actually,할 수 .XML또는annotations.

정확히는 아닙니다.스프링 프레임워크를 구성하는 방법은 두 가지뿐입니다.Spring 프레임워크의 두 가지 기본 구성 도구는 다음과 같습니다.

  • XML 파일(Java 파일 외부)
  • Java(5 +) 기반 주석(Java 파일 내부)

두 가지 모두 다음 용도로 사용할 수 있습니다.

  • 응용프로그램 컨텍스트 구성(빈 추가를 의미) - 구체적인 응용프로그램 컨텍스트의 생성자는 xml 파일, 스캔할 패키지 또는 로드할 직접 이름이 지정된 클래스를 허용합니다.
  • 웹 응용 프로그램의 경우 응용 프로그램 컨텍스트 부트스트랩 - 사용web.xml 을 구현하는 하는 것.WebApplicationInitializer

그리고 마지막으로 중요한 것은:

  • 에서 다구사여 xml 에석주스수캔을 을 스캔할 수 .<context:component-scan/>
  • 이 달린 하려면 xml 파일을 합니다.@import

당신의 책에서 자바 기반 구성이라고 불리는 두 번째 방법은 특정 주석입니다.@Configuration주석이 달린 클래스는 일반적으로 응용프로그램 컨텍스트에서 빈이 될 것이지만 다른 빈을 선언할 수도 있습니다.@Bean하나의 방법에 대한 주석.이것이 일반적으로 이러한 클래스가 스캔되는 대신 직접 로드되는 이유입니다.

주석 기반 구성이라고 하는 세 번째 방법은 두 모드를 단순히 혼합하는 것입니다. 두 모드는 상위 레벨에서 xml 구성을 사용하고 패키지에서 추가 빈을 스캔하기만 하면 됩니다.


TL/DR: 스프링 프레임워크에서 애플리케이션 컨텍스트를 구성하는 방법은 두 가지뿐입니다.

  • xml 구성 파일
  • 자바 주석

그리고 그것들은 섞일 수 있습니다.

하지만 모든 콩은 세 가지 방법으로 선언될 수 있습니다.

  • xml 파일에서
  • @Bean부주석 @Configuration이 달린 콩
  • @Component(또는 특중하나주석수)또▁of@Controller,@Service아래)

이제 정확한 질문에 대해 말씀드리겠습니다.

(일명의) 주석 기반 구성이 실제로 ClassPathXmlApplicationContext를 사용하지만 위의 AnnotationConfigApplicationContext는 사용하지 않는 이유는 무엇입니까?

ApplicationContext는 xml 구성 파일에서 먼저 초기화되기 때문입니다.패키지 검색은 나중에 다음 기능을 사용하여 수행됩니다.<context:scan ...> 태그를 합니다.AnnotationConfigApplicationContext구성 클래스 또는 패키지 검색을 통해 직접 초기화하는 경우

이 책에서 설명한 Java 기반 구성은 주석 기반 구성이라고 해야 하는 것처럼 보입니다.

xml이 필요하지 않아 구성에서 Java만 사용하기 때문에 Java 기반이라고 합니다.

저는 그 책을 본 적이 없지만, 당신의 추측은 사실 맞습니다.

Spring 응용 프로그램을 시작하고 XML 구성 빈을 사용하여 프레임워크에서 모든 빈을 인스턴스화하려면 ClassPathXmlApplicationContext를 사용해야 합니다.

봄에 콩을 구성하는 두 가지 방법이 있습니다.

XML 콩 2) 주석 방식

기본적으로 XML 콩은 Spring 2.5-3에서 사용되었으며 Annotations 접근 방식은 Spring 4에서 더 많이 사용되었습니다.

@Bean // is a way to create a bean. It is the equalivant of the beans tag in XML.

@Configuration // is a way to tell the Spring container that this class is a list of configuration beans

스프링에는 2개의 스프링 컨테이너가 있습니다.

BeanFactory 2) 애플리케이션 컨텍스트

BeanFactory는 가장 단순한 컨테이너이며 하나의 구성 파일만 허용합니다.ApplicationContext는 가장 진보된 Spring 컨테이너로, 일련의 구성 파일을 수용하고, JNDI 통합, EJB 통합을 지원하며, 메시지의 국제화를 지원하기 때문에 엔터프라이즈 애플리케이션에 사용됩니다.

그게 도움이 되길 바랍니다.

먼저 코딩의 차이점을 보여드리겠습니다.

  1. XML .<bean/>
  2. Configuration : 를 .@Configuration그리고.@Bean상황에 따라 봄 콩을 등록하는 것.

  3. 석주: 사용을 @Component그리고 그 친구들은 실제로 다음을 사용하여 다른 2명과 함께 사용할 수 있습니다.

    1. 를 사용하여 xml로 표시합니다.<context:component-scan/>
    2. 를 사용한 @ComponentScan

를 사용한 ClassPathXmlApplicationContext 요소 가 xml을 사용했다면 xml을 사용했을 것입니다.@ComponentScan그럼 꼭 쓰겠습니다.AnnotationConfigApplicationContext

그래서 저는 스프링 컨텍스트 xml 또는 java 구성을 초기화하는 두 가지 방법으로 간주합니다. Annotation is 옵션은 둘 중 하나에서 사용하거나 전혀 사용하지 않을 수 있습니다.

스프링 프레임워크를 구성하는 세 가지 방법은 서로 배타적인 것이 아닙니다.사실, 제 생각에는 평균적으로 적어도 두 개는 함께 사용될 것입니다.

주석 기반 구성은 소스 코드 전체에 본질적으로 흩어져 있는 메타데이터에 의존하기 때문에 독립 실행형으로 사용될 가능성이 가장 낮습니다.

AnnotationConfigApplicationContext 순수 주석 기반 컨텍스트를 활성화하는 사용할 수 있지만 다음과 같이 주석이 달린 모든 클래스를 전달해야 합니다.@Component파생물을 한 개)하는 것이 파생물입니다.@Configurationclass -- 이지 않은 .-class(es) -- (.

이것은 XML 또는 Java 구성에서 빈을 정적으로 나열하는 것과 거의 동일하지만, 응용프로그램 컨텍스트 자체를 빌드할 때 코드에서 이 작업을 수행해야 하기 때문에 응용프로그램 컨텍스트를 자동으로 실행하는 다양한 영리한 방법(웹 컨텍스트 등)의 이점을 누릴 수 없기 때문에 유용성이 떨어집니다.

따라서 전체 개체 그래프 메타데이터를 한 번에 구성하고 전체 개체 그래프를 설명하는 "중앙 집중식" 메타데이터에 의존하는 XML 또는 Java 기반 구성에서만 구성할 수 있습니다.

및 기반 방식 에서 이 메타데이터XML 및 Java 반 근 모 중 "에 데 이 타 메 터 식 중 집 앙 서 두 이 식 기 방 접 이 데 터 ▁for "( " 중 메 타 xml ▁java ▁this central ▁( aches)")<beans>또는@Configuration는으로 (으로) 할 수 <bean>또는@Bean를 사용하여) 사용할 수 있습니다.<component-scan>또는@ComponentScan이 두 방식은 " 집중화되지 메타데이터를 을 모두 수 따라서 이 두 가지 접근 방식은 "중앙 집중화되지 않은" 메타데이터를 수집하기 위한 주석 기반 구성의 이점을 모두 얻을 수 있는 거의 동일한 기능을 가진 서로 다른 형식이라고 말하는 것이 합리적입니다.

언급URL : https://stackoverflow.com/questions/35807056/how-many-ways-are-there-to-configure-the-spring-framework-what-are-the-differen