• spring 部分配置内容备忘


    部分资料来源:

    1. context:component-scan使用说明
    2. SpringMVC源码总结(一)HandlerMapping和HandlerAdapter入门
    3. springmvc中url-url-pattern /和/*的区别

    context:component-scan

    @Component是所有受Spring管理组件的通用形式,而 @Repository, @Service和 @Controller则是 @Component的细化,用来表示更具体的用例(例如,分别对应了持久化层、服务层和表现层)。
    在xml配置了这个标签后,spring可以自动去扫描base-package下面或者子包下面的Java文件,如果扫描到有 @Component @Controller @Service等这些注解的类,则把这些类注册为bean。
    在说明这两个子标签前,先说一下context:component-scan有一个use-default-filters属性,该属性默认为true,这就意味着会扫描指定包下的全部的标有 @Component的类,并注册成bean.也就是 @Component的子注解 @Service, @Reposity等。

    <context:component-scan base-package="com.champion.ssqs.core.test_spring">
    </context:component-scan>
    

    扫描com.champion.ssqs.core.test_spring下全部标有 @Component的类,包括 @Controller, @Service, @Reposity等。

    如果use-default-filters属性设置为false 则需要在context:component-scan中配置要扫描的注解,来扫描对应的注解。

    <context:component-scan base-package="com.champion.ssqs.core.test_spring" use-default-filters="false">
    	<context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
    </context:component-scan>
    

    扫描com.champion.ssqs.core.test_spring下全部标有 @Service的类,其余不扫描。

    <context:component-scan base-package="com.champion.ssqs.core.test_spring" use-default-filters="false">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>
    

    扫描com.champion.ssqs.core.test_spring下全部没有标有 @Controller的类,其余不扫描。

    HandlerMapping,HandlerAdapter

    <mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案。 <mvc:annotation-driven /> 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,是spring MVC为@Controllers分发请求所必须的。
    实际上在3.1之后,<mvc:annotation-driven />注册的类发生了变化
    Spring Framework 3.1 introduces a new set of support classes for processing requests with annotated controllers:

    RequestMappingHandlerMapping
    RequestMappingHandlerAdapter
    ExceptionHandlerExceptionResolver

    These classes are a replacement for the existing:

    DefaultAnnotationHandlerMapping
    AnnotationMethodHandlerAdapter
    AnnotationMethodHandlerExceptionResolver

    The above registers a RequestMappingHandlerMapping , a RequestMappingHandlerAdapter , and an ExceptionHandlerExceptionResolver (among others) in support of processing requests with annotated controller methods using annotations such as
    @RequestMapping , @ExceptionHandler , and others.

    It also enables the following:

    Spring 3 style type conversion through a ConversionService instance in addition to the JavaBeans PropertyEditors used for Data Binding.

    Support for formatting Number fields using the @NumberFormat annotation through the ConversionService .

    Support for formatting Date, Calendar, Long, and Joda Time fields using the @DateTimeFormat annotation.

    Support for validating @Controller inputs with @Valid , if a JSR-303 Provider is present on the classpath.

    HttpMessageConverter support for @RequestBody method parameters and @ResponseBody method return values from @RequestMapping or @ExceptionHandler methods.

    This is the complete list of HttpMessageConverters set up by mvc:annotation-driven:

    ByteArrayHttpMessageConverter converts byte arrays.

    StringHttpMessageConverter converts strings.

    ResourceHttpMessageConverter converts to/from org.springframework.core.io.Resource for all media types.

    SourceHttpMessageConverter converts to/from a javax.xml.transform.Source .

    FormHttpMessageConverter converts form data to/from a MultiValueMap<String, String> .

    Jaxb2RootElementHttpMessageConverter converts Java objects to/from XML — added if JAXB2 is present on the classpath.

    MappingJackson2HttpMessageConverter (or MappingJacksonHttpMessageConverter ) converts to/from JSON — added if Jackson 2 (or Jackson) is present on the classpath.

    AtomFeedHttpMessageConverter converts Atom feeds — added if Rome is present on the classpath.

    RssChannelHttpMessageConverter converts RSS feeds — added if Rome is present on the classpath.

    这是摘取的官方文档

    HandlerMapping接口的实现(常见类型) :

    BeanNameUrlHandlerMapping :通过对比url和bean的name找到对应的对象
    SimpleUrlHandlerMapping :也是直接配置url和对应bean,比BeanNameUrlHandlerMapping功能更多
    DefaultAnnotationHandlerMapping : 主要是针对注解配置 @RequestMapping的,已过时
    RequestMappingHandlerMapping(3.2之前是使用DefaultAnnotationHandlerMapping 这个去处理,但是后来弃用了) :取代了上面一个,现在默认的请求匹配方式,通过 @RequestMapping 注解来决定调用方法和具体的类,也是最常用的一种

    如果没有明确声明任何处理器映射,spring会默认使用BeanNameUrlHandlerMapping,但如果明确声明了其它的处理器映射,则需要将BeanNameUrlHandlerMapping明确声明出来,而且在每个包含被映射的bean的配置文件中都要加入BeanNameUrlHandlerMapping

    HandlerAdapter 接口实现:
    HttpRequestHandlerAdapter : 要求handler实现HttpRequestHandler接口,该接口的方法为 void handleRequest(HttpServletRequest request, HttpServletResponse response)也就是 handler必须有一个handleRequest方法。
    SimpleControllerHandlerAdapter:要求handler实现Controller接口,该接口的方法为ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response),也就是本工程采用的
    AnnotationMethodHandlerAdapter :和上面的DefaultAnnotationHandlerMapping配对使用的,也已过时
    RequestMappingHandlerAdapter : 和上面的RequestMappingHandlerMapping配对使用,针对 @RequestMapping

    举例如下:

    spring.xml配置
    <bean name="/index" class="com.lg.mvc.HomeAction"></bean> 
    
    controller内容
    public class HomeAction implements Controller{  
    
        @Override  
        public ModelAndView handleRequest(HttpServletRequest request,  
                HttpServletResponse response) throws Exception {  
            return new ModelAndView("hello");  
        }  
    }   
    

    先简单的说下这个工程的流程,访问http://localhost:8080/index首先由DispatcherServlet进行转发,通过BeanNameUrlHandlerMapping(含有 /index->HomeAction的配置),找到了HomeAction,然后再拿HomeAction和每个adapter进行适配,由于HomeAction实现了Controller接口,所以最终会有SimpleControllerHandlerAdapter来完成对HomeAction的handleRequest方法的调度。然后就顺利的执行了我们想要的方法。

    url-pattern /和/*的区别

    < url-pattern > / </ url-pattern > 不会匹配到*.jsp,即:*.jsp不会进入spring的 DispatcherServlet类 。
    < url-pattern > /* </ url-pattern > 会匹配*.jsp,会出现返回jsp视图时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。

    总之,关于web.xml的url映射的小知识:
    / 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
    /* 会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)

    IOC(DI)

    IOC理论的意义就是将复杂的对象间的关系分解成相互合作的对象,通过封装,对象类实现对外部是透明的,从而降低了问题的复杂度,而且还可以灵活的被重用和扩展(将对象 间的耦合关系断开,控制权全部交由第三方,所以IOC容器是整个系统的关键核心。

    依赖注入:
    IOC的另外名字叫做依赖注入(Dependency Injection),所谓的依赖注入,就是由IOC容器在运行期间,动态的将某种依赖关系注入到对象中,所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象见的解耦。

    IOC的好处:
    IOC在编程过程中不会对业务对象构成很强的侵入性,使用IOC之后,对象具有更好的可实行性,可重用性和可扩展性:
    1、 降低组件之间的耦合性
    2、 提高开发效率和产品质量
    3、 统一标准,提高模块的可复用性
    4、 模块具有热插拔特性

    IOC的通俗理解:
    1、 IOC控制反转:说的是创建对象实例的控制权从代码控制剥离到IOC容器控制,实际就是你在XML文件控制,侧重于原理
    2、 DI依赖注入:说的是创建对象实例时,为这个对象注入属性值或其他对象实例,侧重于实现

  • 相关阅读:
    机器学习PAL产品优势
    机器学习PAI产品架构
    机器学习PAI
    Auto ML自动特征工程
    Auto ML自动调参
    自动机器学习(AutoML)
    MegEngine基本概念
    MegEngine计算图、MatMul优化解析
    https://music.163.com/#/playlist?id=977461211
    阅后归档 20201020
  • 原文地址:https://www.cnblogs.com/cuiyf/p/6846808.html
Copyright © 2020-2023  润新知