gpt4 book ai didi

java - 如何使用@Bean注解配置子bean

转载 作者:行者123 更新时间:2023-12-01 09:27:32 26 4
gpt4 key购买 nike

我想使用 Spring 的 bean 继承,同时使用 bean 的 @Bean 类型定义。具体来说,让

public class Serwis {
Integer a;
Integer b;
Map<Integer, Integer> m = new HashMap<>();
}

假设基于 xml 的配置如下所示:

<bean id="absSerwis" class="service.Serwis"
p:a="11">
<property name="m">
<map>
<entry key="111" value="111"></entry>
</map>
</property>
</bean>

<bean id="defSerwis" parent="absSerwis"
p:b="12"
/>

它创建了包含 bean absSerwis 深拷贝的 bean defSerwis;特别是 m 的内容被复制。现在,我想使用 @Bean 注释定义像 defSerwis 这样的 bean,例如

@Autowired
@Qualifier("absSerwis")
private Serwis absSerwis;

@Bean
public Serwis cccSerwis() {
Serwis s = new Serwis();
BeanUtils.copyProperties(absSerwis, s); //wrong; does shallow copy
return s;
}

正确的做法是什么?

最佳答案

对于初学者来说,您所描述的并不是实际发生的情况。没有制作深拷贝或其他任何东西。让我们首先研究一下 Spring 在使用 parent bean 时会做什么。 (另请注意,它是关于bean定义继承不是类继承!);

根据您的配置

<bean id="absSerwis" class="service.Serwis"
p:a="11">
<property name="m">
<map>
<entry key="111" value="111"></entry>
</map>
</property>
</bean>

<bean id="defSerwis" parent="absSerwis"
p:b="12"
/>

发生的情况是,对于 defSerwis 定义,它采用父 absSerwis 及其自身的配置,并将其合并到完整的 bean 定义中。因此,不存在“深拷贝”或“bean 副本”这样的东西。

Spring最终会看到什么

<bean id="absSerwis" class="service.Serwis"
p:a="11">
<property name="m">
<map>
<entry key="111" value="111"></entry>
</map>
</property>
</bean>

<bean id="defSerwis" class="service.Serwis"
p:a="11" p:b="12"
<property name="m">
<map>
<entry key="111" value="111"></entry>
</map>
</property>
/>

另请参阅this section引用指南。

最简单的方法是创建一个构造父级的方法,然后从那里添加。此方法不得使用 @Bean 进行注释。

@Configuration
public class MyConfiguration {

private Serwis baseSerwis() {
Serwis base = new Serwis();
base.setA(11);
Map map = new HashMap();
map.put(111, 111);
base.setM(map);
return base;
}

@Bean
public Serwis absSerwis() {
return baseSerwis();
}

@Bean
public Serwis defSerwis() {
Serwis defSerwis = baseSerwis();
defSerwis.setB(12);
return defSerwis;
}
}

这或多或少相当于 xml 部分。

关于java - 如何使用@Bean注解配置子bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39724566/

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