所以我尝试通过字段注入接口实现。但是不知道为什么它是空的。
Package
com.a
Interfacex
com.b
Interfaceximpl
Interfacex.java
public interface Interfacex {
void doA ();
}
Interfaceximpl.java
@Component
public class Interfaceximpl implements interfacex {
@Override
void doA(){
// do something
}
}
Main.java
public class Main {
@Autowired
Interfacex interfacex;
public static void main (String args[]){ //....}
}
这个接口似乎为空。
@Configuration
@ComponentScan("com")
public class AppConfig { // nothing here}
在我的例子中没有这样的setter注入。我只是注入了接口with@Autowired为什么是空的?
你真的把@Autowired
放在主类的字段上,还是它只是一个插图?如果您这样做-它将无法工作,因为可以发生@Autowired的类必须由Spring自己管理。在这种情况下,它显然不是,因为它是一个特殊的类——一个应用程序的入口点…
我建议这样写:
@Component
public class EntryPoint {
@Autowired
Interfacex interfacex;
public void foo() {
// interfacex shouldn't be null
// because everything is managed by spring now
interfacex.doA();
}
}
public class Main {
public static void main(..) {
ApplicationContext ctx = ...
EntryPoint ep = ctx.getBean(EntryPoint.class);
ep.foo();
}
}
@Autowired注释不会被spring识别和操作,除非该类是bean。
在这种情况下,'Main'类不是bean。所以,@Autowired什么也做不了。
你需要让'Main'成为一个bean。一种方法是在该类中添加@Component注释。
而且,这似乎只是你试图理解工作的东西。这样的话,你可以试试我上面的建议。
如果您要为prod做这些,那么您应该更改类结构,类和变量名称以及创建bean的方式。