spring注解的相关配置

时间:2022-09-17 20:35:48

一、<context:annotation-config> 和 <context:component-scan>

<context:annotation-config>的作用:将已经在spring容器中注册的bean激活。实际含义是,使注解能使用已经在spring容器中注册的过的bean,不论是通过xml配置和通过包扫描注册的bean,都包含在内。

<context:component-scan>的作用:在<context:annotation-config>的基础上,可以扫描指定包,将包含注解的类注册到spring容器中。如:<context:component-scan base-package="ki"/>。

二、<mvc:annotation-driven>

<mvc:annotation-driven>会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,这是Spring MVC为@Controller分发请求所必需的,并且提供了数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持读写XML的支持(JAXB)和读写JSON的支持(默认Jackson)等功能。

我们找到对应的实现类是:

org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser.
通过阅读类注释文档,我们发现这个类主要是用来向工厂中注册了

RequestMappingHandlerMapping
BeanNameUrlHandlerMapping
RequestMappingHandlerAdapter
HttpRequestHandlerAdapter
SimpleControllerHandlerAdapter
ExceptionHandlerExceptionResolver
ResponseStatusExceptionResolver
DefaultHandlerExceptionResolver

上面几个Bean实例.这几个类都是用来做什么的呢?

前两个是HandlerMapping接口的实现类,用来处理请求映射的.

  • 其中第一个是处理@RequestMapping注解的.
  • 第二个会将controller类的名字映射为请求url.

中间三个是用来处理请求的.具体点说就是确定调用哪个controller的哪个方法来处理当前请求.

  • 第一个处理@Controller注解的处理器,支持自定义方法参数和返回值(很酷).
  • 第二个是处理继承HttpRequestHandler的处理器.
  • 第三个处理继承自Controller接口的处理器.

后面三个是用来处理异常的解析器.

另外还将提供以下支持:
① 支持使用ConversionService实例对表单参数进行类型转换; 
② 支持使用@NumberFormatannotation,@DateTimeFormat注解完成数据类型的格式化; 
③ 支持使用@Valid注解对Java bean实例进行JSR 303验证; 
④ 支持使用@RequestBody和@ResponseBody注解

三、<mvc:default-servlet-handler />和<mvc:resources />

这两个注解都是用来处理静态资源的,其实不使用它们也可以访问静态资源,那么使用这两个注解的意义是什么。

这其实是书写规范的问题,其强调HTTP应当以资源为中心,并且规范了URI的风格,这种书写规范不希望待.html或.do等后缀,但是早期的Spring MVC不能很好的处理静态资源,所以在请求映射里,不会使用/,而通常使用*.do等的方式。

所以为了,规范,为了使用/的请求映射,新加了这两个功能。

当使用*.do的后缀时,spring在找不到相应的映射处理时,会按照请求路径查找静态资源路径。但是,在使用/的映射处理时,spring容器会将所有的请求当成映射路径,不回去查找资源文件,处理这种情况,就用到了这两个注解。

1、<mvc:default-servlet-handler />

在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。

一般Web应用服务器默认的Servlet名称是"default",因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定:

<mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />

2、<mvc:resources />

<mvc:default-servlet-handler />将静态资源的处理经由Spring MVC框架交回Web应用服务器处理。而<mvc:resources />更进一步,由Spring MVC框架自己处理静态资源,并添加一些有用的附加值功能。

<mvc:resources />通过location和mapping参数,可以访问项目中的任何一处静态资源。

<mvc:resources location="/,/css/,/WEB-INF/classes/,/WEB-INF/classes/,classpath:/" mapping="/resources/**/"/>

location属性:项目内的文件路径(部署后的路径),其中classpath:/等同于/WEB-INF/classes/。

mapping属性:将项目内的实际路径,映射到的一个虚拟的用于请求静态资源的路径。

注意:每个location路径只能报该文件夹下的资源文件映射到mapping,如:/只能映射项目根目录下的资源文件,而不能映射跟目录下的css文件夹下的目录,必须新加一个/css/的配置。

配置完成后,当要请求静态资源路径时:

例如 ,在跟目录径下的css文件夹下有个style.css,那么请求路径就是:http://localhost:8080/ssm-login/resources/style.css

即使是WEB-INF下的文件,也可以得到,WEB-INF下的login.jsp的请求路径:http://localhost:8080/ssm-login/resources/login.jsp

 

 四、 <tx:annotation-driven transaction-manager="" />

 含义为:支持使用注解来进行实物管理,并指定一个事务管理器。

 

<util:properties id="cfg" location="classpath:config.properties"/>  
   <!--配置DruidDataSource连接池 -->
   <bean id="ds" class="com.alibaba.druid.pool.DruidDataSource"
        destroy-method="close" init-method="init" lazy-init="true">
        <property name="driverClassName" value="#{cfg.driver}" />
        <property name="url" value="#{cfg.url}" />
        <property name="username" value="#{cfg.username}" />
        <property name="password" value="#{cfg.password}" />
        <!-- 初始化连接大小 -->
        <property name="initialSize" value="#{cfg.initialSize}" />
        <!-- 连接池最大数量 -->
        <property name="maxActive" value="#{cfg.maxActive}" />
        <!-- 连接池最小空闲 -->
        <property name="minIdle" value="#{cfg.minIdle}" />
        <!-- 获取连接最大等待时间 -->
        <property name="maxWait" value="#{cfg.maxWait}" />
     </bean>

<!--     事务管理器   -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="ds" />  
    </bean> 
<!-- 支持使用注解来进行事务管理 -->
    <tx:annotation-driven transaction-manager="transactionManager" />