• spring框架学习(三)


    一、Spring自动组件扫描

    Spring 提供组件扫描(component scanning)功能。它能从指定的classpath里自动扫描、侦测和实例化具有特定注解的组件。

    基本的注解是@Component,@Name它标识一个受Spring管理的组件。其他特定的注解有@Repository、@Service和@Controller,它们分别标识了持久层注解、业务层注解和控制层注解的组件。

    1.@Component,@PostConstruct,PreDestroy注解扫描

    1.1)在配置文件添加自动组件扫描配置

                 <!-- 组件扫描    自动 扫描com.spring包以及子包下所有的组件类-->
                 <context:component-scan base-package="com.spring"></context:component-scan>

    1.2)新建一个TestComponentScan类 分别添加一个无参构造器,一个初始化方法和一个销毁回调方法(@PostConstruct和PreDestroy注解分别用于指定初始化和销毁回调方法。初始化和销毁还可以通过配置文件init-method,destroy-method属性来执行初始化和销毁《注意:只有单例模式才会spring才会自动调用销毁方法》)

    package com.spring.dao;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class TestComponentScan {
        public TestComponentScan() {
            System.out.println("-------------实例化对象-------------");
        }
        @PostConstruct
        public void init(){
            System.out.println("-------------初始化对象-------------");
        }
        @PreDestroy
        public void destroy(){
            System.out.println("-------------销毁对象-------------");
        }
    }

    1.3)在测试类添加testComponentScan方法

    @Test
        public void testComponentScan(){
            String con = "applicationContext.xml";
            AbstractApplicationContext ac = new ClassPathXmlApplicationContext(con);
            TestComponentScan tcs = ac.getBean("testComponentScan",TestComponentScan.class);
            System.out.println(tcs);
            ac.close();
        }

    1.4)控制台输出我们写的打印信息就说明自动组件扫描成功了

    2.@Scope注解

    Spring容器最初提供了两种bean的Scope类型:1.@Scope("singleton"),2@Scope("prototype"),默认类型为Singleton。但是2.0发布后新增了三种scope类型request、session和global session,这三种只能在web 应用中才可以使用。(后面三种暂时没用过不详细看了)

    request:每次http请求将会有各自的bean实例,类似于prototype。 

    session:在一个http session中,一个bean定义对应一个bean实例。

    global session:在一个全局的http session中,一个bean定义对应一个bean实例。典型情况下,仅在使用portlet context的时候有效。

    2.1)singletonprototype的区别

    Singleton:当一个bean的作用域设置为singleton时,那么Spring IOC容器只会存在一个共享bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例。
    ***这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的,单例设计模式表示一个ClassLoader中只有一个class存在,而这里的singleton则表示一个容器对应一个bean,也就是说当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。***

    Prototype:prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当与一个new的操作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。
          不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被singleton作用域bean占用资源的一种可行方式是,通过使用bean的后置处理器,该处理器持有要被清除的bean的引用。)

    2.2)写一个测试方法测试一下singleton只创建一个实例,而prototype每次调用都会创建一个新的实例

    2.2.1在TestComponnetScan类中添加@Scope注解

    @Scope("singleton")

    2.2.2)在测试方法中,再调用一次getBean()方法,并且判断这两个对象知否指向同一个

    TestComponentScan tcs2 = ac.getBean("testComponentScan",TestComponentScan.class);
            System.out.println(tcs==tcs2);

    2.2.3)Junit运行,可以从控制台看出只实例化了一次,并且两个对象指向同一实例

    2.2.4)修改Scope注解为prototype模式

    2.2.5)Junit运行,可以从控制台看出调用两次getBean,实例化,初始化了两次,并且两个对象指向不是同一实例

    二、SpringMVC

    MVC模式简介:M:Model模型。Model的职责是负责业务逻辑。包含两层:业务数据和业务处理逻辑。比如实体类,Dao,Service都属于Model层

                         V:view视图。View的职责是负责显示页面和用户交互(收集用户信息)。属于视图的组件是不包含业务逻辑和控制逻辑的JSP。

                         C:Controller控制器。控制器是Model层和View层的桥梁用于控制流程。

    1.Spring Web MVC

    Spring web MVC是Spring框架一个非常重要的功能模块。实现了MVC结构,便于简单,快速的开发MVC结构的Web程序。Spring web MVC 提供了API的封装Web开发中常用的功能。简化了Web开发过程。

    1.1).Spring Web MVC的核心组件

    1>DispatcherServlet(控制器请求入口)

    2>HandllerMapping(控制器请求派发)

    3>Controller(控制器,请求处理流程)

    4>ModelAndVie(模型,封装 业务处理结果和视图)

    5>ViewResolver(视图,示图显示处理器)

    1.2)Spring Web MVC的处理流程

    1>用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
    2>DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及             Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
    3>DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
    4>提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
               HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
               数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
               数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
               数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
    5>Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
    6> 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
    7>ViewResolver 结合Model和View,来渲染视图
    8> 将渲染结果返回给客户端。

     

    这个人不懒,写了一点东西
  • 相关阅读:
    第二次冲刺 03
    第二次冲刺 02
    第二次冲刺 01
    程序员修炼三部曲阅读笔记03
    程序员修炼三部曲阅读笔记02
    团队项目计划会议
    课堂练习—购书
    构建之法阅读笔记03
    学习进度条十二
    课堂作业找水王2
  • 原文地址:https://www.cnblogs.com/AnonymouL/p/6055010.html
Copyright © 2020-2023  润新知