spring笔记介绍

框架 SSM
课程安排: SSM(Spring4 + Spring WEB MVC + MyBatis ) + Linux + Redis …
统一环境: JDK1.8 + STS3.9.2 + Tomcat7 + MySQL5.5以上

框架: 平台 、 简化开发 、 提供标准 、 方便扩展维护 …
现有技术在开发中存在的一些问题:

  1. 创建对象
    现在: new
    框架: 把对象的创建及管理交给Spring的IOC容器管理.
  2. 对象与对象的关系: xxxServlet —> xxxService ---->xxxDao(xxxJdbcDaoImpl xxxMyBatisDaoImpl)
    现在: 例如在xxxService中通过new的方式创建xxxDao(持久化层)对象.
    框架: 将各个组件管理到IOC容器中,IOC容器能够进行自动装配.
  3. 事务管理:
    之前:放到过滤器里边了,但是不是很合适。
    现在: 将事务管理的代码写到每个JDBC方法中.
    conn.setAutoCommit(false); conn.commit(); conn.rollback();
    框架: 声明式事务管理(基于简单的配置+ 注解 作用到Service层)
  4. JavaWEB:
    现在: 写代码时严重耦合与ServletAPI
    框架: SpringMVC 将ServletAPI进行了封装, 间接的依赖于ServletAPI

一、 Spring框架简介

  1. 开源框架
  2. 简化企业级开发.
  3. 非侵入式(轻量级) 、 IOC 、 AOP 、 容器(对象工厂) 、 组件化 、 一站式 …
    二、 Spring HelloWorld
  4. 导入jar包: spring-beans spring-core spring-context spring-expression commons-logging
  5. 创建框架的配置文件: New -> Spring Bean Configuration File -> applicationContext.xml
    3. 在配置文件中通过配置:
    4. 在测试方法中, 创建IOC容器对象, 从容器中获取Bean对象.
    三、 IOC DI
  6. IOC是反转控制, 反转了资源获取的方向. 从主动获取变成被动接收。
  7. DI是依赖注入.
  8. IOC是一种反转控制的思想, DI是对IOC思想的具体实现.
    四、 Bean的配置
    :
    id: 唯一标识.
    class: 指定全类名。 通过反射的方式创建对象.
    : 为对象的属性注入值.
    name: 指定属性名。对应类中的set方法.
    value:指定属性值.
    :使用构造器的方式给对象的属性注入值
    五、IOC容器的结构
    BeanFactory : IOC容器的基本实现, 面向Spring框架本身的
    ApplicationContext : BeanFactory的子接口, 提供了更多高级的特性,面向框架的使用者的.
    ConfigurableApplicationContext : 额外提供了 close refresh方法. 支持我们进行关闭,刷新的操作.
    ClasspathXmlApplicationContext: 从类路径下读取xml文件并创建IOC容器对象
    FileSystemXmlApplicationContext: 从文件系统下读取xml文件并创建IOC容器对象
    WebApplicationContext : 专门为web应用准备的.
    六 、getBean方法
    getBean方法是在BeanFactory接口中定义的. 有重载现象。
    getBean(String id): 通过的id来获取对象。
    getBean(Class cls): 通过的class来获取对象,需要注意匹配到多个bean的情况.
    getBean(String id, Class cls): 通过的id和class来获取对象.
    七、 依赖注入的方式
    set方式
    构造器方式 必要的时候通过type指定参数的类型 index指定参数的位置

八、依赖注入可以使用的值

  1. 字面值 可以通过字符串表示的值. 使用value 或者是来进行注入.
    特殊字符: 可以使用实体. 或者使用 <![CDATA[ .... ]]>
  2. 引用其他的bean 使用ref或者是来引用IOC容器中的bean对象
  3. 级联属性操作
  4. 内部bean 只能在内部使用.
  5. 集合(List 、Set 、Array、Map):
  6. 独立的集合bean
    <util:list > util:set util:map …
    九、 p名称空间 p:xxx p:xxx-ref

十、 FactoryBean
1.Spring通过工厂bean支持我们参与到bean对象的创建过程中.
2.工厂bean最终返回的对象是由getObject方法来决定。

十一、bean的作用域

  1. 通过scope来设置bean的作用域, 默认的作用域是 singleton.

  2. singleton : 单例的 , 在整个IOC容器中只会创建一个bean对象,是在IOC容器对象被创建时就创建 .

  3. prototype :多例的 ,在整个IOC容器中会创建多个bean对象. 不会在IOC容器对象被创建时创建. 而是每次getBean时, 创建一个新对象返回.

  4. request : 一次请求期间.

  5. session : 一次会话期间.
    十二、bean的生命周期

  6. 默认的生命周期的5个阶段:
    a. 调用构造器创建bean对象
    b. 调用set方法给bean对象的属性赋值
    c. 调用初始化方法. 初始化方法需要我们自己定义, 并且要通过 init-method进行指定.
    d. 使用bean
    e. 容器关闭时,调用销毁方法. 销毁方法需要我们自己定义,并且要通过destroy-method进行指定.

  7. Bean的后置处理器
    a. 可以通过实现BeanPostProcessor接口,定义后置处理器
    b. 后置处理器会对IOC容器中的每一个bean的生命周期都起作用.
    c. 后置处理器会在默认的生命周期的初始化阶段的前后再进行额外的处理.
    十三、 引用外部的属性文件

  8. 在IOC容器中配置连接池对象

  9. 引入外部的属性文件
    a.


    b. <context:property-placeholder location=“classpath:db.properties”/>

  10. 在Spring的配置文件中, 通过 ${} 的方式读取到属性文件中的内容.
    十四、 自动装配

  11. 通过autowire来指定自动装配的模式.

  12. byName: 使用要装配的属性名 与 IOC容器中的bean的id进行匹配,匹配成功则进行装配.

  13. byType: 使用要装配的属性的类型 与 IOC容器中的bean的class进行匹配. 如果能唯一匹配, 在装配成功,
    如果匹配到多个兼容类型的bean,则装配失败.
    十五、基于注解配置bean 装配bean

  14. 几个常用的注解
    @Component
    @Controller
    @Service
    @Repository
    @Autowired
    @Qualifer
    2. 组件扫描
    <context:component-scan base-package=“包”/> : Spring会扫描指定包以及子包下的所有的类,将带有注解的进行管理.
    <context:include-filter type=“annotation/ assignable”> : 指定扫描。 使用指定扫描 需要设置 use-default-filters=“false”
    context:exclude-filter : 排除扫描.

  15. 组件装配

    1. @Autowired 的工作机制:
      首先使用byType的方式进行自动装配,如果能唯一匹配,则进行装配,如果匹配到多个兼容类型的bean,
      再使用byName的方式进行唯一性确定, 如果能唯一确定,则装配成功,如果不能唯一确定,则抛出异常.
    2. required 属性:
      默认情况下,使用@Autowired标注的属性,必须要进行 装配,可以使用required=false来设置为不是必须的.
    3. @Qualifier
      必要的时候,还可以使用该注解指定要装配的bean的id值.
    4. @Autowired @Qualifier 注解可以加到属性上,也可以加在带有形参的方法上(set方法)
      十六、动态代理
  16. 代理模式的原理
    使用一个代理对象将目标对象包装起来. 然后使用代理对象"取代"目标对象. 所有对目标对象的操作都需要
    通过代理对象. 代理对象也可以决定是否以及何时将方法的调用转回到目标对象.

  17. 动态代理的方式
    基于接口实现动态代理: JDK动态代理
    基于继承实现动态代理: Cglib javassist 等.

  18. JDK动态代理
    Proxy : 是所有动态代理类的父类,主要用于创建动态代理类 或者 代理类的对象.
    Object proxy = newProxyInstance(ClassLoader, Interfaces ,InvocationHandler)
    Class proxyClass = getProxyClass(ClassLoader,Interfaces );
    InvocationHandler: 主要用于完成代理过程.
    invoke(proxy, Mehtod , args)
    4. 动态代理相关的问题分析:

    1. 获取到的Object类型的代理对象可以强制转换成目标对象实现过的接口类型. 但是不能转换成目标类型的.

      2.代理对象调用代理方法, 会执行InvocationHandler中的invoke方法.(InvocationHandler中的invoke方法何时执行?)

      a. 在调用newproxyInstance方法的时候, 我们将自己创建好的InvocatHandler对象 myH 传入到该方法中.

      b. 在newProxyInstance方法中, 会获取到代理类中的带InvocationHandler参数的构造器(参考Proxy类中729行),

      然后再执行该构造器,将我们传入的myH又传入到了构造器中,(参考Proxy类中的739行)

      c. 在代理类的构造器中,通过super(h) 将我们出入的myH又传入到了父类Proxy的构造器中.

      d. 在Proxy的构造器中,又将我们传入的myH赋值给成员变量h(参考Proxy中的266行)

      e. 在代理类中的每个代理方法中,都一行 super.h.invoke()方法,因为super.h获取到的对象实际就是我们自己创建的myH

      f. 因此, 代理对象调用代理方法,代理方法中的super.h.invoke 就会调用到我们自己创建好的myH对象中的invoke方法.

十七、 Spring AOP
1. AOP 面向切面编程.
2. AOP 术语
横切关注点 、 切面 、 通知 、 目标 、 代理 、 连接点 、 切入点
3. AspectJ
AspectJ 不属于Spring. 但是AspectJ是比较完整流行的AOP框架. Spring对AspectJ进行了支持. 支持注解以及XML两种方式.
4. AspectJ 注解开发
4.1 组件扫描·
4.2 开启注解支持 <aop: aspectj-autoproxy/>
4.3 切面 通过@Component注解标识为一个组件 , 在通过@Aspect注解标识为切面
4.4 通知
前置通知 @Before
后置通知 @After
返回通知 @AfterReturning
异常通知 @AfterThrowing
环绕通知 @Around
4.5 切入点表达式 execution(修饰符 返回值类型 包+类+方法(参数列表) )
4.6 连接点对象
JoinPoint
proceedingJoinPoint
4.7 切面的优先级
通过@Order 注解来指定切面的优先级, 需要指定int类型的值, 值越小优先级越高。 默认值就是int的最大值.
4.8 重用切入点表达式
在切面中,随便定义一个方法,然后使用@PointCut 注解定义切入点表达式. 然后在各个通知的注解中就可以使用
方法名() 来使用定义好的切入点表达式.
5. AspectJ xml配置
aop:config
<aop:pointcut expression="" id =“myPointcut”/>
<aop:aspect ref=“切面” order=“优先级”>
<aop:before method="" pointcut-ref=“myPointcut” />
aop:after/

</aop:aspect>
</aop:config>

十八、 Spring Jdbc : JdbcTemplate

  1. update(): 完成增删改操作
  2. batchUpdate(): 完成批量增删改
  3. queryForObject(): 查询单条数据返回单个对象 / 查询返回单个值
  4. query(): 查询多条数据返回多个对象的集合

十九、 声明式事务管理

  1. Spring既支持编程式事务管理, 也支持声明式事务管理.
  2. 事务管理器: DataSourceTransactionManager
  3. 基于注解:
    3.1 <tx:annotation-driven transaction-manger=“指定事务管理器”/>
    3.2 @Transactional
    a. 该注解可以加在类上或者是方法上.
    b. 事务的传播行为 : propgation = REQUIRED / REQUIRES_NEW
    c. 事务的隔离级别 : isolation = 读未提交 、 读已提交 、 可重复读 、 串行化
    d. 事务的回滚与不回滚
    e. 事务的只读设置 readOnly = true / false .
    f. 事务的超时设置 timeOut
  4. 基于xml
    <tx:advice id=“txAdvice” transaction-manager="">
    tx:attributes
    <tx:method name="" …>
    </tx:attributes>
    </tx:advice>
    aop:config
    <aop:pointcut expression="" id=“txPointcut”/>
    <aop:advisor advice-ref=“txAdvice” pointcut-ref=“txPointcut”>
    </aop:config>

Spring WEB MVC
一 、 Springmvc HelloWorld
1.搭建工程环境
2.在web.xml中配置Springmvc的前端控制器 DispatcherServlet
3.编写Springmvc的核心配置文件 springmvc.xml
3.1 组件扫描
3.2 视图解析器
4.编写请求处理器 、 请求处理方法
5.准备视图页面
6.浏览器端发送请求进行测试.
7.总结:
7.1 启动Tomcat服务器
启动Tomcat服务器时,因为DispatcherServlet中配置了,DispatcherServlet会在服务器启动时加载,
因为还配置了,指定了Springmvc框架的核心配置文件,因此在加载DispatcherServlet时会读取核心配置文件,
进而将Springmvc的容器对象创建好.
在创建Springmvc的容器对象时, 会通过组件扫描 ,将加了@Controller注解的组件管理到容器中, 因为在请求处理中的方法
上加了@RequestMapping注解,所以也会分析到当前Springmvc可以处理哪些请求,以及哪些请求交给哪个请求处理中的请求处理
方法进行处理.
信息: Mapped URL path [/hello] onto handler ‘helloWorldHandler’
三月 04, 2019 10:24:02 上午 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
信息: Mapped URL path [/hello.*] onto handler ‘helloWorldHandler’
三月 04, 2019 10:24:02 上午 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
信息: Mapped URL path [/hello/] onto handler ‘helloWorldHandler’
7.2 浏览器端发送请求 http://localhost:8888/Springmvc01/hello
7.3 请求先到达web.xml中与DispatcherServlet中配置的中的进行匹配。匹配成功,将请求交给
DispatcherServlet
7.4 DispatcherServlet根据请求映射,将当前的请求交给对应的请求处理器
7.5 请求处理器调用具体的请求处理方法进行当前请求的处理. 处理完成后,返回一个字符串(逻辑视图名)
7.6 视图解析器结合prefix + 方法的返回值 + suffix 生成一个物理视图路径,再通过转发的方式去往该视图.
7.7 浏览器端接收到响应,呈现结果。
二、@RequestMapping

  1. @RequestMapping注解完成 请求URL 与 请求处理器(请求处理方法)之间的映射。
  2. @RequestMapping可标注的位置 :
    类上 :
    方法上 :
  3. @RequestMapping的常用属性:
    value : 指定映射的URL
    method: 指定映射的请求方式
    params: 指定映射的请求参数
    headers: 指定映射的请求头信息
  4. @RequestMapping支持 Ant风格的URL:
    ?: 匹配一个任意字符
    *:匹配多个任意字符
    **:匹配多层路径
  5. @RequestMapping支持带占位符的URL:
    占位符: {id} 例如: @RequestMapping(value="/testRM/{id}")
    @PathVariable : 将占位符对应的具体的URL中的值 映射到 请求处理方法的形参中

三、REST

  1. Http中定义了四种表示操作的动词 , GET POST PUT DELETE , 对应 查询 添加 修改 删除 操作.
    也就意味着完成什么样的操作需要通过对应的请求方式来发送请求.
  2. HiddenHttpMethodFilter:
    在满足转换条件的情况下, 将客户端的请求转换为对应的PUT/DELETE。
    需要满足的条件:
    当前的请求方式必须是POST
    从当前的请求中能通过 _method 获取到对应的请求参数值.
  3. REST CRUD
    查询 user/1001 GET
    添加 user POST
    删除 user/1001 POST(_method=DELETE) >HiddenHttpMethodFilter >DELETE
    修改 user POST(_method=PUT)
    >HiddenHttpMethodFilter
    >PUT

四、 处理请求数据

  1. Springmvc如何处理请求数据?
    Springmvc会结合 请求对象(请求数据的来源) 与 请求处理方法(请求数据的去向) 进行分析, 最终将请求数据映射到请求处理方法对应的形参中 .
  2. @RequestParam value=“请求参数名” required=“true/false” defaultValue=“默认值”
  3. @RequestHeader
  4. @CookieValue
  5. 使用POJO封装请求参数 ,要求请求参数名与POJO的属性名一致.
  6. 使用原生的ServletAPI : HttpServletRequest HttpServletResponse HttpSession …

五、 处理模型数据

  1. ModelAndView
    1.1 两个重要的成员变量
    private Object view; 描述视图信息
    private ModelMap model; 描述模型数据(响应数据)
    1.2 常用的方法
    public void setViewName(String viewName) 设置视图信息
    public ModelAndView addObject(String attributeName, Object attributeValue) 设置模型数据
    protected Map<String, Object> getModelInternal 获取模型数据
    public ModelMap getModelMap() 获取模型数据
    public Map<String, Object> getModel() 获取模型数据
    1.3 ModelAndView 源码流程分析总结:
    [1]. 在DispatcherServlet的945行, 准备执行请求处理器,调用请求处理方法
    mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
    [2]. 执行请求处理方法, 返回一个ModelAndView对象, 返回到DispatcherServlet的945行.
    [3]. 在DispatcherServlet的959行, 准备开始处理ModelAndView
    processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
    [4]. 在DispatcherServlet的1012行,准备分析ModelAndView,得到一个视图对象.
    render(mv, request, response);
    [5]. 在DispatcherServlet的1204行, 通过ModelAndView中的视图信息解析得到视图对象==>InternalResourceView
    view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);

      [6]. 在DispatcherServlet的1225行,视图对象开始处理模型数据
        view.render(mv.getModelInternal(), request, response);
     	   解释: render()方法是View接口中的抽象方法,在AbstractView中对render()方法做了统一实现.
      [7]. 在AbstractView中的266行,准备处理模型数据 
          renderMergedOutputModel(mergedModel, request, response);
        解释: renderMergetOutputModel方法是在AbstractView中定义的抽象方法, 该方法在不同的视图类中做了不同的实现。
     	  因为当前解析得到的视图对象时InternalResourceView,因此会调用到InternalResourceView中的renderMergedOutputModel方法.
      [8]. 在InternalResourceView中的180行, 将模型数据设置到request域对象中. 
        exposeModelAsRequestAttributes(model, requestToExpose);
          
     [9].在InternalResourceView中的189行,获取到转发器
       RequestDispatcher rd = getRequestDispatcher(requestToExpose, dispatcherPath);
      [10].在InternalResourceView中的209行,开始转发
         rd.forward(requestToExpose, response);
       作业: 自己组织语言描述ModelAndView的执行过程. 
    
  2. Map Model ==>BingingAwareModelMap

  3. 一个结论: 不论请求处理方法的返回值是ModelAndView、String 等, Springmvc在调用完请求处理方法后,都会统一处理成一个
    ModelAndView对象.

六、 视图解析

  1. Springmvc 如何解析视图 ?
    不管请求处理器的请求处理方法 返回的是String 、 ModelAndView 等, Spring最终都会处理成一个ModelAndView对象,
    视图解析器会解析ModelAndView中的view信息得到视图对象,视图对象再处理ModelAndView中的model数据.

  2. 视图 : 视图的作用就是处理模型数据,完成最终的转发或者是重定向的工作.
    2.1 视图是由 View 接口来定义的.
    2.2 View 接口中的两个方法
    String getContentType(); 设置响应头信息 . response.setContentType(“text/html;charset=utf-8”);
    void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)
    处理模型数据,完成最终的转发或者是重定向的工作。
    2.3 AbstractView
    [1]. AbstractView是View接口下面的一个抽象类,在该类中对render方法做了统一实现.
    [2]. AbstractView中定义了一个抽象方法renderMergedOutputModel ,该方法在每一个具体的视图对象中做了不同的实现,
    主要完成的工作就是转发 或者是 重定向.
    2.4 常用的视图实现类
    InternalResourceView 转发视图
    JstlView 转发视图 ,是InternalResourceView的子类. 如果当前工程环境下加入了JSTLjar包,则会解析成JstlView.
    RedirectView 重定向视图

  3. 视图解析器 : 视图解析器的工作就是负责解析得到视图对象.
    3.1 视图解析器是由 ViewResolver接口定义的
    3.2 ViewResolver接口中的方法
    View resolveViewName(String viewName, Locale locale) throws Exception; 根据视图名字解析得到视图对象
    3.3 常用的视图解析器实现类
    InternalResourceViewResolver
    3.4 视图解析器的优先级问题

  4. 重定向
    4.1 重定向是由RedirectView来完成的。
    4.2 只需要视图信息前面加上redirect:

七 、REST CRUD

  1. 查询所有的员工 列表展示 GET

  2. 添加新的员工
    去往添加页面 GET
    真正的添加 POST

  3. 修改员工
    去往修改页面 GET
    真正的修改 PUT

  4. 删除员工 DELETE

  5. 表单标签 : 快速开发页面 、 方便数据的回显.

  6. 静态资源请求问题:
    mvc:default-servlet-handler/
    mvc:annotation-driven/

八 、 处理Json

  1. Springmvc如何处理Json
    基于jackson技术完成对json的处理. 在Springmvc中,在请求处理方法中将方法的返回值类型声明为具体java对象的类型, 然后在请求处理方法上
    加上@ResponseBody注解.
  2. HttpMessageConverter
    主要负责将请求信息转换为具体的java对象, 将java对象输出为响应信息.
  3. 如何使用消息转换
    @RequestBody @ResponseBody
    HttpEntity ResponseEntity
    4. 使用ResponseEntity 完成下载操作

九 、 文件上传

  1. MultipartResolver 是Springmvc对文件上传做的直接支持
  2. Springmvc基于 commons fileUpload 技术 提供了 CommonsMultipartResolver实现类.
  3. 配置上传组件 CommonsMutipartResolver:
    id必须指定成 mutipartResolver
    选择性的给CommonsMutipartResolver中的属性赋值, defaultEncoding maxUploadSize …
  4. MultipartFile 用于描述上传过来的文件对象. ·

十 、 拦截器

  1. 自定义拦截器
    1.1 实现HandlerInterceptor接口
    1.2 继承HandlerInterceptorAdaptor类

  2. 拦截器的配置
    mvc:interceptors


    mvc:interceptor
    mvc:mapping
    mvc:exclude-mapping


    </mvc:interceptor>
    </mvc:interceptors>

  3. 拦截器中三个方法的执行顺序 以及 执行时机:
    preHandle DispatcherServlet的939行开始执行,是在请求处理方法之前执行的.
    postHandle DispatcherServlet的954行开始执行,是在请求处理方法之后, 视图处理之前执行的.
    afterCompletion DispatcherServlet的1030行开始执行,是在视图处理之后执行的.

  4. 多个拦截器的执行顺序:
    拦截器的执行顺序由配置顺序决定,先配置的先执行.

  5. 多个拦截器中方法的执行顺序:
    preHandle: 与拦截器的执行顺序一致.
    postHandle: 与拦截器的执行顺序相反.
    afterCompletion:与拦截器的执行顺序相反.

  6. 拦截器中preHandle方法返回false:
    如果第一个拦截器的preHandle返回false,后续的处理都不执行.
    如果不是第一个拦截器的preHandle返回false, 之前拦截器的afterCompletion方法都会执行.
    十一 、异常处理 HandlerExceptionResolver

  7. 在Springmvc中,不管请求是正常执行,还是抛出异常,都需要得到一个ModelAndView对象.

  8. DefaultHandlerExceptionResolver 对一些特定的异常进行处理.

  9. SimpleMappingExceptionResolver 可以配置异常与视图的映射, 抛出什么异常去往什么视图,并报告异常.

十二 、 运行流程
HandlerExecutionChain :包含了请求处理器还有所有的拦截器对象。 由HandlerMapping对象获取.
HandlerMapping : 定义了请求与处理器之间的映射.
HandlerAdapter : 请求处理器适配器对象,主要负责 分析@RequestMapping,方法的参数,方法的返回值,方法的调用,ModelAndView对象的封装等.

十三 、 Spring 与 Springmvc 整合问题:

  1. Spring 与 Springmvc 是否需要整合?
    不需要 : 单独使用Springmvc,将之前Spring中的配置全部迁移到Springmvc中即可。[不建议]
    需要 :Spring与Springmvc同时使用。 Springmvc只负责web相关的处理。 其他的都交给Spring处理。
    Spring : 数据源、 AOP 、 声明式事务管理 …
    Springmvc: 与web相关的。

  2. Spring的容器对象如何创建 ?
    非WEB环境: 直接在main方法或者是junit测试方法中创建Spring容器对象.
    WEB环境 : 希望在服务器启动时,就将Spring的容器对象创建好。
    思路: 通过监听器监听ServletContext对象的创建.因为ServletContext对象是在服务器启动时创建,并且只会被创建一次。
    当监听到ServletContext对象被创建时, 在对应的事件处理方法中,将Spring的容器对象创建出来.
    然后再将Spring容器对象保存到ServletContext中, 共享给每个组件.

    Spring提供好的监听器: ContextLoaderListener

  3. Bean对象被创建两次的问题
    因为Spring与Springmvc都进行了组件扫描, 所以会将扫描到的组件管理到自己的容器中。
    正常情况Springmvc只负责web相关的,也就是Handler, Spring要负责除了web之外的,也就是Service 、Dao.
    所以在组件扫描的配置中,需要使用context:include-filter和context:exclude-filter进行过滤.

  4. Spring容器与 Springmvc容器的关系:
    父子关系, Spring是父容器,Springmvc是子容器. 子可以访问父,父不能访问子。

  5. 扩展
    Spring容器: Root WebApplicationContext: startup date [Thu Mar 07 11:36:05 CST 2019]; root of context hierarchy
    Springmvc容器: WebApplicationContext for namespace ‘springDispatcherServlet-servlet’:
    startup date [Thu Mar 07 11:37:35 CST 2019]; parent: Root WebApplicationContext
    如何在Handler方法中获取到Spring的容器对象?
    (ApplicationContext)sc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
    WebApplicationContextUtils.getWebApplicationContext(sc);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值