我要求将旧式spring项目迁移到Spring引导。 假设下面的代码片段我必须迁移到Spring引导样式。
这里我的问题,如何将下面的抽象bean转换为@Bean?
<bean id="sample" class="com.test.core.common.AbstractClass" abstract="true">
<property name="sample1" ref="sample1" />
<property name="sample2" ref="sample2" />
</bean>
答案 0 :(得分:13)
用普通Java编写抽象基类(没有任何Spring耦合):
public abstract class AbstractClass{
private Sample1 sample1;
private Sample2 sample2;
public AbstractClass(Sample1 sample1, Sample1 sample2){
this.sample1 = sample1;
this.sample2 = sample2;
}
...
}
请注意,添加带有参数的构造函数(包括抽象类和具体类)使注入更容易,依赖性更清晰。
然后你有两种方式:
1)用@Component
注释具体类
如:
@Component
public class MyClass extends AbstractClass{
public MyClass (Sample1 sample1, Sample1 sample2){
super(sample1, sample2);
}
}
第一种方式的优点是简短:只需添加注释即可 但它实际上使子类成为可能由Spring上下文加载的bean。
2)或者,在Configuration
类中声明bean
如:
@Configuration
public class MyConfig{
@Bean
public MyClass myClass(Sample1 sample1, Sample1 sample2){
return new MyClass(sample1, sample1);
}
}
第二种方式更冗长,但有一个优点就是不修改子类代码,也让类的客户端决定该类是否应该是bean。
每种方法都有其优点和缺点 所以要根据具体要求使用。
答案 1 :(得分:2)
无需转换此代码。您只需要通过使用com.test.core.common.AbstractClass
或@Component
注释它们或声明在配置类中使用@Service
注释的方法,将扩展@Bean
的类声明为spring managed beans
在Java配置中通常不需要“抽象bean”,甚至没有等价物。在xml配置中需要参数继承,现在可以使用普通的java方法实现。找到example from Stephane Nicoll谁是Spring Core开发人员。
答案 2 :(得分:0)
由于Java拥有自己的抽象类和继承机制,因此您不需要在弹簧耦合中进行以下代码的耦合。
<bean id="sample" class="com.test.core.common.AbstractClass" abstract="true">
<property name="sample1" ref="sample1" />
<property name="sample2" ref="sample2" />
</bean>
在XML配置中,您需要执行此操作以指定继承子bean的模板。但是由于Springboot使用Java配置,因此该部分直接使用Java继承进行处理。
这意味着您可以将此抽象类声明为普通的Java抽象类,并仅将子类视为bean,而不必担心抽象父类。