2017-02-09 186 views
2

我会尽力向您解释我的问题。Spring bean初始化之前的初始化

我有一个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 */ 
    } 
} 

然后,我有一些豆子取决于该副本的结果,那些被这样定义:

@PropertySource(value = "file://${user.home}/${path.to.copy}/file.properties") 
@Service 
public class Bean{ 
    /** Bean Stuff */ 
} 

我的问题是,当bean被初始化时,当弹簧将占位符与值链接在一起时,文件位于:file://${user.home}/${path.to.copy}/file.properties不存在。 所以我想知道是否有一种方法可以在任何其他bean之前创建并调用第一个bean,以正确地复制这些文件。

预先感谢您。

+0

定义依赖它的其他bean。可能[取决于另一个bean](http://docs.spring.io/spring/docs/current/javadoc-api/org/ springframework/context/annotation/DependsOn.html)可能会有所帮助 –

+1

这绝不会奏效。 '@ PropertySource'将在评估'@ Value'注解之前被处理,并且它不是一个多遍处理,所以简单地说它就不起作用。在你的'ApplicationContext'被初始化之前,你需要执行这个逻辑,并且你需要把它放入,比如'ApplicationContextInitializer'。 –

回答

-1

所以我在想,如果有第一个bean来,以便正确地复制这些 文件创建 与其它bean之前调用的方法。

如果你只是想以这样的方式来控制bean的创建,A类应该只在类B后实例化,那么你可以这样做。

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

但是,你所要求的东西不仅仅是实例,我会解决由旋转起来弹簧云配置服务器这种使用情况。

-1

请勿重写afterPropertiesSet()方法。将其重命名,并删除@Override注释。重命名你的方法(通常称为init(),但它可以是任何名称)用@PostConstruct注释标记该方法,Spring将在构造函数之后立即调用它,并完成所有注入。这应该做你的伎俩。然后使用注释@ DependsOn(Your_bean_name)

+0

为什么更改'@ PostConstruct'注释方法的'afterPropertiesSet'? –

+0

这是否意味着在设置everybean的每个属性之后调用afterPropertiesSet? –

+0

你并不是假设实现任何Spring接口,因此不需要重写任何Spring方法。注释@PostConstruct为您提供了所需的功能 –