这有点难以解释...希望问题的领域一点都不含糊......如何指示Spring来自动装配在紧密耦合的对象链
你可以看看代码的想法...
ClassA.java
public class ClassA {
@Autowired
InterA abcd;
public void dododo() {
abcd.doit();
}
}
ClassB.java
@Component
public class ClassB implements InterA {
@Override
public void doit() {
System.out.println("hoo hoo");
}
}
ClassC.java
@Component("classc")
public class ClassC {
public void doFromAbove() {
ClassA cls = new ClassA();
cls.dododo();
}
}
接口InterA.java
public interface InterA {
public void doit();
}
配置ClassConfig.java(在同一封装的其他Java类文件)
@Configuration
@ComponentScan
public class ClassConfig {
}
主要方法
public static void main(String[] args) {
try(AbstractApplicationContext appctx = new AnnotationConfigApplicationContext(ClassConfig.class)) {
ClassC obj = (ClassC) appctx.getBean("classc");
obj.doFromAbove();
}
}
当我执行的主要方法,在ClassA
的自动装配Autowired场“ABCD”没有得到注入,导致NullPointerException
当我宣布ClassA
作为它仅@Component
并得到它的豆...间接自动装配没有发生
我应该从ClassC
去耦ClassA
并使一切松耦合?
是否有任何简单的注释可以用来告诉Spring自动注入@Autowired字段,即使对象是以紧密耦合的方式创建的?
注意 请不要告诉我使用的ApplicationContext在ClassC
创造ClassA
豆。
任何Spring Geek谁可以找到答案?
我认为在这种情况下Spring 101可能是合适的。因此,让我们从那里开始 - 如果您在应用程序中的任何位置使用'new' **,那么您的错误是__错误。在Spring应用程序中,只有**的地方应该看到'new',它在配置类中向Spring解释如何创建bean。它被称为_Dependency Injection_框架 - 您绝对必须** _inject dependencies_才能使用它。 –
此外,任何告诉你在'ClassC'中使用'ApplicationContext'来创建'ClassA'_'的bean的人也不理解DI。你永远不应该这样做。正确的做法是注入'Provider'并在需要时调用'get'。然后你告诉Spring'ClassA'是'PROTOTYPE'的作用域,所以每次创建一个新的实例。正如我所说 - 春天101. –
@BoristheSpider,我得到你的漂移......问题是我正在经历的是将传统的Java项目转换为Spring ...所以我想也许我们可以混合匹配紧密耦合的对象松散耦合的弹簧注入对象来完成春季转换/迁移过程,代码修改更少...我所描述的例子只有一个紧耦合......在一个层面上...应用Spring正确的方式似乎是一个很大的现有项目的痛苦 –