spring 如何在Sping Boot 中为抽象类使用@Bean注解创建Bean

ttygqcqt  于 2023-09-29  发布在  Spring
关注(0)|答案(4)|浏览(162)

我需要将旧的Spring项目迁移到Sping Boot 。假设下面的代码片段我必须迁移到Sping 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>
ffvjumwh

ffvjumwh1#

用纯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。
每一种方法都有其优点和缺点。
所以要根据具体要求来使用。

pdkcd3nj

pdkcd3nj2#

没有必要转换这个代码。您只需要将扩展com.test.core.common.AbstractClass的类声明为spring托管bean,方法是使用@Component@Service注解它们,或者在配置类中声明一个使用@Bean注解的方法。
Java配置中一般不需要**“抽象bean”**,甚至没有等价物。在xml配置中需要它来实现参数继承,现在可以通过普通的java方法实现。查找Spring Core开发人员example from Stephane Nicoll

nnsrf1az

nnsrf1az3#

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

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

在XMLconfig中,您需要这样做来指定子bean继承的模板。但由于Springboot使用Java配置,这部分直接通过Java继承处理。
这意味着您可以将这个抽象类声明为普通的Java抽象类,并且只将子类视为bean,而不必担心抽象父类。

hvvq6cgz

hvvq6cgz4#

当我们 * 想要 * 将abstract classinterface示例化为@Bean(*with spring-java-config *)时,我们通常可以:
1.示例化一个anonymous inner class
1.覆盖所有抽象方法!;(
因此对于Method注入,它看起来像:

@Configuration
class FreakyConfig {
  @Bean
  @RequestScope // !! (stateful)
  public MyFooBarDelegate delegate() {
    return MyFooBarDelegate.of(...);
  }
  @Bean // singleton, stateless, abstract (no spring deps.)! ;)
  public MyFooBarAbstractSingletonBean() {
    return new MyFooBarAbstractSingletonBean() { // anonymous inner class!
      @Override
      protected MyFooBarDelegate fooBarDelegate() { // ...and override the (injected)/prescribed methods.
        return delegate();
      }
    };
  }
} // (stress) tested ;)

另一个好的(?)问题:最新的(“当前的”)"spring-javaconfig/docs"在哪里???
另见:

相关问题