2012-10-22 64 views
4

出于某种原因,我试图用@Autowired实例化的对象指针从未实例化。我试过看几个例子,但似乎没有任何工作!这里是我的代码:为什么我的变量不能自动装配?

Testing.java

package com.example.core.service.integration; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.test.context.ContextConfiguration; 

@ContextConfiguration(locations={"/app-context.xml"}) 
public class Testing { 

@Autowired 
private IntegrationRestService integrationRestService; 

public static void main(String args[]) { 
    Testing t = new Testing(); 
    t.checkNull(); 
} 

private void checkNull() { 
    if(integrationRestService == null) System.err.println("FAIL..."); 
    else System.out.println("SUCCESS!"); 
} 

} 

IntegrationTestService.java

public interface IntegrationRestService { 

public FindSomething getFindSomethingResponse(String a, int b, int c); 

public FindSomethingElse getFindSomethingElseResponse(String urlToRead); 
} 

IntegrationRestServiceImpl.java

@Service 
@Path("/test") 
public class IntegrationRestServiceImpl implements IntegrationRestService { 


    public IntegrationRestServiceImpl() { 
     super(); 
    } 
    ... 
} 

APP-context.xml中

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


<!-- JSR-303 support will be detected on classpath and enabled automatically --> 
<context:annotation-config/> 

<context:component-scan base-package="com.example.core"/> 


<bean id="IntegrationRestService" class="com.example.core.service.integration.IntegrationRestServiceImpl" /> 
<bean id="Testing" class="com.example.core.service.integration.Testing" /> 

</beans> 

任何想法我做错了什么?

答:

Testing.java

@Service 
public class Testing { 

@Autowired 
private IntegrationRestService integrationRestService; 

public static void main(String args[]) { 
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/META-INF/spring/app-context.xml"); 
    Testing testing = (Testing) context.getBean(Testing.class); 
    testing.checkNull(); 
} 


private void checkNull() { 
    if(integrationRestService == null) System.err.println("FAIL..."); 
    else System.out.println("SUCCESS!"); 
} 

} 

APP-context.xml中

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


<!-- JSR-303 support will be detected on classpath and enabled automatically --> 
<context:annotation-config/> 

<context:component-scan base-package="com.example.core"/> 

<bean id="testing" class="com.example.core.service.integration.Testing"/> 

<bean id="integrationRestService" class="com.example.core.service.integration.IntegrationRestServiceImpl" /> 

</beans> 

回答

3

试试这个:

@Service 
public class Testing { 

@Autowired 
private IntegrationRestService integrationRestService; 

public static void main(String args[]) { 
    final AbstractApplicationContext context = new ClassPathXmlApplicationContext("/app-context.xml"); 
    Testing t = context.getBean(Testing.class); 
    t.checkNull(); 
} 

private void checkNull() { 
    if(integrationRestService == null) System.err.println("FAIL..."); 
    else System.out.println("SUCCESS!"); 
} 

} 

@Autowired工作只是春天豆。

+0

谢谢!这解决了我的问题:) – kajafls

0

豆将得到仅注射到明年春季管理实例。由于您使用new运算符创建Testing的实例,因此它将不会注入integrationRestService

你可以做的是

  • 从应用程序上下文获得的testing实例。

    ClassPathXmlApplicationContext context = 
        new ClassPathXmlApplicationContext("Spring.xml"); 
    Testing testing = (Testing) context.getBean(Testing.class); 
    
  • 使用上Testing@Configurable注释,以便使用new运营商创建的实例也将春季管理。但这是一个非常麻烦的过程。
+0

谢谢,以前不知道这个! – kajafls

2

你的对象不是Spring bean,因为你自己创建它。

您没有任何代码来初始化您的applicationContext。 AFEK仅用于单元测试。

Spring并不神奇,你需要在它工作之前调用它。

如果您使用主要方法,您需要自己创建您的applicationContext,然后从中获取您的bean。

ApplicationContext ctx = new ClasspathXmlApplicationContext("/app-context.xml"); 
Testing testing = (Testing) ctx.getBean("testing"); 
+0

是的,这是我的应用程序的问题!感谢您的反馈! – kajafls

-1
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml"); 
Testing testing = (Testing) context.getBean(Testing.class); 

做得很不错!

但是,使用

@Autowired 
private Testing testing; 

的失败。

相关问题