一、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方法

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

转载于:https://www.cnblogs.com/AnonymouL/p/6055010.html

spring框架学习(三)相关推荐

  1. Spring框架学习笔记(三)(AOP,事务管理)

    Spring框架学习笔记(三) 九.AOP 9.1 AOP的注解配置 (1) 新建计算器核心功能(模拟:不能在改动核心代码) (2) 建立一个普通的Java类写增强代码(面向切面编程),使用Sprin ...

  2. Spring框架学习(二)

    Spring框架学习笔记---->AOP AOP概念 AOP:aspect oriented programing,面向切面编程. 将软件的各个模块,按照横向的角度进行观察,发现各个模块之间存在 ...

  3. Spring框架学习笔记,超详细!!(4)

    Java小白开始学习Spring框架,一方面,跟着视频学习,并记录下学习笔记,方便以后复习回顾.另一方面,发布学习笔记来约束自己,学习路程还很遥远,继续加油坚持!!!希望能帮助到大家! 另外还有我的牛 ...

  4. spring security 学习三-rememberMe

    spring security 学习三-rememberMe 功能:登录时的"记住我"功能 原理: rememberMeAuthenticationFilter在security过 ...

  5. PyTorch框架学习三——张量操作

    PyTorch框架学习三--张量操作 一.拼接 1.torch.cat() 2.torch.stack() 二.切分 1.torch.chunk() 2.torch.split() 三.索引 1.to ...

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

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

  7. Spring框架学习-Spring和IOC概述

    一:什么是Spring框架? spring是一个分层的javase/EEfull-stack(一站式)轻量级的java开源框架.是为了解决企业开发的复杂性而创建的.框架的主要优势是分层架构,Sprin ...

  8. Spring框架学习笔记---完结

    一.简介 Spring:春天----->给软件行业带来了春天 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架. 2004年3月24日,Spring框架 ...

  9. Spring框架学习路线

    文章目录 1.Spring 1.1.简介 1.2.优点 1.3.扩展 2.IOC理论 2.1.IOC的创建对象的方法 3.Spring配置 3.1.Bean配置 3.2.import 4.依赖注入 4 ...

最新文章

  1. 数造未来——探索大数据的应用价值
  2. 【重磅】AI击败顶级德扑玩家的秘密!德扑AI创造者现身reddit,全面解答34个提问,详解Libratus的现状和未来
  3. redis key命名规范_Redis几个实战经验积累
  4. Zend Framework 2 中,定制error 的layout
  5. linux c 读写mbr_一文看懂Linux开机流程BIOS-MBR-GRUB-Kernel-Init-Runlevel
  6. android简单的自定义按钮,Android 自定义button简单示例
  7. jquery实现定时调度(倒计时)
  8. 一个毕业生对大学爱情和奋斗的思考!
  9. P1941-飞扬的小鸟【dp】
  10. 在Java EE应用程序中实现自动重试
  11. WindowsServer2012 DFS配置出错原因
  12. linux内存管理(九)-缺页异常分析
  13. 一些系统事件的手动触发方法
  14. Linux Shell编程(2) - Bash 变量
  15. 未解决:maven:Fatal error compiling: 无效的标记: -arg
  16. 毕设讲解之 --- 如何完成小程序毕业设计
  17. 龙卷风路径_【龙卷风的防范措施】龙卷风的易发地点_龙卷风如何分级 - 妈妈网百科...
  18. [NPUCTF2020]碰上彩虹,吃定彩虹
  19. 【C语言典例】——day6:猴子吃桃
  20. 头像采集,学生照片信息采集器

热门文章

  1. Redis整合Spring Data Redis 开发key和value乱码
  2. 无线网络的网速很慢_家里无线网络每天不定时段出现网速很慢或者直接无连接,这是怎么回事?...
  3. 元素的子元素_从暂元里取出子元素 | Stata编程
  4. html body onunload,html页面的onunload、onbeforeunload
  5. WeakReference回收问题
  6. 开发日记-20190611 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  7. android BiConsumer 使用 ClassNotDefException
  8. 关于android基础教程一书的初步解读后发现的一些问题
  9. git reset --hard 恢复
  10. cassandra框架模型之二——存储机制 CommitLog MemTable SSTable