一、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)singleton和prototype的区别

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> 将渲染结果返回给客户端。

spring框架学习(三)的更多相关文章

  1. spring框架学习(三)——AOP( 面向切面编程)

    AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ...

  2. spring框架学习(三)junit单元测试

    spring框架学习(三)junit单元测试 单元测试不是头一次听说了,但只是听说从来没有用过.一个模块怎么测试呢,是不是得专门为一单元写一个测试程序,然后将测试单元代码拿过来测试? 我是这么想的.学 ...

  3. Spring框架学习一

    Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...

  4. Spring框架学习1

    AnonymouL 兴之所至,心之所安;尽其在我,顺其自然 新随笔 管理   Spring框架学习(一)   阅读目录 一. spring概述 核心容器: Spring 上下文: Spring AOP ...

  5. Spring框架学习总结(上)

    目录 1.Spring的概述 2.Spring的入门(IOC) 3.Spring的工厂类 4.Spring的配置 5.Spring的属性注入 6.Spring的分模块开发的配置 @ 1.Spring的 ...

  6. Spring框架学习笔记(1)

    Spring 框架学习笔记(1) 一.简介 Rod Johnson(spring之父) Spring是分层的Java SE/EE应用 full-stack(服务端的全栈)轻量级(跟EJB比)开源框架, ...

  7. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

  8. spring 框架学习网站

    spring 框架学习网站 NO1 http://www.mkyong.com NO2 https://spring.io/docs/reference

  9. Spring框架学习之IOC(二)

    Spring框架学习之IOC(二) 接着上一篇的内容,下面开始IOC基于注解装配相关的内容 在 classpath 中扫描组件 <context:component-scan> 特定组件包 ...

  10. Spring框架学习之IOC(一)

    Spring框架学习之IOC(一) 先前粗浅地学过Spring框架,但当时忙于考试及后期实习未将其记录,于是趁着最近还有几天的空闲时间,将其稍微整理一下,以备后期查看. Spring相关知识 spri ...

随机推荐

  1. git 分支管理

    本地主分支提交到远程分支 git push origin master:branch-test 本地分支提交到远程主分支 git push origin branch-test:master 切换分支 ...

  2. python基础-面向对象编程

    一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...

  3. Entity Framework 6连接Postgresql、SQLite、LocalDB的注意事项和配置文件

    Postgresql Postgresql支持Code First的方式自动生成表,不过默认的模式是dbo而不是public,而且还可以自动生成自增主键. <?xml version=" ...

  4. cookie

    1.基本操作 Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给 ...

  5. Android studio

      情况一: 描述:写Android app时,出现activity对应的layout预览图所显示的activity是有标题栏的,但是运行该app,无论是模拟器还是真机,却出现没有了标题栏的情况,而自 ...

  6. podfile The dependency `` is not used in any concrete target

    内容提要: podfile升级之后到最新版本,pod里的内容必须明确指出所用第三方库的target,否则会出现The dependency `` is not used in any concrete ...

  7. DirectWrite 模糊问题——如何正确根据DIP计算实际像素

    使用Windows.Graphics.Display.DisplayInformation的时候,一定要根据RawPixelsPerViewPixel计算,而不是RawDpiX或RawDpiY,或许L ...

  8. ajex请求的数据 什么时候需用Json.parse()

    ajex请求的数据 什么时候需用 Json.parse()

  9. windows bat批处理语法简析

    第一节先介绍windows批处理.这个起源于跟旁边同事学习在windows用命令行办公,渐渐地有些批处理功能就需要了,于是专门抽出了几天学习了一下.我认为文档最重要的功能是为了备忘,择取了很多文档的例 ...

  10. DirectX runtime

    DirectX 9.0 runtime etc https://www.microsoft.com/en-us/download/details.aspx?id=7087 DirectX 11 run ...