Understanding Spring Web Initialization



Understanding Spring Web Initialization

Few years ago majority of us were used to write XML config files everywhere, to setup even simple Java EE application. Today using Java or Groovy to configure projects is becoming preferred way - you just need to take a look at Gradle or functionalities introduced in further versions of the Spring Framework to gen up on this.

Now I'll deal with configuring Spring contexts for web application.

Java EE provides ServletContainerInitializer interface, which allows libraries to be notified of a web application startup. Since Spring 3.1 we have SpringServletContainerInitializer class which handles WebApplicationInitializer by instantiating all found classes implementing this interface, sorting them basing on @Order annotation (non-annotated classes gets the highest possible order, so they are processed at the end) and invoking onStartup() method.


Spring since version 3.2 provides us a few classes implementing  WebApplicationInitializer interface, from which first is AbstractContextLoaderInitializer. This class included in spring-web module uses abstract createRootApplicationContext() method to create application context, delegates it to ContextLoaderListener which then is being registered in the ServletContext instance. Creating application context using this class looks as follows:
1
2
3
4
5
6
7
8
9
10
11
12
public class SpringAnnotationWebInitializer
   extends AbstractContextLoaderInitializer {
  
   @Override
   protected WebApplicationContext createRootApplicationContext() {
     AnnotationConfigWebApplicationContext applicationContext =
       new AnnotationConfigWebApplicationContext();
     applicationContext.register(SpringAnnotationConfig. class );
     return applicationContext;
   }
  
}

That was the simplest way to start up Spring web context. But if we want to experience benefits provided by Spring MVC and don't want to manually register  DispatcherServlet it'll be better to use another class:  AbstractDispatcherServletInitializer. It extends previous class and adds two abstract methods:  createServletApplicationContext() and  getServletMappings().  First method returns WebApplicationContext that will be passed to  DispatcherServlet, which will be automatically added into container  ServletContext. Please notice that this context will be established as a child of the context returned by  createRootApplicationContext() method. Second method - as you have probably already deduced - returns mappings that are used during servlet registration. You can also override  getServletFilters() method if you need any custom filters, because default implementation returns just empty array. Exemplary implementation using this class could be:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class SpringWebMvcInitializer
   extends AbstractDispatcherServletInitializer {
  
   @Override
   protected WebApplicationContext createRootApplicationContext() {
     AnnotationConfigWebApplicationContext applicationContext =
       new AnnotationConfigWebApplicationContext();
     applicationContext.register(SpringRootConfig. class );
     return applicationContext;
   }
  
   @Override
   protected WebApplicationContext createServletApplicationContext() {
     AnnotationConfigWebApplicationContext applicationContext =
       new AnnotationConfigWebApplicationContext();
     applicationContext.register(SpringMvcConfig. class );
     return applicationContext;
   }
  
   @Override
   protected String[] getServletMappings() {
     return new String[]{ "/*" };
   }
  
}

And now last but definitely not least class:  AbstractAnnotationConfigDispatcherServletInitializer. Here we can see further step in simplifying Spring initialization - we don't need to manually create contexts but just set appropriate config classes in  getRootConfigClasses() and  getServletConfigClasses() methods. I hope you are already familiar with those names, because they works exactly like in the former case. Of course due to this class extends  AbstractDispatcherServletInitializer we can still override getServletFilters(). Finally we can implement our configuration in the following way:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class SpringWebMvcSimpleInitializer
   extends AbstractAnnotationConfigDispatcherServletInitializer {
  
   @Override
   protected Class<?>[] getRootConfigClasses() {
     return new Class[] {SpringRootConfig. class };
   }
  
   @Override
   protected Class<?>[] getServletConfigClasses() {
     return new Class[] {SpringMvcConfig. class };
   }
  
   @Override
   protected String[] getServletMappings() {
     return new String[]{ "/*" };
   }
  
}

If you like to see wider context please follow examples in my GitHub repo:  https://github.com/jkubrynski/spring-java-config-samples/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值