Java 每次初始化之前的Springbean初始化

Java 每次初始化之前的Springbean初始化,java,spring,Java,Spring,我会尽力向你解释我的问题 我有一个bean,它将文件从我的类路径复制到服务器上的本地文件夹。 bean的定义如下,并使用属性值来知道它应该复制文件的位置: @Service("wsConfig") public class WorkspaceConfig implements InitializingBean { @Value("path.to.copy") String path; @Value("classpath.to.copy") String folde

我会尽力向你解释我的问题

我有一个bean,它将文件从我的类路径复制到服务器上的本地文件夹。 bean的定义如下,并使用属性值来知道它应该复制文件的位置:

@Service("wsConfig")
public class WorkspaceConfig implements InitializingBean {
    @Value("path.to.copy")
    String path;
    @Value("classpath.to.copy")
    String folder

    @Override
    public void afterPropertiesSet() {
         /** Do my copy stuff */
    }
}
然后我有一些bean,它们取决于复制的结果,它们的定义如下:

@PropertySource(value = "file://${user.home}/${path.to.copy}/file.properties")
@Service
public class Bean{
  /** Bean Stuff */
}
我的问题是,当bean初始化时,当spring将占位符与值链接时,位于:
file://${user.home}/${path.to.copy}/file.properties
的文件不存在。 所以我想知道是否有一种方法可以在任何其他bean之前创建和调用第一个bean,以便正确复制这些文件

先谢谢你

所以我想知道是否有办法创建第一个bean 并在任何其他bean之前调用,以便正确复制这些bean 档案

如果您只想控制bean的创建,使类a只能在类B之后实例化,那么您可以这样做

@Service
@DependsOn("B")
public class A {}
但是,您要求的不仅仅是实例化,我将通过旋转SpringCloudConfig服务器来解决这个用例

所以我想知道是否有办法创建第一个bean 并在任何其他bean之前调用,以便正确复制这些bean 档案

如果您只想控制bean的创建,使类a只能在类B之后实例化,那么您可以这样做

@Service
@DependsOn("B")
public class A {}

但是,您要求的不仅仅是实例化,我将通过旋转spring cloud配置服务器来解决这个用例。

不要重写
AfterPropertieSet()
方法。将其重命名为其他名称并删除
@Override
注释。重命名方法(通常称为
init()
,但可以是任何名称)使用
@PostConstruct
注释标记该方法,Spring将在构造函数和所有注入完成后立即调用该方法。那应该是你的伎俩。然后使用注解@DependsOn(您的\u bean \u名称)定义依赖于它的其他bean。

不要重写
afterPropertiesSet()
方法。将其重命名为其他名称并删除
@Override
注释。重命名方法(通常称为
init()
但它可以是任何名称)标记该方法,并在构造函数完成所有注入之后立即调用该方法。那应该是你的伎俩。然后用注释@DependsOn(您的\u bean\u名称)定义依赖它的其他bean

为什么要为
@PostConstruct
带注释的方法更改
AfterPropertieSet
?这是否意味着在设置everybean的每个属性后调用AfterPropertieSet?您不需要实现任何Spring接口,因此不需要重写任何Spring方法。注释@PostConstruct为您提供了请求的功能。将其更改为
@PostConstruct
方法不会改变任何事情,因为调用时间与
afterPropertiesSet
相同。无论如何,它将不起作用,因为在此之前已处理了
@PropertySource
。因此,不管是
@PostConstruct
还是
InitializingBean
,这种方法都是行不通的。为什么要为
@PostConstruct
带注释的方法更改
afterPropertiesSet
?这是否意味着在设置everybean的每个属性之后都会调用afterPropertiesSet?您不应该实现任何方法Spring接口,因此无需重写任何Spring方法。注释@PostConstruct为您提供了请求的功能。将其更改为
@PostConstruct
方法不会改变任何事情,因为调用时间与
afterPropertiesSet
相同。无论如何,它将不起作用,因为在此之前已处理了
@PropertySource
。因此,不管是
@PostConstruct
还是
初始化bean
,这种方法都不会起作用。
@PropertySource
将在评估
@Value
注释之前进行处理,它不是一个多过程过程,因此简单地说,它根本不起作用。您甚至需要在初始化
ApplicationContext
之前执行该逻辑,并且您需要将其放置在
ApplicationContext初始值设定项中。可能会有帮助,但这永远不会起作用。
@PropertySource
将在评估
@Value
注释之前进行处理,它不是一个多过程过程,因此简单地说,它根本不起作用。您需要在初始化
ApplicationContext
之前执行该逻辑,并且您需要将其放置在
ApplicationContext初始值设定项中。