参数化 bean 上的@PostConstruct

问题描述 投票:0回答:1

我有参数化接口和实现该接口的参数化类。然后我将这个类注入到 3 个服务中,并在 @PostConstruct 方法中设置 typeParameterClass。 2 个类返回正确的 typeParameterClass,但其他一个类从另一服务返回 typeParameterClass,而不是在 @PostConstruct 中的此类中设置的类型。

喜欢

ClassOneServiceImpl.getParameter() = ClassOne.class;
ClassTwoServiceImpl.getParameter() = ClassTwo.class;
ClassThreeServiceImpl.getParameter() = ClassOne.class;

我已将日志记录添加到初始化中,但是我发现 setTypeParameterClass(Class clazz) 中设置的 TypeParameterClass 是正确的。

在 jdk-17 Temurin 的本地环境中,程序运行良好。

有什么建议为什么@PostCOnstruct 不能按预期工作吗?或者问题可能发生在其他地方?

public interface PostgresDAO<T> {
    void setTypeParameterClass(Class<T> clazz);
    Entity findEntityById(Long id);
}


@Repository
@NoArgsConstructor
@Getter
public class PostgresDAOImpl<T> implements PostgresDAO<T> {

    private Class<T> typeParameterClass

    @PersistenceContext
    private EntityManager em;

    @Override
    public void setTypeParameterClass(Class<T> clazz) {
        this.typeParameterClass = clazz;
    }

    **** some code with EntityManager
    
}

我有 3 个服务正在使用具有不同参数的 PostgresDAOImpl。

@Service
@RequiredArgsConstructor
public class ClassOneServiceImpl implements ClassOneService {

    private final PostgresDAO<ParameterOne> dao;

    @PostConstruct
    public void enrichDao() {
        dao.setTypeParameterClass(ParameterOne.class);
    }

    public Class getParameter() {
        return dao.getTypeParameterClass();
    }

    ***** some code

}


@Service
@RequiredArgsConstructor
public class ClassTwoServiceImpl implements ClassTwoService {

    private final PostgresDAO<ParameterTwo> dao;

    @PostConstruct
    public void enrichDao() {
        dao.setTypeParameterClass(ParameterTwo.class);
    }

    public Class getParameter() {
        return dao.getTypeParameterClass();
    }

    ***** some code

}


@Service
@RequiredArgsConstructor
public class ClassThreeServiceImpl implements ClassThreeService {

    private final PostgresDAO<ParameterThree> dao;

    @PostConstruct
    public void enrichDao() {
        dao.setTypeParameterClass(ParameterThree.class);
    }

    public Class getParameter() {
        return dao.getTypeParameterClass();
    }

    ***** some other code

}

添加了 javax.annotation 依赖项

        <!--need for postconstruct annotation in java 11 https://www.baeldung.com/spring-postconstruct-predestroy-->
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>

设置

  • 龙目岛 1.18.22
  • 弹簧启动2.7.0

openjdk版本“11.0.4”2019-07-16 LTS

OpenJDK 运行时环境 18.9(内部版本 11.0.4+11-LTS)

OpenJDK 64位服务器VM 18.9(构建11.0.4+11-LTS,混合模式,共享)

java spring java-11 lombok
1个回答
0
投票

我很惊讶它在本地有效,因为它不应该。默认情况下,Spring bean 是单例,在您的代码示例中,您可以在所有

ClassOne
ClassTwo
ClassThree
服务中注入相同的 bean。在
PostConstruct
方法中,您只需重写参数类。

为了解决这个问题,您在

PostgresDAOImpl
带注释的类中创建三个
@Configuration
存储库,并将每个存储库注入相关服务中。如果你这样做,很可能你甚至根本不需要
PostConstruct
方法。

© www.soinside.com 2019 - 2024. All rights reserved.