私はSpringと@Configurationスタイルがxmlベースの構成を取り除くのが本当に好きです。私はそれをサービスおよびリポジトリ層にうまく使用しています。私が気に入っているのは、依存性注入機能と JDO/JPA/Jdbc ユーティリティです!
私が実際に得ていないのは、Spring WebMVC がどのように機能するかです。私には制御不能な魔法が多すぎます。(そして @EnableAutoConfiguration を使用すると、さらに多くの魔法が導入されます。簡単なプロトタイピングには適していますが、保守は困難です)。
それが私のwebappを設定する方法です:
public class SpringWebBooter implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigApplicationContext rootContext = new AnnotationConfigApplicationContext();
rootContext.register(SpringConfiguration.class); //main configuration class for all beans
rootContext.refresh();
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.setParent(rootContext);
ctx.register(SpringWebConfiguration.class); //web context configuration class
ServletRegistration.Dynamic api = servletContext.addServlet("api", new DispatcherServlet(ctx));
api.setLoadOnStartup(1);
api.addMapping("/api/*");
}
}
ここで、型コンバーターと httpMessageConverters を追加したいので、SpringWebConfiguration クラスで試しました。
@EnableWebMvc
@Configuration
@ComponentScan
public class SpringWebConfiguration {
//works but feels very *magic*
@Autowired
public void configureConversionService(FormattingConversionService conversionService) {
conversionService.addConverter(new PointConverter(GEOMETRY_FACTORY));
conversionService.addConverterFactory(new StringToEnumConverterFactory());
}
//not working yet
@Bean
public MappingJackson2HttpMessageConverter createJsonMessageConverter() {
ObjectMapper o = new ObjectMapper();
o.enable(SerializationFeature.INDENT_OUTPUT);
MappingJackson2HttpMessageConverter c = new MappingJackson2HttpMessageConverter();
c.setObjectMapper(o);
return c;
}
}
ディスパッチャ サーブレットを構築するときに、タイプ コンバータとメッセージ コンバータを追加する方が直感的だと思います。これは、疑わしい自動配線や Bean の作成よりもはるかに明確です。Dispatcher Servlet が内部で Bean を取得することを常に「望んでいます」が、多くの場合、試行錯誤にすぎません。ディレクターの方法でSpring Mvcをセットアップすることは可能ですか? たとえば、より少ない魔法とより具体的なインスタンス化と #addHttpMessageConverter(...) 呼び出しで?
ExceptionResolvers、RequestHandler、RequestAdapter についても基本的に同じです。
1月