2010-09-07 58 views
56

這裏是我的代碼:在獨立使用Spring 3自動裝配的Java應用程序

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。是否可以在獨立應用程序中使用自動裝配?

+0

盡一切努力使您的問題可讀。並向我們​​展示異常堆棧跟蹤。 – skaffman 2010-09-07 14:45:47

+0

我在這裏維護一個操作示例:http://tshikatshikaaa.blogspot.com/2012/08/spring-ioc-container-with-annotations.html – JVerstry 2012-11-27 16:22:49

回答

118

春天在獨立應用程序中工作。你正在用錯誤的方式創建一個spring bean。正確的方法做到這一點是這樣的:

@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上下文得到它。所以春天沒有得到機會Autowire的依賴關係(這導致NullPointerException)。

在第二種情況下(這個答案中的那個),你從Spring上下文獲得bean,因此它是Spring管理的並且Spring處理autowiring

+0

是不是@Autowired的全面策略?無論哪種情況,spring都會管理對象創建none,但不能將@Autowired添加到callstack中的某些字段,並用新的..()實例化它們。 – Cojones 2011-03-18 17:16:04

+0

如果您的調用堆棧中只有一個對象使用新的..()實例化,它將無法正常工作? – Cojones 2011-03-18 17:23:13

+2

@Cojones,你可以自動裝載一些bean並用new創建其他bean,否則你將如何能夠調用'new ArrayList()',例如?如果你有一個帶有自動裝配參數的類,並用'new'實例化,那麼自動裝配就不會發生。 – Paul 2011-07-30 19:24:17

12

Spring正在離開XML文件並大量使用註釋。以下示例是一個簡單的獨立Spring應用程序,它使用註釋而不是XML文件。

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。它用@Component註釋來裝飾Spring容器的自動檢測。

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註釋將bean注入message變量。 AnnotationConfigApplicationContext用於創建Spring應用程序上下文。我的Standalone Spring tutorial顯示瞭如何使用XML和註解創建獨立的Spring應用程序。

0

春天4,使用Spring啓動,我們可以有下面的例子,而不使用在ApplicationContext中直接獲得豆的反模式:

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或下其子包。