gpt4 book ai didi

java - 尽管如此,还是不​​能覆盖bean@Primary Spring注释

转载 作者:行者123 更新时间:2023-12-01 20:52:22 25 4
gpt4 key购买 nike

我在 dispatcher-servlet.xml 中定义了一个 bean,如下所示:

<!-- Datasource configuration -->
<beans:bean id="dataSource" name="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
<beans:property name="url" value="" />
<beans:property name="username" value="" />
<beans:property name="password" value="" />
</beans:bean>

在另一个config.class(这次使用Java注释进行配置)中,我想重写这个bean。这是新 bean 的定义:

@ImportResource(dispatcher-servlet.xml)

@Bean
@Primary
public EmbeddedDatabase dataSource() {
EmbeddedDatabaseBuilder databaseBuilder = new EmbeddedDatabaseBuilder();
databaseBuilder.setName("testDB");
databaseBuilder.setType(EmbeddedDatabaseType.H2);

return databaseBuilder.build();
}

在测试中我写道:

@ContextConfiguration(classes = config.class)
@WebAppConfiguration
// Test

意想不到的结果是Spring选择的id为dataSource的bean是xml文件中定义的bean。这是记录的输出:

[info] Overriding bean definition for bean 'dataSource' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=true; factoryBeanName=Config; factoryMethodName=dataSource; initMethodName=null; destroyMethodName=(inferred); defined in ... with [Generic bean: class [org.springframework.jdbc.datasource.DriverManagerDataSource]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in URL [dispatcher-servlet.xml]]


似乎@Primary注解被忽略了。
为什么?解决办法是什么?

最佳答案

我不确定混合不同的配置类型是否是一个好主意。如果我要阅读这种配置,我可能会很挣扎,相信我,我实际上做了很多。

但是,作为您问题的答案,XML 优先于注释。因此,尝试在 XML 中声明您的 bean,或者在您的应用程序中仅使用注释。

您可以尝试使用@Qualifier注释。也许是这样的:

@Bean
@Qualifier("my_qualifier")
public EmbeddedDatabase dataSource() {
EmbeddedDatabaseBuilder databaseBuilder = new EmbeddedDatabaseBuilder();
databaseBuilder.setName("testDB");
databaseBuilder.setType(EmbeddedDatabaseType.H2);

return databaseBuilder.build();
}

并使用以下方式注入(inject):

@Autowired
@Qualifier("my_qualifier")
EmbeddedDatabase database;

但我仍然不确定它是否有效。

附注如果您尚未设置自动注释扫描,则应将其添加到 XML 中。从您提到的评论来看,它已经过时了,但事实并非如此。

<context:component-scan base-package="your.base.package" />

只需放置一个包含所有带注释的类的包,而不是 your.base.package,它们应该会被 Spring 拾取,因为我仍然不相信 Spring 会拾取它们。

关于java - 尽管如此,还是不​​能覆盖bean@Primary Spring注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43005251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com