11

스프링 3.0을 사용하는 웹 애플리케이션이 있습니다. 커스텀 메소드를 사용하여 클래스를 appcontext xml에 정의 된 bean을 사용하는 cron에서 실행해야합니다 (컴포넌트 스캔 annocations 사용). 같은 src 디렉토리에 내 메인 클래스가 있습니다. 웹 컨텍스트의 bean을 main 메소드에 삽입하려면 어떻게해야합니까? 내가 사용하려고 했어메인 메소드 클래스의 스프링 빈 주입

ApplicationContext context = new ClassPathXmlApplicationContext("appservlet.xml"); 

나는 AutoWired를 사용하려고했는데 null 빈을 반환했다. 그래서 Application Ctx를 사용했고 main 메소드를 실행할 때 (예상대로) 새로운 컨텍스트를 생성하고 있습니다. 하지만 컨테이너에서 기존 빈을 사용할 수도 있습니다.

@Autowired 
static DAO dao; 

    public static void main(String[] args) { 
       ApplicationContext context = new ClassPathXmlApplicationContext("xman-   servlet.xml"); 
    TableClient client = context.getBean(TableClient.class); 
    client.start(context); 

} 
+1

향후 독자를 위해 밀접한 관련 질문 : http://stackoverflow.com/questions/3659720/spring-3-autowire-in-standalone-application – Jonik

답변

1

주 응용 프로그램에 스프링 컨텍스트를 사용하고 webapp와 동일한 bean을 재사용 할 수 있습니다. 웹 애플리케이션 컨텍스트 (요청 범위, 웹 컨트롤러 등)에서만 의미있는 bean을 정의하지 않는다면 일부 Spring XML 구성 파일을 재사용 할 수도 있습니다.

그러나 두 개의 JVM이 실행 중이므로 다른 인스턴스가 생성됩니다. 정말로 같은 bean 인스턴스를 재사용하고 싶다면 메인 클래스는 웹 서비스 또는 HttpInvoker를 사용하여 웹 애플리케이션에서 빈의 메소드를 원격으로 호출해야합니다.

4

스프링으로 생성되지 않은 객체에는 스프링 빈을 삽입 할 수 없습니다. 이것을 말하는 또 다른 방법은 Spring이 관리하는 객체에만 삽입 할 수 있다는 것입니다.

컨텍스트를 작성 중이므로 DAO 오브젝트에 대해 getBean을 호출해야합니다.

체크 아웃 Spring Batch 유용 할 수도 있습니다.

2

이 홈페이지에보십시오 :

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("classpath*:/META-INF/spring/applicationContext*.xml"); 
     System.out.println("The method of my Bean: " + myBean.getStr()); 
    } 
} 

을 그리고이 콩 :

@Service 
public class MyBean { 
    public String getStr() { 
     return "mybean!"; 
    } 
} 
1

봄 부팅이 공식 솔루션을 제공합니다.

https://start.spring.io/

에서 골격을 다운로드하고 pom.xml 파일에서 확인 포장이 항아리로 설정되어 있는지 확인합니다. 웹 종속성을 포함하지 않는 한 응용 프로그램은 콘솔 응용 프로그램으로 유지됩니다.