For some reason the object pointer I am trying to instantiate with @Autowired is never instantiated. I've tried looking at several examples, but nothing seems to work! Here is my code:
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>
Any ideas what on I'm doing wrong?
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>
Try this:
@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 works just with spring beans.
Your object is not a Spring bean, since you're creating it yourself.
You don't have any code to initialize your applicationContext. @ContextConfiguration
, AFAIK, is only used for unit testing.
Spring is not magical, you need to invoke it before it works.
If you use a main method, you need to create your applicationContext yourself, then get your bean from it.
ApplicationContext ctx = new ClasspathXmlApplicationContext("/app-context.xml");
Testing testing = (Testing) ctx.getBean("testing");
The beans will get injected only into spring-managed instances. Since you are creating an instance of Testing
using the new
operator, it won't get the integrationRestService
injected.
what you can do is
Get the instance of testing
from the application context.
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml"); Testing testing = (Testing) context.getBean(Testing.class);
@Configurable
annotation on Testing
class so that instances created using new
operator will also be spring managed. But this is quite a cumbersome process. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");
Testing testing = (Testing) context.getBean(Testing.class);
is well done!
but,use
@Autowired
private Testing testing;
is fail.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.