我能够使用RestTemplate并自动装配它。但是,我想将我的其余模板相关的代码部分移动到另一个类中,如下所示:
public class Bridge {
private final String BASE_URL = "http://localhost:8080/u";
@Autowired
RestTemplate restTemplate;
public void addW() {
Map<String, String> x = new HashMap<String, String>();
W c = restTemplate.getForObject(BASE_URL + "/device/yeni", W.class, x);
System.out.println("Here!");
}
}
在另一个班级,我称之为:
...
Bridge wb = new Bridge();
wb.addW();
...
我是Spring和依赖注入术语的新手。我的restTemplate
变量为null并抛出异常。我该怎么做才能解决它(我不知道它与我使用new
关键字有关)?
答案 0 :(得分:11)
使用Bridge wb = new Bridge()
不能用于依赖注入。您的restTemplate
未被注入,因为wb
未由Spring管理。
你必须让自己的Bridge
成为一个Spring bean,例如通过注释:
@Service
public class Bridge {
// ...
}
或通过bean声明:
<bean id="bridge" class="Bridge"/>
答案 1 :(得分:6)
进一步补充Jeha的正确答案。
目前,通过做
Bridge wb = new Bridge();
意味着,该对象实例不是“Spring Managed” - 即。 Spring对此一无所知。那么它怎么能注入一个它一无所知的依赖。
所以Jeha说。添加@Service注释或在应用程序上下文xml配置文件中指定它(或者如果您使用的是Spring {3 {3}}对象)
然后当Spring上下文启动时,BeanFactory中将会有一个Bridge.class的Singleton(默认行为)实例。将其注入到其他Spring-Managed对象中,或者手动将其拉出,例如
Bridge wb = (Bridge) applicationContext.getBean("bridge"); // Name comes from the default of the class
现在它将连接依赖关系。
答案 2 :(得分:3)
如果你想使用new运算符并且仍然注入所有依赖项,那么不要将它作为spring组件(通过使用@Service注释),使其成为@Configurable类。
这样,即使对象被实例化,也会注入新的运算符依赖项。
还需要很少的配置。详细说明和示例项目为here。
http://spring-framework-interoperability.blogspot.in/2012/07/spring-managed-components.html