Spring MVC Web アプリは、推奨されるスタイルに従おうとしています。AppContext ( ContextLoaderListener
) を使用して、DAO とサービスを格納します。WebAppContext( DispatcherServlet
) を使用して Controller を格納します。
DAO オブジェクトは、AppContext と WebAppContext の両方に入ります。理由がわかりません。
AppContext 構成は、コントローラー (およびコード テーブルを ServletContext にロードするクラス) を除くすべてをロードすることになっています。
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true)
@EnableTransactionManagement
@EnableScheduling
@ComponentScan(
basePackages = {"blah"},
excludeFilters = {
@Filter(type = FilterType.ANNOTATION, value = {Controller.class}),
@Filter(type = FilterType.ASSIGNABLE_TYPE, value = LoadOnStartup.class)
}
)
public class SpringRootConfiguration {
Web パーツはコントローラーのみをロードすることになっています。
@Configuration
@EnableWebMvc
@ComponentScan(
basePackages = {"blah"},
includeFilters = @Filter(type = FilterType.ANNOTATION, classes={Controller.class})
)
public class SpringWebConfiguration extends WebMvcConfigurerAdapter {
(上記のクラスは、「何とか」の兄弟である別のパッケージに含まれています。セルフスキャンは行われていません)。
もちろん、コントローラは DAO オブジェクトを参照します。コントローラーでは、これらの DAO オブジェクトは@Autowired
.
私の期待は、これらの@Autowired
DAO オブジェクトが AppContext から取得され、2 度目に作成されず、WebAppContext に配置されることでした。しかし、それらは二度目に作成されていると思います。たとえば、次の行はログに 2 回表示されます。AppContext に対して 1 回、WebAppContext に対して 1 回です。
Creating shared instance of singleton bean 'labelDao'
何か不足していますか?
ルート コンテキストと Web コンテキストの親子関係が失われているようです。