2016-08-14 24 views
0

我使用Spring@Autowired注入一個實例到我的主類,但我失敗了。@Autowired不工作,但getBean工程

我有一個名爲OracleClient的接口,一個名爲OracleClientImpl的類實現了前者的接口,它們的內容如下。

OracleClient的

public interface OracleClient { 
    void doSomething(); 
} 

OracleClientImpl

@Service("oracleClient") 
public class OracleClientImpl implements OracleClient { 

    @Override 
    public void doSomething() { 
     System.out.println("doSomething"); 
    } 
} 

而且我已經在我的Spring配置文件中添加如下幾行:

<context:annotation-config/> 
<context:component-scan base-package="com.company" /> 

我主要的類看起來像這樣:

public class App { 

    @Autowired 
    private static OracleClient oracleClient; 

    public static void main(String[] args) throws IOException { 
     ApplicationContext cxt = new ClassPathXmlApplicationContext("spring-config.xml"); 
     oracleClient.doSomething(); 
    } 
} 

它不工作,oracleClient在這種情況下null。但如果我嘗試使用代碼而不是@Autowired代替bean,則將成功注入oracleClient

public class App { 

    public static void main(String[] args) throws IOException { 
     ApplicationContext cxt = new ClassPathXmlApplicationContext("spring-config.xml"); 
     OracleClient oracleClient = (OracleClientImpl) cxt.getBean("oracleClient"); 
     oracleClient.doSomething(); 
    } 
} 

我想知道爲什麼。有沒有辦法讓它通過@Autowired工作?

回答

-1

你聲明oracleClient靜態變量是不正確的@ @ AutoWired相當於一個setter方法,你如何讓Spring做一個靜態setter方法,所以你應該刪除static關鍵字,它應該沒問題。

+0

不,我刪除了'static'關鍵字,但它仍然不起作用。我需要在某處設置setter/getter方法嗎? – Searene

+0

哦,夥計,你在開玩笑嗎?你知道@Autowired的用法嗎?這意味着你將自動裝配的元素放到spring容器中。在你將它推入容器之後,你仍然需要從main方法的容器中獲取它的實例。 – Crabime

相關問題