81.3 Convert an existing application to Spring Boot
For a non-web application it should be easy (throw away the code that creates your ApplicationContext
and replace it with calls to SpringApplication
or SpringApplicationBuilder
). Spring MVC web applications are generally amenable to first creating a deployable war application, and then migrating it later to an executable war and/or jar. Useful reading is in the Getting Started Guide on Converting a jar to a war.
Create a deployable war by extending SpringBootServletInitializer
(e.g. in a class called Application
), and add the Spring Boot @EnableAutoConfiguration
annotation. Example:
_@Configuration_ _@EnableAutoConfiguration_ _@ComponentScan_ public class Application extends SpringBootServletInitializer { _@Override_ protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { // Customize the application or call application.sources(...) to add sources // Since our example is itself a @Configuration class we actually don't // need to override this method. return application; } }
Remember that whatever you put in the sources
is just a Spring ApplicationContext
and normally anything that already works should work here. There might be some beans you can remove later and let Spring Boot provide its own defaults for them, but it should be possible to get something working first.
Static resources can be moved to /public
(or /static
or /resources
or /META-INF/resources
) in the classpath root. Same for messages.properties
(Spring Boot detects this automatically in the root of the classpath).
Vanilla usage of Spring DispatcherServlet
and Spring Security should require no further changes. If you have other features in your application, using other servlets or filters for instance, then you may need to add some configuration to your Application
context, replacing those elements from the web.xml
as follows:
- A
@Bean
of typeServlet
orServletRegistrationBean
installs that bean in the container as if it was a<servlet/>
and<servlet-mapping/>
inweb.xml
. - A
@Bean
of typeFilter
orFilterRegistrationBean
behaves similarly (like a<filter/>
and<filter-mapping/>
. - An
ApplicationContext
in an XML file can be added to an@Import
in yourApplication
. Or simple cases where annotation configuration is heavily used already can be recreated in a few lines as@Bean
definitions.
Once the war is working we make it executable by adding a main
method to our Application
, e.g.
public static void main(String[] args) { SpringApplication.run(Application.class, args); }
Applications can fall into more than one category:
- Servlet 3.0+ applications with no
web.xml
. - Applications with a
web.xml
. - Applications with a context hierarchy.
- Applications without a context hierarchy.
All of these should be amenable to translation, but each might require slightly different tricks.
Servlet 3.0+ applications might translate pretty easily if they already use the Spring Servlet 3.0+ initializer support classes. Normally all the code from an existing WebApplicationInitializer
can be moved into a SpringBootServletInitializer
. If your existing application has more than one ApplicationContext
(e.g. if it uses AbstractDispatcherServletInitializer
) then you might be able to squash all your context sources into a single SpringApplication
. The main complication you might encounter is if that doesn’t work and you need to maintain the context hierarchy. See the entry on building a hierarchy for examples. An existing parent context that contains web-specific features will usually need to be broken up so that all the ServletContextAware
components are in the child context.
Applications that are not already Spring applications might be convertible to a Spring Boot application, and the guidance above might help, but your mileage may vary.