2013-06-27 76 views
1

我spring.xml是如下如何在春季使用@Autowired

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:oxm="http://www.springframework.org/schema/oxm" xmlns:p="http://www.springframework.org/schema/p" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.2.xsd 

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

</beans> 

和我的Test1类

package com.mkyong.service; 

import org.springframework.stereotype.Component; 
@Component("test1") 
public class Test1 { 
public int i=1; 
} 

我有一个App类

package com.mkyong.common; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

import com.mkyong.service.Test1; 

public class App 
{ 
    @Autowired 
    Test1 test1; 

    public static void main(String[] args) 
    { 
     ApplicationContext context = new ClassPathXmlApplicationContext(
       "spring.xml"); 
     App app=new App(); 

     System.out.println(app.test1); 
    } 

} 

但我得到输出为null.I不能Autowire它正确。我在做错了吗?

+0

的[为什么我的春节@Autowired场空?]可能重复(http://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null) – chrylis

回答

8

当你这样做:

App app=new App(); 

它创建应用程序的新实例,是不是由Spring管理,所以你不会有自动装配组件。

您需要在Spring的XML声明应用程序bean,然后使用检索context.getBean("beanName")

例如在Spring XML,你可以声明豆是这样的:

<bean id="app" class="com.mkyong.common.App" /> 

,然后用context.getBean("app")检索回来那么它将有自动装配Autowired组件。

+1

感谢花花公子。现在它工作正常。我也从你的答案中学到了东西。再次感谢。顺便说一下,你知道为什么不允许在6分钟内接受答案吗? –

+1

@SanjayaLiyanage阅读[this](http://meta.stackexchange.com/a/50703/219240):*理由是,如果人们在几分钟甚至几秒内(无笑话)接受答案,他们甚至没有有时间正确评估或测试答案。* – NINCOMPOOP

+0

@TheNewIdiot是正确的。谢谢你 –

4

您不必使用context.getBean("beanName")来搜索您的bean。这对Spring框架引入了不必要的依赖。这不是很干净。

它可以更好地与@Configurable进行注解你App类。

... 
@Configurable 
public class App 
{ 
    @Autowired 
    Test1 test1; 
... 

,并添加到您的spring.xml一个标签:

<context:spring-configured /> 

这就是所有。现在,您可以按照自己的想法创建自己的App课程,并自动安装。

... 
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 
App app=new App(); 
System.out.println(app.test1); 
... 

注意:在classpath中需要spring-aop,spring-aop,aspectjrt。

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-aspects</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-aop</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjrt</artifactId> 
</dependency> 
+1

感谢朋友。这真的很有帮助。如果这很快,我可以接受这个答案。无论如何,这里是我的完美答案upvote。 –

+0

一台电脑工作,但在另一个相同的项目打印null System.out.println(app.test1);在我做出改变后,你问了一些想法 –