복붙노트

[SPRING] 독립 실행 형 Java 응용 프로그램에서 Spring 3 자동 배선 사용

SPRING

독립 실행 형 Java 응용 프로그램에서 Spring 3 자동 배선 사용

여기 내 코드가 있습니다 :

public class Main {

    public static void main(String[] args) {
        Main p = new Main();
        p.start(args);
    }

    @Autowired
    private MyBean myBean;
    private void start(String[] args) {
        ApplicationContext context = 
            new ClassPathXmlApplicationContext("META-INF/config.xml");
        System.out.println("my beans method: " + myBean.getStr());
    }
}

@Service 
public class MyBean {
    public String getStr() {
        return "string";
    }
}
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
    <context:annotation-config /> 
    <context:component-scan base-package="mypackage"/>
</beans>

왜이 기능이 작동하지 않습니까? NullPointerException이 발생합니다. 독립 실행 형 응용 프로그램에서 자동 와이어 링을 사용할 수 있습니까?

해결법

  1. ==============================

    1.Spring은 독립 실행 형 응용 프로그램에서 작동합니다. 스프링 빈을 만드는 데 잘못된 방법을 사용하고 있습니다. 이렇게하는 올바른 방법은 다음과 같습니다.

    Spring은 독립 실행 형 응용 프로그램에서 작동합니다. 스프링 빈을 만드는 데 잘못된 방법을 사용하고 있습니다. 이렇게하는 올바른 방법은 다음과 같습니다.

    @Component
    public class Main {
    
        public static void main(String[] args) {
            ApplicationContext context = 
                new ClassPathXmlApplicationContext("META-INF/config.xml");
    
            Main p = context.getBean(Main.class);
            p.start(args);
        }
    
        @Autowired
        private MyBean myBean;
        private void start(String[] args) {
            System.out.println("my beans method: " + myBean.getStr());
        }
    }
    
    @Service 
    public class MyBean {
        public String getStr() {
            return "string";
        }
    }
    

    첫 번째 경우 (질문에서), Spring 컨텍스트에서 가져 오는 것이 아니라 직접 작성하는 것입니다. 그래서 Spring은 종속성을 Autowire 할 기회를 얻지 못한다. (NullPointerException이 발생한다.)

    두 번째 경우 (이 답변에있는)에서는 Spring 컨텍스트에서 bean을 얻습니다. 따라서 Spring은 관리되고 Spring은 autowiring을 처리합니다.

  2. ==============================

    2.Spring은 XML 파일에서 멀어지고 주석을 많이 사용합니다. 다음 예제는 XML 파일 대신 주석을 사용하는 간단한 독립형 Spring 애플리케이션이다.

    Spring은 XML 파일에서 멀어지고 주석을 많이 사용합니다. 다음 예제는 XML 파일 대신 주석을 사용하는 간단한 독립형 Spring 애플리케이션이다.

    package com.zetcode.bean;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class Message {
    
       private String message = "Hello there!";
    
       public void setMessage(String message){
    
          this.message  = message;
       }
    
       public String getMessage(){
    
          return message;
       }
    }
    

    이것은 단순한 bean입니다. Spring 컨테이너에 의한 자동 탐지를 위해 @Component 어노테이션으로 장식되어있다.

    package com.zetcode.main;
    
    import com.zetcode.bean.Message;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.annotation.ComponentScan;
    
    @ComponentScan(basePackages = "com.zetcode")
    public class Application {
    
        public static void main(String[] args) {
    
            ApplicationContext context
                    = new AnnotationConfigApplicationContext(Application.class);
    
            Application p = context.getBean(Application.class);
            p.start();
        }
    
        @Autowired
        private Message message;
        private void start() {
            System.out.println("Message: " + message.getMessage());
        }
    }
    

    이것이 주요 Application 클래스입니다. @ComponentScan 주석은 구성 요소를 검색합니다. @Autowired 어노테이션은 빈을 메시지 변수에 삽입합니다. AnnotationConfigApplicationContext는 Spring 애플리케이션 컨텍스트를 생성하는 데 사용된다.

    My Standalone Spring 튜토리얼에서는 XML과 주석을 사용하여 독립형 Spring 애플리케이션을 작성하는 방법을 보여줍니다.

  3. ==============================

    3.Spring 4의 경우 Spring Boot를 사용하면 ApplicationContext에서 Bean을 직접 가져 오는 anti-pattern을 사용하지 않고 다음 예제를 사용할 수있다.

    Spring 4의 경우 Spring Boot를 사용하면 ApplicationContext에서 Bean을 직접 가져 오는 anti-pattern을 사용하지 않고 다음 예제를 사용할 수있다.

    package com.yourproject;
    
    @SpringBootApplication
    public class TestBed implements CommandLineRunner {
    
        private MyService myService;
    
        @Autowired
        public TestBed(MyService myService){
            this.myService = myService;
        }
    
        public static void main(String... args) {
            SpringApplication.run(TestBed.class, args);
        }
    
        @Override
        public void run(String... strings) throws Exception {
            System.out.println("myService: " + MyService );
        }
    
    }
    
    @Service 
    public class MyService{
        public String getSomething() {
            return "something";
        }
    }
    

    삽입 된 모든 서비스가 com.yourproject 또는 하위 패키지에 있는지 확인하십시오.

  4. from https://stackoverflow.com/questions/3659720/using-spring-3-autowire-in-a-standalone-java-application by cc-by-sa and MIT license