0

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.

私の期待は、これらの@AutowiredDAO オブジェクトが AppContext から取得され、2 度目に作成されず、WebAppContext に配置されることでした。しかし、それらは二度目に作成されていると思います。たとえば、次の行はログに 2 回表示されます。AppContext に対して 1 回、WebAppContext に対して 1 回です。

Creating shared instance of singleton bean 'labelDao'

何か不足していますか?

ルート コンテキストと Web コンテキストの親子関係が失われているようです。

4

1 に答える 1

2

includeデフォルトが無効になっていることを自動的に意味しないフィルターを使用する場合。デフォルトでは、 で指定した内容に関係なく、@ComponentScanすべてのクラスが検出されます。したがって、スキャンする注釈を明示的に制御したい場合は、最初にデフォルトを無効にする必要があります。の属性をに設定します。@ComponentincludeuseDefaultFilters@ComponentScanfalse

@ComponentScan(
 basePackages = {"blah"},
 useDefaultFilters=false,
 includeFilters = @Filter(type = FilterType.ANNOTATION, classes={Controller.class})
)

@Controllerこれで、注釈付きの Beanのみが検出されます。

于 2016-02-25T07:04:24.140 に答える