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

最新文章

  1. jquery仿搜狐投票动画代码
  2. android中的requestFocus标签
  3. 隐藏NavigationBar时的一个坑
  4. CenOS6.3 ssh 公钥认证报错:Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
  5. HTML meta viewport属性详解
  6. php 指针遍历、预定义数组和常用函数
  7. FATE_完全背包
  8. Linux任务前后台的切换
  9. bzoj2749
  10. ACM HDU 2674 N! Again(数论)
  11. c# xml操作类
  12. HDU3068(Manacher算法)
  13. (转)eclipse安装jetty
  14. hive的top n
  15. 初探Java设计模式2:结构型模式(代理模式,适配器模式等)
  16. Hyperledger Fabric-CA学习
  17. Vue相关文章
  18. linux安装配置zookeeper-3.4.10
  19. POI导出Excel发现不可读取的内容
  20. Codeforces791 B. Bear and Friendship Condition

热门文章

  1. 2016BUAA校赛决赛
  2. sql server生成递归日期
  3. Kinect2.0 for Mac开箱
  4. dotnet获取PDF文件的页数
  5. 蓝牙4.0(BLE)开发
  6. JS控制,返回上一页之后强行刷新一次
  7. fsr
  8. Linux简单的日志审计
  9. python学习笔记(二)
  10. chose.jquery 多选