2016-08-14 79 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