当前位置: 首页 > 知识库问答 >
问题:

如何在spring boot中为抽象类使用@bean创建bean

盖成弘
2023-03-14

我需要将旧式spring项目迁移到springboot。假设下面的代码片段我必须迁移到Spring Boot风格。

在这里我的问题,如何将下面的抽象bean转换为@Bean?

<bean id="sample" class="com.test.core.common.AbstractClass" abstract="true">
    <property name="sample1" ref="sample1" />
     <property name="sample2" ref="sample2" />
</bean>

共有3个答案

居晗日
2023-03-14

因为Java有自己的抽象类和继承机制,所以您不需要在spring耦合中进行以下代码的耦合。

<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,而不必担心抽象父类。

乐正浩言
2023-03-14

没有必要转换此代码。您只需要通过用@Component@Service注释扩展com.test.core.common.AbstractClass声明为Spring托管bean的类,或者声明一个用@Bean注释的方法在您的配置类中。

Java配置中通常不需要“抽象bean”,甚至没有等价物。xml配置中需要它来实现参数继承,现在可以用普通java方法实现。请从Spring核心开发人员Stephane Nicoll处查找示例。

彭骏
2023-03-14

用普通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);
    }
}

第一种方法的优点是简短:只需添加注释
但是它实际上使子类成为一个bean,可能由Spring上下文加载。

2) 或者,在配置类中声明bean
例如:

@Configuration
public class MyConfig{
  @Bean
   public MyClass myClass(Sample1 sample1, Sample1 sample2){
      return new MyClass(sample1, sample1);
   }
}

第二种方法更为详细,但其优点是不修改子类代码,也让类的客户端决定该类是否应该是bean。

每种方法都有其优点和缺点<因此,可根据具体要求使用。

 类似资料:
  • 我通过学校为一项任务提供的简报创建了一个飞机座位预订系统。我遇到了一个我无法解决的主要问题。 摘要说明抽象类必须有一个抽象方法和大约4个公共方法。在抽象类的两个子类中,我们都必须初始化对象数组(所有普通的座位)。然而,一旦它们被初始化,我不知道如何将它们发送回抽象类(该类有一个检查未预订的飞机座位的方法,这就是我需要初始化的座位对象的地方) ArrayIndexOutOfBounds在一个应该在边

  • 问题内容: 在以下代码中,我创建了一个基本抽象类。我希望所有继承自其的类都提供该属性,因此我将该属性设置为。 然后,我创建了一个名为的子类,该子类旨在提供一些功能,但仍保持抽象。中没有属性,但是python实例化了该类的对象而没有错误。一个人如何创建抽象属性? 问题答案: 从Python 3.3 开始,修复了一个错误,这意味着装饰器现在应用于抽象方法时,可以正确地标识为抽象。 注:订单的问题,你必

  • 我正在创建JavaMailSender的bean类,并自动拥有javamailsender,但我得到错误 我不能为bean id="mail Sender"创建bean类。我在过去的两天里一直在努力,请让我离开它。 和错误页 组织。springframework。豆。工厂BeanCreationException:创建名为“employeeController”的bean时出错:自动连线依赖项的注

  • 当我启动应用程序时,我得到以下错误:

  • 问题内容: 如何在C ++中创建一个抽象类,该抽象类具有一些我想在子类中重写的抽象方法?该文件应如何显示?是否有一个,如果是的话,应该看起来如何? 在Java中,它看起来像这样: 对于我来说,将此代码转换为C ++就足够了。 编辑: 我创建了代码,但是当我尝试遍历对象时,出现以下错误: 使用此代码: 问题答案: 在Java中,除非您声明了所有方法,否则默认情况下所有方法都是默认方法。在C ++中,