3

我有一个应用程序,我正在尝试将最新的 Spring 3 约定与基于注释的配置一起使用,但我也有使用构造函数注入的遗留类。根据 Spring 文档,您应该只调用创建该依赖项的方法并将其传递给需要它的构造函数。当 Configuration 类被增强时,这似乎有效,但如果你 @Import Configuration 类,它似乎没有被增强,所以它可能会注入非自动装配的实例。

具体来说,如果我的一个存储库被构造函数注入到另一个 bean 中,并且该存储库与另一个 bean 定义在同一个配置类中(我知道存储库应该在它们自己的配置类中),那么它不会与注入实体管理器。

我的豆子:

public class MyBean {
    private ShouldBeSingleton d;
    public @Autowired MyBean(ShouldBeSingleton d) { this.d = d; }   
    public ShouldBeSingleton getMyDependency() { return d; }
}

public class ShouldBeSingleton { 
}

还有两个这样的配置类:

@Configuration
public class MyImportedConfig { 
    @Bean public ShouldBeSingleton mySingleton() {
        return new ShouldBeSingleton();
    }       
    @Bean public MyBean myBean() {
        return new MyBean(mySingleton());
    }       
}

@Configuration
@Import({MyImportedConfig.class})
public class MyConfig {
}

我的主要看起来像这样:

public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
    MyBean bean = context.getBean(MyBean.class);
    System.out.println("myInjectedSingleton=" + bean.getMyDependency());
    System.out.println("mySingleton=" + context.getBean(ShouldBeSingleton.class));
}

如果我加载 MyImportedConfig.class,我会得到正确的输出(即,如果我从 MyImportedConfig 中调用该方法,则单例类是相同的):

myInjectedSingleton=test.ShouldBeSingleton@b42cbf
mySingleton=test.ShouldBeSingleton@b42cbf

但是,如果我更改 AnnotationConfigApplicationContext 以加载导入 MyImportedConfig 的 MyConfig,则会发生这种情况:

myInjectedSingleton=test.ShouldBeSingleton@a9ae05
mySingleton=test.ShouldBeSingleton@1dff3a2

这是预期的行为吗?我当前的解决方法是将需要将 EntityManager 注入另一个 Configuration 类的任何内容移动,导入它,然后在需要构造函数注入的 Configuration 类中设置 @Autowired 依赖项。

我在 AnnotationConfigWebApplicationContext 中加载它,如果我在 contextConfigLocation 中指定每个配置类,那么所有配置类都得到了适当的增强,但这似乎没有使用“模块化”@Import 功能。

4

1 回答 1

1

所以...我猜这是一个错误?

于 2010-01-19T21:04:56.130 回答