spring 在Java Sping Boot 中注入而不是示例化抽象类

nvbavucw  于 2023-09-29  发布在  Spring
关注(0)|答案(1)|浏览(170)

我承认我对Spring很陌生。我在一个Sping Boot 应用程序中工作,我正在使用一些旧代码。有很多DAO类,其中构造函数将通过重写抽象方法来示例化抽象类,如下所示

@Component("exampleDAO_1") // the DAO classes are already managed by Spring
public class ExampleDAO_1 implements IExampleDAO_1 {
...
    private static final String PROPERTY_NAME = "property_name_1";
    AbstractClass property;

    public ExampleDAO_1() {
        property = new AbstractClass() {

            @Override
            protected String abstractMethod() {
                return PROPERTY_NAME;
            }

        };
    }
...
}

抽象类看起来像这样

public abstract class AbstractClass {
    @Value("${spring.profiles.active}") // Ultimately I want the class managed by Spring so I can access this value properly
    private String activeProfile;

    protected AbstractClass() {
        this(true);
    }

    protected AbstractClass(boolean withEnvironment) {
        ...
        // use abstractMethod() here to further set some other fields in the class
        ...
    }

    protected abstract String abstractMethod();

}

我想注入抽象类,而不是通过通常的new关键字示例化它并覆盖抽象方法,这样我就可以让对象Spring管理。最好的办法是什么?
我试过让类具体化,然后将属性名传入构造函数,然后将值保存为类中的新字段,但我不确定从哪里开始,或者这是否是正确的开始方式。如果我问的或说的没有意义,我道歉。

unguejic

unguejic1#

你不能以通常的方式将Spring用于抽象类(即使用@Component和其他注解),因为抽象类不能在Java中示例化。
但您可以执行以下操作:

@Configuration
public class MyConfig {
    private static final String PROPERTY_NAME = "property_name_1";

    @Value("${spring.profiles.active}")
    private String activeProfile;

    @Bean
    public AbstractClass abstractClass() {
        return new AbstractClass(activeProfile) {

            @Override
            protected String abstractMethod() {
                return PROPERTY_NAME;
            }
        };
    }
}

使用这种方法,您可以手动将AbstractClass配置为Springbean。但是在AbstractClass中,您仍然无法使用任何Spring注解,而是可以通过构造函数传递它们。
在此之后,AbstractClass可以注入任何地方。

@Component
public class SomeClass {

    @Autowired
    private AbstractClass abstracClass;

    // ...
}

我想唯一能做你想做的事的方法就是在上面。

相关问题