我一直在观看有关Spring依赖注入以及MVC的一些教程,但我似乎还不明白我们如何能够专门实例化类?
我的意思是,例如,我有一个变量
@Autowired
ClassA someObject;
如何使spring创建someObject作为ClassB的实例,它将扩展ClassA?像someObject = new ClassB();
我真的不明白它在Spring中是如何工作的,ContextLoaderListener是自动完成的还是我们必须创建某种配置类,我们确切地指定spring应该将这些类实例化为什么? (在这种情况下,我没有在教程中的任何地方看到过)如果是,那么我们如何指定它是什么样的?我们如何将其配置为在web.xml等中工作?
答案 0 :(得分:23)
你可以这样做:
界面:
package org.better.place
public interface SuperDuperInterface{
public void saveWorld();
}
实现:
package org.better.place
import org.springframework.stereotype
@Component
public class SuperDuperClass implements SuperDuperInterface{
public void saveWorld(){
System.out.println("Done");
}
}
客户端:
package org.better.place
import org.springframework.beans.factory.annotation.Autowire;
public class SuperDuperService{
@Autowire
private SuperDuperInterface superDuper;
public void doIt(){
superDuper.saveWorld();
}
}
现在您已定义了接口,编写了一个实现并将其标记为组件 - docs here。现在唯一剩下的就是告诉spring在哪里可以找到组件,这样它们就可以用于自动装配。
<beans ...>
<context:component-scan base-package="org.better.place"/>
</beans>
答案 1 :(得分:1)
您必须在applicationContext.xml文件中指定要创建对象的类的类型,或者可以使用@Component
,@Service
或{{1}中的任何一个直接注释该类如果您使用的是最新版本的Spring。在web.xml中,如果使用基于xml的配置,则必须将xml文件的路径指定为servlet的上下文参数。
答案 2 :(得分:0)
是的,您必须提供一个context.xml文件,您可以在其中指定实例。将它提供给ApplicationContext,它将为您自动装配所有字段。
http://alvinalexander.com/blog/post/java/load-spring-application-context-file-java-swing-application
答案 3 :(得分:0)
最佳做法
@RestController
@RequestMapping("/order")
public class OrderController {
private final IOrderProducer _IOrderProducer;
public OrderController(IOrderProducer iorderProducer) {
this._IOrderProducer = iorderProducer;
}
@GetMapping("/OrderService")
void get() {
_IOrderProducer.CreateOrderProducer("This is a Producer");
}
}
界面
@Service
public interface IOrderProducer {
void CreateOrderProducer(String message);
}
实施
public class OrderProducer implements IOrderProducer{
private KafkaTemplate<String, String> _template;
public OrderProducer(KafkaTemplate<String, String> template) {
this._template = template;
}
public void CreateOrderProducer(String message){
this._template.send("Topic1", message);
}
}
您需要在春季启动时包含Project Lombok依赖项
等级implementation 'org.projectlombok:lombok'