Spring复习笔记:1
ApplicationContext的三个常用实现类:
- ClassPathXmLApplicationContext:
它可以加载类路径下的配置文件,要求配置文件必须在类路径下。不在类路径的话,加载不了。 - FileSystemXmLApplicationContext:
它可以加载磁盘任意路径下的配置文件(必须有访问权限,否则加载失败) - AnnotationConfigApplicationContext:
它是用于读取往解创建容器的。
ApplicationContext和BeanFactory的区别
- ApplicationContext:(单例对象适用)
它在构建核心容器时,创建对象采取的策略是采用立即加载的方式。也就是说,只要一读取完配置文件马上就创建配置文件中配置的对象。 - BeanFactory:(多例对象适用)
它在构建核心容器时,创建对象采取的策略是采用延迟加载的方式(当要使用的时候再创建对象)。也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象。
spring对bean的管理细节:
一.Bean对象的三种创建方式
1.使用无参的构造函数
在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时,采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建。
<bean id="bean1" class="com.Bean1"/>
实体类
public class Bean1 {//必须提供无参的构造函数,若没有创建构造函数,则系统有默认有无参的构造函数
}
测试类
//构造方法得到bean对象@Testpublic void demo1(){//1.获取核心容器对象ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");//2.根据id获取Bean对象Bean1 bean1 = applicationContext.getBean(Bean1.class);System.out.println(bean1);}
结果:
2.使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
"factory-method:getInstance"表示的是工厂提供的静态方法。
<bean id="bean2" class="com.Bean2Factory" factory-method="getInstance"/>
实体类
public class Bean2 {
}
工厂类
public class Bean2Factory {public static Bean2 getInstance(){return new Bean2();}
}
测试类
//静态工厂方法@Testpublic void demo2(){//1.获取核心容器对象ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");//2.根据id获取Bean对象Bean2 bean2 = applicationContext.getBean(Bean2.class);System.out.println(bean2);}
结果:
3.使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
第一个bean使用的构造器方法(也就是第一种方法)实例化工厂类,产生一个工厂对象,第二个bean中的id是实例化对象的名称,factory-bean对应的被实例化的工厂类的对象名称,也就是第一个bean的id,factory-method是非静态工厂方法,然后我们现在要创建的这个Bean3对象,它是由前面创建的工厂对象指向的工厂中的getInstance方法来获取的。
<bean id="bean3Factory" class="com.Bean3Factory"/>
<!--id:要获取的对象 factory-bean:指定哪个是那个工厂Bean factory-method:指定哪个方法来获取对象-->
<bean id="bean3" factory-bean="bean3Factory" factory-method="getInstance"/>
实体类
public class Bean3 {
}
工厂类
public class Bean3Factory {public Bean3 getInstance(){return new Bean3();}
}
测试类
//实例化工厂方法@Testpublic void demo3(){//1.获取核心容器对象ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");//2.根据id获取Bean对象Bean3 bean3 = applicationContext.getBean(Bean3.class);System.out.println(bean3);}
结果:
假如模拟一个工厂类(该类可能是存在于jar包中的,我们无法通过修改源码的方式来提供默认构造函数)时,我们就可以使用后两种方式来实例化Bean了。
二.bean对象的作用范围
bean的作用范围调整使用的是bean标签的scope属性:
作用:用于指定bean的作用范围
取值:(常用的就是单例的和多例的)
singleton:单例的(默认值)
prototype:多例的
request:作用于web应用的请求范围
session:作用于web应用的会话范围
global-session:作用于集群环境的会话范围(全局会话范围),当不是集群环境时,它就是session
使用:
<bean id="bean1" class="com.Bean1" scope="singleton"/>
<bean id="bean1" class="com.Bean1" scope="prototype"/>
三.Bean对象的生命周期
1.单例对象:
出生:当容器创建时对象出生
活着:只要容器还在,对象一直活着
死亡:容器销毁,对象消亡
例:
init-method指的是该对象的初始化方法
destroy-method指的是该对象的销毁方法
<!--init-method初始化方法 destroy-method销毁方法-->
<bean id="bean1" class="com.Bean1" scope="singleton" init-method="init" destroy-method="destroy"/>
实体类
public class Bean1 {public Bean1(){System.out.println("对象创建了");}public void init(){System.out.println("对象初始化");}public void destroy(){System.out.println("对象销毁");}
}
测试类
@Testpublic void demo1(){//1.获取核心容器对象ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");//2.根据id获取Bean对象Bean1 bean1 = applicationContext.getBean(Bean1.class);System.out.println(bean1);}
结果:
这里我们能够看到,对象并没有销毁,这是因为demo1方法执行完后,该方法线程中占用的内存也就全部释放,当然也就包含了我们这个容器了,此时还没有调用销毁方法就已经把它的内存释放了,所以说它还没来得及调用销毁就已经消失了…
我们要想调用销毁方法,我们就要手动关闭容器,即:close()方法,如下:
@Testpublic void demo1(){//1.获取核心容器对象ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");//2.根据id获取Bean对象Bean1 bean1 = applicationContext.getBean(Bean1.class);System.out.println(bean1);applicationContext.close();}
结果:
2.多例对象:
出生:当我们使用对象时spring框架为我们创建
活着:对象只要是在使用过程中就一直活着。
死亡:当对象长时间不用,且没有别的对象引用时,由Java的垃圾回收器回收。
<bean id="bean1" class="com.Bean1" scope="prototype" init-method="init" destroy-method="destroy"/>
实体类和测试类和上面的一样
结果:
相关文章:

Android 趣味应用—— 短信编辑器
修改短信数据库,从而生成任意手机号发送的短信。 AndroidManifest.xml <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.example.dudon.fak…
Uber体验之路
第一次听说uber,是2014年初的时候,那时候互联网热门新闻,经常冒出这家公司。 第一次体验uber,是2014.10.3,去机场接人,叫了专车。 第一次觉得uber体验好,是2014年感恩节的时候,它在深…

容器和虚拟机的对比
容器和虚拟机的对比 “敏捷”和“高性能”是容器相较于虚拟机最大的优势,也是它能够在 PaaS 这种更细粒度的资源管理平台上大行其道的重要原因。 不过,有利就有弊,基于 Linux Namespace 的隔离机制相比于虚拟化技术也有很多不足之处ÿ…

Spring复习笔记:2
Spring中的依赖注入 IOC的作用: 降低程序间的耦合(依赖关系) 依赖关系的管理: 以后都交给spring来维护,在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明依赖关系的维护,就称之为依赖注入…

Unity Android 2021:用C#打造3D ZigZag赛车游戏
Unity Android 2021 : Build 3D ZigZag Racing Game with C# MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确) |时长:65节课(11h 7m) |大小解压后:3.6 GB …

封装了一套WeCenter的IOS SDK
度过了忙碌且迷茫的2015年,迎来了的郁闷且彷徨的2016年。 与哥们商量做些什么,谈不上创业也不是项目,只是想让2016年不必如2015年一样迷茫,也慰藉一下2016年的彷徨。 方向么,考察了几个行业,也做了些调研&a…

java多线程样例
这里我们做一个完整的样例来说明线程产生的方式不同而生成的线程的差别: package debug;import java.io.*;import java.lang.Thread;class MyThread extends Thread{ public int x 0; public void run(){ System.out.println(x); }}class R implements Runn…

Spring复习笔记:3
Spring基于xml的案例实践 在数据库中创建一张新的表 create table account(id int primary key auto_increment,name varchar(40),money float )character set utf8 collate utf8_general_ci;往表中导入数据 insert into account(name,money) values(aaa,1000); insert into…

Blender多米诺骨牌动画学习教程 The Impossible Domino Run in Blender
流派:电子学习| MP4 |视频:h264,1280720 |音频:AAC,48.0 KHz 语言:英语中英文字幕(根据原英文字幕机译更准确)|大小:8.53 GB 含课程文件 |时长:8h 20m Blender的运动跟踪,建模,渲染和合成工具集…

unity3d游戏开发猜想——当程序猿老去
程序猿将代码注入生命去打造互联网的浪潮之巅。当有一天他们老了。会走向那里,会做些什么?非常多年以后,在我60岁的那天早晨,天刚蒙蒙亮我就起床了,先去公园晨练,然后回来做早餐(50岁的时候我学…

【JavaScript】JavaScript基础-变量、运算符与控制语句
一.变量 变量: 定义一个变量,系统会为之分配一块内存,程序可以用变量名来表示这块内存中的数据。 由于javascript采用的是弱类型的变量形式,因此,在声明一个变量的时候,我们不必声明它的类型,但…

ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)
ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 posted on 2019-09-05 01:00 竹径风声 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/girl1314/p/11462711.html

Blender+Substance Painter全流程制作真实的机器人学习教程
MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确) |时长:44节课(10h 52m) |大小解压后:9.9 GB 含课程素材 如何使用Blender 2.8和Substance Painter制作真…

Spring复习笔记:4
在复习笔记三中我们进行的案例的编写,我们可以发现,就算使用了注解的方式,xml配置文件文件还是不能够删除,现在我们来将一些新的注解可以让我们去掉xml配置文件。 Configuration 作用:指定当前类是一个配置类 细节&a…

Extjs PROXY查询params无法传参,改用extraParams
转载于:https://www.cnblogs.com/cocoat/p/5153009.html

详解Paint的setPathEffect(PathEffect effect)
一、setPathEffect() 这个方法一看就和path有关,顾名思义,它就是给path设置样式(效果)的。PathEffect这个路径效果类没有具体的实现,效果是由它的六个子类实现的: 这六个子类分别可以实现不同的路径效果&am…

返回手势导致页面卡死并且UI错乱的问题解决
问题记录:在做了部分页面的转场动画之后,返回手势不灵了,快速连续返回的话会卡住,App退到后台再重新激活之后页面不卡了,但是UI错乱. 解决方案: 1. 在UINavigationController子类实现代理UIGestureRecognizerDelegate,并在viewDidLoad方法中增加代理设置: - (void)viewDidLoad …

Spring学习笔记:3(面向切面AOP)
AOP:Aspect Oriented Program(面向切面) 我们再回顾一下AOP的一些术语: 通知(Advice) 就是你想要的功能,也就是的安全、事物、日志等。先定义好,然后在想用的地方用一下。 连接…

Blender全流程制作真实感3D产品学习教程
MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确) |时长:41节课(4h 29m) |大小解压后:4.53 GB 仅使用blender 2.8进行建模、纹理、光照和渲染,…

如何给iOS应用添加原生的二维码扫描功能
之前总觉得二维码扫描很高大上,其实apple工程师早就为我们提供了便捷的方法。二维码扫描第三方的库也挺多的,不过效率高的当属系统提供的扫描方法。 二维码扫描主要用到了以下几个类:AVCaptureDevice,AVCaptureDeviceInput,AVCaptureMetadata…

2021-2027年中国市医疗电子场投资分析及前景预测报告
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国医疗电子行业市场行业相关概述、中国医疗电子行业市场行业运行环境、分析了中国医疗电子行…

RabbitMQ入门(4)--路由
2019独角兽企业重金招聘Python工程师标准>>> ###路由 ###(使用Java客户端) 在先前的指南中,我们建立了一个简单的日志系统。我们可以将我们的日志信息广播到多个接收者。 在这部分的指南中,我们将要往其中添加一个功能…

从一个数组中寻找出现奇数次的数字
假设给定了数组nums为[0,1,2,3,4,5,6,7,8,9,10,10,9,8,7,6,5,4,1,2,3,3,0] 其中3出现了3次 而其他数字都出现了两次 则我们应该得到结果为3 第一种方式:使用Hash 1 /**2 * 使用hash3 * */4 public static int singleNumber_1(int[] nums) {5 …

Blender写实建筑场景制作学习教程 Exterior Visualization in Blender 2.9
MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确) |时长:26节课(3h 41m) |大小:3.3 GB 使用Blender创建惊人的外部渲染。 你会学到: Blender中的建模、着色…

Postman增删改查接口测试
查 一.选择Get方式 二.点击Send开始测试,得出结果 增 一.选择Post方式 二.输入需要增添的数据 三.点击Send测试 四.没有报错,添加成功 查看一下,发现确实添加进去了 删 一.选择Delete方式 二.根据id删除,在请求路径下直接写出…

新安装Ubuntu加载时提示“为/检查磁盘时发生严重错误”的解决方法
本文部分内容转载自: http://jingyan.baidu.com/article/0aa22375bbffbe88cc0d6419.html http://www.aichengxu.com/view/35086 解决方法: 1. 进入Ubuntu启动菜单时按e 键进入启动项编辑模式: 2. 找到代码【ro rootflagsync】,将其…

android binder机制之——(创建binder服务)
Binder机制编程前面的几篇文章具体介绍了android中binder机制的方方面面,相信你对binder机制已经有了较深刻的理解。俗话说得好“学以致用”,以下我们就通过在android系统中创建一个我们自己的binder服务,来加深对binder机制的理解。…

通过NSProxy来解决NSTimer使用不当造成内存泄漏的问题
NSTimer的一般使用: 1 interface ViewController : UIViewController2 property (nonatomic, strong) NSTimer *timer;3 end4 5 implementation ViewController6 - (void)viewDidLoad {7 [super viewDidLoad];8 [self startTimer];9 } 10 11 - (void)startTimer { 12 …

Blender 2.9中的真实感三维产品全流程制作学习教程
MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确) |时长:41节课(6h 23m) |大小:5.83 GB 含课程文件 使用blender 2.9建模、纹理、光照和渲染真实的吉他 …

SpringBoot中的SFL4J日志
SpringBoot:底层是Spring框架,Spring框架默认使用的是JCL日志的抽象层 SpringBoot选用SLF4J和logback 如何系统地在系统中使用SLF4J 在开发的使用,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象…