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)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的处理流程
spring框架学习(三)的更多相关文章
- spring框架学习(三)——AOP( 面向切面编程)
AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ...
- spring框架学习(三)junit单元测试
spring框架学习(三)junit单元测试 单元测试不是头一次听说了,但只是听说从来没有用过.一个模块怎么测试呢,是不是得专门为一单元写一个测试程序,然后将测试单元代码拿过来测试? 我是这么想的.学 ...
- Spring框架学习一
Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...
- Spring框架学习1
AnonymouL 兴之所至,心之所安;尽其在我,顺其自然 新随笔 管理 Spring框架学习(一) 阅读目录 一. spring概述 核心容器: Spring 上下文: Spring AOP ...
- Spring框架学习总结(上)
目录 1.Spring的概述 2.Spring的入门(IOC) 3.Spring的工厂类 4.Spring的配置 5.Spring的属性注入 6.Spring的分模块开发的配置 @ 1.Spring的 ...
- Spring框架学习笔记(1)
Spring 框架学习笔记(1) 一.简介 Rod Johnson(spring之父) Spring是分层的Java SE/EE应用 full-stack(服务端的全栈)轻量级(跟EJB比)开源框架, ...
- Struts2框架学习(三) 数据处理
Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...
- spring 框架学习网站
spring 框架学习网站 NO1 http://www.mkyong.com NO2 https://spring.io/docs/reference
- Spring框架学习之IOC(二)
Spring框架学习之IOC(二) 接着上一篇的内容,下面开始IOC基于注解装配相关的内容 在 classpath 中扫描组件 <context:component-scan> 特定组件包 ...
- Spring框架学习之IOC(一)
Spring框架学习之IOC(一) 先前粗浅地学过Spring框架,但当时忙于考试及后期实习未将其记录,于是趁着最近还有几天的空闲时间,将其稍微整理一下,以备后期查看. Spring相关知识 spri ...
随机推荐
- JQuery Ajax调用asp.net后台方法
利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法. 先来个简单的实例热热身吧. 1.无参数的方法调用 asp.net code: using System.Web.Scrip ...
- sql server如何分组编号
我们在生产实践中经常会有这样的需求:分组编号. 如下有一个城市区域表region: 我们需要对上表region按city分组,对region进行排序,得到如下结果: 具体sql如下: select c ...
- mysql-netstat
在Linux服务器中想要查看连接到服务器的所有IP地址只需要输入命令netstat -an就可以看到全部的资料. 该命令的常见参数供您参考: -a (all)显示所有选项,默认不显示LISTEN相关: ...
- java中静态方法和静态类的学习
静态内部类可以有静态成员,而非静态类 则不能有静态成员 静态内部类的非静态成员可以访问外部类的静态成员,而不可以访问外部类的非静态成员 非静态方法与对象相关,而静态方法属于类的方法, 总上所述:静态方 ...
- HiShop2.x版本中的上传插件分析,得出所用的模板语言为Underscore.js 1.6.0且自己已修改
效果: 上传组件非常的酷,但是分析其使用JS写法使用了模板语言的,代码如下: <script type="text/j-template" id="tpl_popb ...
- SVN 错误 Access to SVN Repository Forbidden的原因及解决方法
原创文章,转载请注明出处:http://www.cnblogs.com/baipengzhan/p/SVN_Access_to_SVN_Repository_Forbidden.html 当我们新 ...
- CSS之div和span标签
div和span是非常重要的标签,div的语义是division"分割": span的语义就是span"范围.跨度". 这两个东西,都是最最重要的"盒 ...
- JMeter 问题
1. JMeter 测试计划 测试计划 使用 JMeter 进行测试的起点,是其它 JMeter 测试元件的容器. 线程组 代表一定数量的并发用户,它可以用来模拟并发用户发送请求.实际的请求内容在S ...
- logistic regression与SVM
Logistic模型和SVM都是用于二分类,现在大概说一下两者的区别 ① 寻找最优超平面的方法不同 形象点说,Logistic模型找的那个超平面,是尽量让所有点都远离它,而SVM寻找的那个超平面,是只 ...
- sql笨办法同步数据
Helpers.SqlHelper sqlHelper = new Helpers.SqlHelper("server=***;database=Cms;user id=sa;passwor ...