Spring有两种配置方式,分别为XML配置与java文件配置,其实两者本质上是一模一样的,只不过用java文件配置的好处是少了一个读文件的过程,可以将两种配置方式结合对应起来总结。
首先了解一下Spring配置需要配置哪些东西:
1.前端控制器 DispatcherServlet
2.处理器映射器 HandlerMapping
3.处理器适配器 HandlerAdapter
4.视图解析器 ViewResolve
除了前端控制器是以servlet形式配置,其他三个如果要配置也是以Bean的形式配置。
处理器映射器有两种,一种是非注解处理器映射器,一种是注解处理器映射器。
先看我们熟悉的注解处理器映射器吧,配置后即可使用注解的形式配置URL路由,说白了直接在打了@Controller的controller层接口中用@RequestMapping(value="...")就可以将URL映射过来,即处理器映射器就是这么找处理器的,再说白了,URL就知道到哪个接口去了。为了让注解的处理器映射器能够找到Handler,还需要将controller作为Bean配置好,这是前提,有两种方式:
1.直接将controller类作为bean配置好
<bean class="com.test.controller.TestController"></bean>
2.扫描配置,对一个包下所有有@controller注解的类进行扫描
<context:component-scan base-package="com.test"></context:component-scan>
然后看看怎么配置注解处理器映射器,从XML配置和JAVA文件配置两种方法比较总结。
一.XML配置注解处理器映射器
有两种方式:
第一种是配置好自带的springframework中的处理器映射器,当然这种方式需要在其后配置好同样自带的springframework中的处理器适配器。
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="order" value="0"/>
<property name="useDefaultSuffixPattern" value="false"/>
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
第二种是使用<mvc:annotation-driven>标签,<mvc:annotation-driven>标签默认注册了四个bean,分别为RequestMapping,HandlerMapping,RequestMappingHandlerAdapter和DefaultHandlerExceptionResolver。既然已经配置好了处理器映射器和处理器适配器,XML中就不需要其他配置了。
二.java文件配置注解处理器映射器
由于使用java文件配置是纯注解配置Spring,所以必然用的是注解处理器映射器和适配器。总之我在SpringConfiguration.java文件中没有找到配置处理器映射器的地方。如果需要配置的话必然是在里面打上@Bean注解以bean的形式进行配置,可能是因为某个类的父类默认使用注解处理器映射器吧,不需要配置了。
看完了注解处理器映射器,再来看看非注解处理器映射器。
配置非注解处理器映射器的时候要将路由以属性的形式也配置好,当然,由于用java文件配置Spring是纯注解配置Spring必然不会去配置非注解处理器映射器和适配器,所以这种非注解处理器映射器和适配器只会在XML中进行配置。由于路由已经在XML中配置好了,controller接口上也不需要写@RequestMapping了,也不需要打@Controller标签了。
有三种配置非注解处理器映射器的方式:
1..SimpleUrlHandlerMapping,直接配置好路由。
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mapping">
<props>
<prop key="/test1.action">testController1</prop>
<prop key="/test2.action">testController2</prop>
</props>
</property>
</bean>
<bean id="testController1" class="com.fageweiketang.controller.TestController1"/>
<bean id="testController2" class="com.fageweiketang.controller.TestController2"/>
.SimpleUrlHandlerMapping处理器映射器配置好后还需要配置处理器适配器,有两种配置方式
1.SimpleControllerHandlerAdapter
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
2.HttpRequestHandlerAdapter
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
2.通过BeanNameUrlHandlerMapping 也就是根据url请求去匹配bean的name属性url,从而获取Controller
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 配置自定义Controler -->
<bean id="myController" name="/hello.do" class="cn.zn.controller.MyController"></bean>
3.通过ControllerClassNameHandlerMapping 也就是根据类名(MyController)类名.do来访问,类名首字母小写
<bean
class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
</bean>
总是非注解的处理器映射器和适配器现在用的比较少了,了解即可。
再来看看前端控制器的配置。
一.在XML中配置前端控制器
<servlet>
<servlet-name>springServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/spring-mvc*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
二.在java文件中配置
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic;
public class WebInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(Config.class);
ctx.setServletContext(servletContext);
Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
servlet.addMapping("/");
servlet.setLoadOnStartup(1);
}
}
不管哪种配置方式,前端控制器都是作为servlet去配置的。
最后看一下视图解析器的配置:
一.在XML中配置视图解析器
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/" />
<property name="suffix" value=".jsp" />
</bean>
二.在java文件中配置
@Configuration
@ComponentScan("com.csonezp")
@EnableWebMvc
public class Config {
/**
* jsp视图解析器的bean
* @return
*/
@Bean
public UrlBasedViewResolver setupViewResolver() {
UrlBasedViewResolver resolver = new UrlBasedViewResolver();
resolver.setPrefix("/WEB-INF/");
resolver.setSuffix(".jsp");
resolver.setViewClass(JstlView.class);
return resolver;
}
/**
* 配置数据源
* @return
*/
@Bean(name = "dataSource")
public ComboPooledDataSource getDataSource() {
try {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mfdb");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setUser("root");
dataSource.setPassword("zp1228");
dataSource.setMaxPoolSize(75);
return dataSource;
} catch (Exception e) {
return null;
}
}
}
不管哪种配置方式,视图解析器都是作为bean的形式去配置的。
最后总结一下:
由于处理器映射器和处理器适配器随着Spring版本更新种类比较多,配置较为复杂。其他的配置还是很好理解的。还有一点,不是所有项目都需要配置视图解析器,看需要以什么样的形式返回给前端了。比如前后端分离的项目直接将数据放在响应里返回给前端就不需要配置视图解析器了,前端拿到响应中的数据自己去处理并展示给用户。