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

Spring@PostConstruct,取决于

闻人鸿文
2023-03-14

我希望在一个配置类中有多个@PostConstruct注释方法,应该依赖于@Profile调用这些方法。您可以想象这样一段代码:

@Configuration
public class SilentaConfiguration {

    private static final Logger LOG = LoggerFactory.getLogger(SilentaConfiguration.class);

    @Autowired
    private Environment env;

    @PostConstruct @Profile("test")
    public void logImportantInfomationForTest() {
        LOG.info("********** logImportantInfomationForTest");
    }

    @PostConstruct @Profile("development")
    public void logImportantInfomationForDevelopment() {
        LOG.info("********** logImportantInfomationForDevelopment");
    }   
}

然而,根据@PostConstruct的javadoc,我只能用这个注释对一个方法进行注释。在Spring的Jira https://Jira.spring.io/browse/spr-12433中有一个开放的改进。

你是如何解决这个需求的?我总是可以将这个配置类拆分为多个类,但也许您有更好的想法/解决方案。

顺便说一句。上面的代码运行起来没有问题,但是不管配置文件设置如何,都会调用这两个方法。

共有1个答案

步嘉德
2023-03-14

我用每个@PostConstruct方法一个类来解决这个问题。(这是Kotlin,但它翻译成Java几乎是1:1。)

@SpringBootApplication
open class Backend {

    @Configuration
    @Profile("integration-test")
    open class IntegrationTestPostConstruct {

        @PostConstruct
        fun postConstruct() {
            // do stuff in integration tests
        }

    }

    @Configuration
    @Profile("test")
    open class TestPostConstruct {

        @PostConstruct
        fun postConstruct() {
            // do stuff in normal tests
        }

    }

}
 类似资料:
  • 我是spring新手,我使用https://start.spring.io/创建了一个新的Spring Boot项目,没有进一步的依赖关系,解压缩了zip文件,并在IntelliJ idea中打开了项目。我没有做任何进一步的配置。我现在试图用@PostConstruct方法设置bean&然而,Spring从来没有调用过该方法。 这些是我的课: SpringTestApplication.java

  • 问题内容: 使用注释和声明与 Spring XML配置中相同的方法之间有什么区别吗? 问题答案: 实际上,我不认为没有任何区别,但是它们的工作方式存在优先级。@PostConstruct,init-method是BeanPostProcessors。 是JSR-250注释,而是具有初始化方法的方法。 如果有方法,将在调用初始化方法之前先调用此方法。 如果你的bean实现的和覆盖,首先被调用,然后t

  • 问题内容: SampleBean: 和配置文件是这样的: 而且我没有在bean标记上设置default-init-method属性。 任何机构都可以说出为什么@PostConstruct方法没有被调用的原因。 问题答案: 你需要(或)启用处理功能。

  • 问题内容: 我是Spring的新手,我想知道: 我有一个用(spring)注释的java类,并且在内部有一个用注释的方法。然后,该类由另一个类中的带注释字段引用。我可以假定仅在调用后才注入类吗? 问题答案: 如果您问的是在该bean被调用之后发生了给定类的注入,那么答案是肯定的- 在bean被视为“可注入”之前执行 如果您询问是否在所有注入都完成之后(在同一个bean上)在给定bean上执行-是-

  • 我正在建立一个“类缓存”,我想稍后调用类。 主要的目标是,我不希望每次需要类实例时都扫描上下文。 首先要评估缓存,我将缓存方法@AutoWired放在@RestController中,这会很好地工作。在调用rest方法时填充缓存。 完成之后,我将@AutoWired对象移动到@Service中,创建一个方法来自填充缓存。但这不起作用。调用@PostConstructor方法时不填充缓存。 如何使用