Spring Web MVCプロジェクトの解説~設定編
- 2014/01/29
- 23:16
こんにちはマイムスです。
少し前にSpring WebプロジェクトをMavenのアーキタイプから作成しました。
作ってない方はこちらを参照してください。
今日からそのデフォルトプロジェクトを少しずつ解剖していきます。
何はともあれ、Springといえば、まず初期化するBean定義ファイル相当のものを見るのが定石です。
ポイントとなるキーワードはこちら。
説明に入る前に慣習的にBean定義ファイル系のJavaファイルは~configパッケージに入れることが多いです。
なので、最初に作ったプロジェクトの~.configパッケージ以下を見ていきます。
1.@Configuration
このアノテーションがついてるクラスがBean定義ファイル代わりとなります。
たとえばこんな感じです。
com.myms.spring.web.config.SecurityConfig
①@ImportResourceでxmlの形式と共存ができます。classpath:とプレフィクスを付けるとクラスパスに配置されているファイルをロードします。
②の@Beanがコンテキストで管理されます。Bean名は指定がなければ戻りクラス名のキャメルケースです。
この場合は"userService"。
@Configurationはこんな感じで見ていきます。
2.WebApplicationInitializerの実装クラスを見る
SpringWebMvcの場合はコンテキストの初期化がサーブレットの初期化となります。なのでJavaで定義する場合はアプリケーションコンテキストを作成するタイミングが基本的にはありません。そこで、コンテキストのBeanを定義するのに
WebApplicationInitializer
を利用します。これを実装するとサーブレットの初期化をフックできます。
パッケージ内のどこかにこのインターフェースを実装したクラスがあると自動的に呼び出します。
作ったプロジェクトはこのインターフェースを実装しているクラスは二つです。
ベースパッケージは適宜読みかえてください。
2.1 com.myms.spring.web.config.WebAppSecurityInitializer
Spring Security設定用のイニシャライザです。親クラスのAbstractSecurityWebApplicationInitializer
を継承するだけで最低限設定してくれます。詳しくはまたの機会にします。
①@Orderを付与し、数字を指定するとパッケージ内に複数のイニシャライザがあった時に優先度を付けて読み込んでくれます。
SpringSecurityの設定は必ずOrderを1にしましょう!
2.2 com.myms.spring.web.config.WebAppInitializer
①サーブレットマッピングです。見たままです。
②@Configutationを付与した上位コンテキスト設定クラスを指定します。定義順に読み込まれるので順番に注意しましょう。Securityはこちら側の設定です。
③@Configurationを付与したサーブレットコンテキスト設定クラスを指定します。WebMvcコンフィグは後で解説します。
④フィルター設定です。
⑤その他の設定です。初期化パラメータをここでは指定していますね。
と、イニシャライザについてはこんな感じです
3.WebMvcConfig
Spring Web Mvcの設定は通常の@Configurationとは少し変わっています。
①@ComponentScanは@Component、@Service、@Controllerなどを自動でBeanに登録してしまう設定アノテーションです。
この場合
Applicationクラスのパッケージを基底とし
それ以下の@Controllerが付与されたクラスを登録します
userDefaultFiltersで@Serviceとか他の設定Beanの読み込みを防いでいます。
②WebMvcConfigurationSupportを継承することで簡単にWebMvcの設定が行えます。
annotation-drivenみたいな。RequestMappingとかViewResolverとかSpring Mvcの基本がわかっていればとっつきやすいかと思うの割愛します。たぶんそんなに難しいことではないかと。
以上、Springの設定系は調べたり実装したりするときのエントリポイントとなるのでぜひ覚えておきましよう!
駆け足で書いたので汚いですがごきげんようさようなら。
次はSpringSecurityを少し見ていきます。
少し前にSpring WebプロジェクトをMavenのアーキタイプから作成しました。
作ってない方はこちらを参照してください。
今日からそのデフォルトプロジェクトを少しずつ解剖していきます。
何はともあれ、Springといえば、まず初期化するBean定義ファイル相当のものを見るのが定石です。
ポイントとなるキーワードはこちら。
- @Configuration
- WebMvcConfigurationSupport
- WebApplicationInitializerの実装クラス
- AbstractAnnotationConfigDispatcherServletInitializer
- AbstractSecurityWebApplicationInitializer
説明に入る前に慣習的にBean定義ファイル系のJavaファイルは~configパッケージに入れることが多いです。
なので、最初に作ったプロジェクトの~.configパッケージ以下を見ていきます。
1.@Configuration
このアノテーションがついてるクラスがBean定義ファイル代わりとなります。
たとえばこんな感じです。
com.myms.spring.web.config.SecurityConfig
@Configuration
①
@Configuration
@ImportResource(value = "classpath:spring-security-context.xml")
class SecurityConfig {
②
@Bean
public UserService userService() {
return new UserService();
}
@Bean
public TokenBasedRememberMeServices rememberMeServices() {
return new TokenBasedRememberMeServices("remember-me-key", userService());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new StandardPasswordEncoder();
}
}
①@ImportResourceでxmlの形式と共存ができます。classpath:とプレフィクスを付けるとクラスパスに配置されているファイルをロードします。
②の@Beanがコンテキストで管理されます。Bean名は指定がなければ戻りクラス名のキャメルケースです。
この場合は"userService"。
@Configurationはこんな感じで見ていきます。
2.WebApplicationInitializerの実装クラスを見る
SpringWebMvcの場合はコンテキストの初期化がサーブレットの初期化となります。なのでJavaで定義する場合はアプリケーションコンテキストを作成するタイミングが基本的にはありません。そこで、コンテキストのBeanを定義するのに
WebApplicationInitializer
を利用します。これを実装するとサーブレットの初期化をフックできます。
パッケージ内のどこかにこのインターフェースを実装したクラスがあると自動的に呼び出します。
作ったプロジェクトはこのインターフェースを実装しているクラスは二つです。
ベースパッケージは適宜読みかえてください。
2.1 com.myms.spring.web.config.WebAppSecurityInitializer
Spring Security設定用のイニシャライザです。親クラスのAbstractSecurityWebApplicationInitializer
を継承するだけで最低限設定してくれます。詳しくはまたの機会にします。
①
@Order(1)
public class WebAppSecurityInitializer extends AbstractSecurityWebApplicationInitializer {
}
①@Orderを付与し、数字を指定するとパッケージ内に複数のイニシャライザがあった時に優先度を付けて読み込んでくれます。
SpringSecurityの設定は必ずOrderを1にしましょう!
2.2 com.myms.spring.web.config.WebAppInitializer
@Order(2)
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
①
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
②
@Override
protected Class>[] getRootConfigClasses() {
return new Class>[] {ApplicationConfig.class, DataSourceConfig.class, JpaConfig.class, SecurityConfig.class};
}
③
@Override
protected Class>[] getServletConfigClasses() {
return new Class>[] {WebMvcConfig.class};
}
④
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return new Filter[] {characterEncodingFilter};
}
⑤
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
registration.setInitParameter("defaultHtmlEscape", "true");
registration.setInitParameter("spring.profiles.active", "default");
}
}
①サーブレットマッピングです。見たままです。
②@Configutationを付与した上位コンテキスト設定クラスを指定します。定義順に読み込まれるので順番に注意しましょう。Securityはこちら側の設定です。
③@Configurationを付与したサーブレットコンテキスト設定クラスを指定します。WebMvcコンフィグは後で解説します。
④フィルター設定です。
⑤その他の設定です。初期化パラメータをここでは指定していますね。
と、イニシャライザについてはこんな感じです
3.WebMvcConfig
Spring Web Mvcの設定は通常の@Configurationとは少し変わっています。
@Configuration
①
@ComponentScan(basePackageClasses = Application.class, includeFilters = @Filter(Controller.class), useDefaultFilters = false)
②
class WebMvcConfig extends WebMvcConfigurationSupport {
private static final String MESSAGE_SOURCE = "/WEB-INF/i18n/messages";
private static final String VIEWS = "/WEB-INF/views/";
private static final String RESOURCES_HANDLER = "/resources/";
private static final String RESOURCES_LOCATION = RESOURCES_HANDLER + "**";
@Override
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping requestMappingHandlerMapping = super.requestMappingHandlerMapping();
requestMappingHandlerMapping.setUseSuffixPatternMatch(false);
requestMappingHandlerMapping.setUseTrailingSlashMatch(false);
return requestMappingHandlerMapping;
}
@Bean(name = "messageSource")
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename(MESSAGE_SOURCE);
messageSource.setCacheSeconds(5);
return messageSource;
}
@Bean
public TemplateResolver templateResolver() {
TemplateResolver templateResolver = new ServletContextTemplateResolver();
templateResolver.setPrefix(VIEWS);
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("HTML5");
templateResolver.setCacheable(false);
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.addDialect(new SpringSecurityDialect());
return templateEngine;
}
@Bean
public ThymeleafViewResolver viewResolver() {
ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver();
thymeleafViewResolver.setTemplateEngine(templateEngine());
thymeleafViewResolver.setCharacterEncoding("UTF-8");
return thymeleafViewResolver;
}
@Override
public Validator getValidator() {
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
validator.setValidationMessageSource(messageSource());
return validator;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler(RESOURCES_HANDLER).addResourceLocations(RESOURCES_LOCATION);
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
①@ComponentScanは@Component、@Service、@Controllerなどを自動でBeanに登録してしまう設定アノテーションです。
この場合
Applicationクラスのパッケージを基底とし
それ以下の@Controllerが付与されたクラスを登録します
userDefaultFiltersで@Serviceとか他の設定Beanの読み込みを防いでいます。
②WebMvcConfigurationSupportを継承することで簡単にWebMvcの設定が行えます。
annotation-drivenみたいな。RequestMappingとかViewResolverとかSpring Mvcの基本がわかっていればとっつきやすいかと思うの割愛します。たぶんそんなに難しいことではないかと。
以上、Springの設定系は調べたり実装したりするときのエントリポイントとなるのでぜひ覚えておきましよう!
駆け足で書いたので汚いですがごきげんようさようなら。
次はSpringSecurityを少し見ていきます。
- テーマ:プログラミング
- ジャンル:コンピュータ
- カテゴリ:Spring
- CM:0
- TB:0