デプロイメントからデプロイメントに変化するコンテキストと、すべてのデプロイメントで一定のコンテキストがあります。デプロイメント依存のビットは、jarまたはwarの外部にあるconfig.xmlファイルにあります。静的コンテキストstuffは注釈設定クラスにあります。そのトリックは、config.xmlからのbeanを使用する注釈設定です。アプリの場合、configクラスにインポートされます。しかしwebappでは、そのファイルを見つけることができません。SpringConfig.classのconfig.xmlのspring-beansを使用します。
SpringConfigクラス
@Component
@Configuration
@ImportResource("file:./config.xml")
public class SpringConfig {
@Autowired private String local_timezone_string;
@Autowired private String startDateFormatString;
@Autowired private String startDateString;
@Bean
public TimeZone localTimeZone() {
return TimeZone.getTimeZone(local_timezone_string);
}
@Bean
public SimpleDateFormat startDateFormat() {
SimpleDateFormat sdf = new SimpleDateFormat(startDateFormatString);
sdf.setTimeZone(localTimeZone());
return sdf;
}
@Bean
public long jaceThreadStartDate() throws ParseException {
return startDateFormat().parse(jaceThreadStartDateString).getTime();
}
... a bunch of other beans
}
とconfig.xmlの
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="local_timezone_string" class="java.lang.String"><constructor-arg value="Canada/Atlantic"/></bean>
<bean id="startDateFormatString" class="java.lang.String"><constructor-arg value="yyyy-MM-dd"/></bean>
<bean id="startDateString" class="java.lang.String"><constructor-arg value="2017-04-06"/></bean>
... other beans
</beans>
SpringConfigが展開フォルダにconfig.xmlを探し、特定の展開を使用するように、config.xmlには、jarファイルに含まれていませんコンテキスト。しかしWebApplicationInitializerを介してwebappにSpringConfigをデプロイすると、config.xmlが見つからなくなります。もちろん。では、デプロイメント依存のコンテキスト内のBeanは、Webアプリケーション内の静的コンテキストにどのようにロードできますか? @Configurationと@ComponentsのパッケージをスキャンするようにAnnotationConfigApplicationContextに指示する方法はありますか? webappのXML設定からBeanを登録した後に?
私はおそらく、コンストラクタ内でsetParent(config.xmlコンテキスト)を呼び出してAnnotationConfigWebApplicationContext(SpringConfig.class)を呼び出すAnnotationConfigWebApplicationContextから派生したクラスを考えています。
または、AnnotationConfigApplicationContext(String ... basePackages)を呼び出す代わりに、AnnotationConfigApplicationContext()、setParent(...)、次にscan(...)を呼び出します。