我承认我对春天还很陌生.我在一个Spring 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.做这件事最好的办法是什么?

我试着首先使类具体化,然后将属性名传递到构造函数中,然后将值作为新字段保存在类中,但我不确定从哪里开始,或者这是否是正确的开始方式.如果我的要求或所说的没有意义,我向你道歉.

推荐答案

您不能以抽象类的常规方式使用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;

    // ...
}

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

Java相关问答推荐

Java .类参数不通过构造函数传递

嵌入式ActiveMQ Artemis Web控制台加载错误

为什么一个Test的instance?& gt;在构造函数中接受非空对象?

不推荐使用的Environment.getExternalStorageDirectory().getAbsolutePath()返回的值不同于新的getExternalFilesDir(空)?

获取字符串中带空格的数字和Java中的字符

Jakarta CDI强制bean构造/注册遗留事件侦听器

第二次按下按钮后,我需要将按钮恢复到其原始状态,以便它可以再次工作

当Volatile关键字真的是必要的时候?

Mac上的全屏截图在使用JavaFX时不能正常工作吗?

%This内置函数示例

在学习Spring时,通过构造函数参数0表达了不满意的依赖关系

没有使用Lombok生成的参数

垃圾回收器是否真的删除超出作用域的对象?

泛型与泛型问题的完美解决方案?

Java嵌套流查找任意值

如何在Maven Central上部署?

我该如何为我的类编写getter和setter方法?

具有多个分析模式的复杂分隔字符串的正则表达式

如何组合Mono和Flux

ANTLR 接受特殊字符,例如 .标识符或表达式中的(点)和 ,(逗号)