Spring 学习——Bean容器
Bean容器初始化
- 基础
- org.springframework.beans
- org.springframework.context
- BeanFactory提供配置结构和基本功能,加载并初始化Bean
- ApplicationContext保存了Bean对象,并且在Spring进行使用
- ApplicationContext范围
- 加载本地文件
FileSystemXmlApplication context = new FileSystemXmlApplicationContext("F://test//context.xml");
- 加载ClassPath文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*/resources/context.xml");
- web应用配置文件
- 加载本地文件
- Spring注入方式
- 定义:Spring注入是指启动Spring容器启动并加载Bean的过程中,完成对变量的赋值行为
- 注入方式:
- 设值注入:是将变量以Set属性的方式注入到Bean中,使用设置注入,在Bean中一定要有变量的Set方法,配置中的<property>标签name的值一定要和属性名称一致!!!
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd" > <bean id="InjectionServiceImpl" class="com.jing.spring.bean.InjectionServiceImpl">
<property name="injectionDao" ref="injectionDao"></property>
</bean>
<bean id="injectionDao" class="com.jing.spring.bean.InjectionDaoImpl"></bean><!--??????不懂 程序中是引用接口 为什么却要把实现类注入?-->
</beans>private InjectionDao injectionDao; public void setInjectionDao(InjectionDao injectionDao) {
this.injectionDao = injectionDao;
} public void save(String arg) {
System.out.print("InjectionServiceImpl中的arg==="+arg+"\n");
//逻辑处理
arg=arg+":"+this.hashCode();
injectionDao.save(arg);
} - 构造注入:是将变量作为Bean构造器的参数传入,在Bean中一个要有一个以变量作为参数的构造函数,配置中的<constructor-arg>标签name的值一定要和有参构造方法参数名称一致!!!
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd" > <bean id="InjectionServiceImpl" class="com.jing.spring.bean.InjectionServiceImpl">
<constructor-arg name="injectionDao" ref="injectionDao"></constructor-arg>
</bean> <bean id="injectionDao" class="com.jing.spring.bean.InjectionDaoImpl"></bean>
</beans>private InjectionDao injectionDaoss; InjectionServiceImpl(InjectionDao injectionDao){
this.injectionDaoss=injectionDao;
}
public void save(String arg) {
System.out.print("InjectionServiceImpl中的arg==="+arg+"\n");
//逻辑处理
arg=arg+":"+this.hashCode();
injectionDaoss.save(arg);
}
- 设值注入:是将变量以Set属性的方式注入到Bean中,使用设置注入,在Bean中一定要有变量的Set方法,配置中的<property>标签name的值一定要和属性名称一致!!!
Bean的配置项
- Id
- Class
- Scope
- Contructor arguments
- Properties
- Autowiring mode
- lazy_initialization mode
- Initialization/destruction mothod
Bean的作用域
- singleton:单例。一个Bean容器中只存在一个Bean对象。
- prototype:每次请求创建实例都会产生一个新的实例,destroy不生效。
- request:每次请求创建一个新的实例且在当前request内有效。
- session:同上,每次http请求创建一个新的实例,且在当前session有效。
- global session:基于portlet的web中有效(portlet定义了 global session)。如果是在web中,同session。使用在多个系统之间,一个session控制不了多个系统。
Bean的生命周期
- 定义:XML文件中<bean>的定义
- 初始化:获取一个实例的时候
- 使用:使用
- 销毁:销毁
- 初始化/销毁方法:这两个方法是为了 在初始化/销毁Bean容器的时候执行一些额外的方法
- 针对Bean实例的销毁,只有在Bean是单例singleton模式的前提下,Bean才会随着Bean容器的销毁而销毁。在原型prototype的模式下,Bean实例在创建后,就会交由用户进行管理,所以此时Bean实例的销毁不是由Bean容器决定。举例:在原型模式中,根据电影票类初始化两个实例,也就是两张电影票,这个时候,不能因为一张电影票的作废,另一张电影票也随之作废。电影票的管理应该交由用户来管理。
- 方式一:XML中每一个Bean实例声明一个初始化方法/销毁方法
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd" > <bean id="springLifeDate" class="com.jing.spring.lifedate.SpringLifeDate" init-method="start" destroy-method="end"></bean> </beans>package com.jing.spring.lifedate; public class SpringLifeDate1 { public void start(){
System.out.println("SpringLifeDate开始执行。。。。");
}
public void excecute(){
System.out.println("SpringLifeDate执行中。。。。");
}
public void end(){
System.out.println("SpringLifeDate执行结束。。。。");
}
}PS:这种方法针对每个Bean设置的初始化/销毁时执行的方法。在Bean容器初始化时主动执行init-method设置的类中的方法,Bean容器销毁后执行destroy-method设置的方法。如果在XML中进行方法设置,Bean类中创造方法,会报错。
- 方式二:在Bean的类中实现接口,实现初始化方法/销毁方法
package com.jing.spring.lifedate; import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean; public class SpringLifeDate2 implements InitializingBean, DisposableBean { public void afterPropertiesSet() throws Exception {
System.out.println("SpringLifeDate开始执行。。。。");
}
public void excecute(){
System.out.println("SpringLifeDate执行中。。。。");
}
public void destroy() throws Exception {
System.out.println("SpringLifeDate执行结束。。。。");
}
}PS:这种方法是Bean中实现接口实现Bean初始化/销毁时执行的方法。Bean初始化后执行的方法需要实现InitializingBean接口重写afterPropertiesSet方法,Bean销毁后执行的方法需要实现DisposableBean接口重写destroy方法。
- 方式三:在XML中声明全局初始化方法/销毁方法
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
default-init-method="defaultInit" default-destroy-method="defaultDestroy" >
</beans>package com.jing.spring.lifedate; public class SpringLifeDate3 {
public void defaultInit() throws Exception {
System.out.println("SpringLifeDate3开始执行。。。。");
}
public void excecute(){
System.out.println("SpringLifeDate执行中。。。。");
}
public void defaultDestroy() throws Exception {
System.out.println("SpringLifeDate3执行结束。。。。");
}
}PS:这种方式生命Bean的初始化/销毁方法,在类中没有相对应得方法,也不会报错。
- 执行顺序
- 在三种方式同时存在的情况下:只会执行方式一(每一个Bean实例声明)和方式二(实现类方式)中定义的初始化/销毁方法,执行顺序为方式二(实现类方式)>方式一(每一个Bean实例声明)
- 在方式三(全局配置)和其他任一方式同时存在,方式三(全局配置)都不会执行,只会执行另一种方式中定义的初始化/销毁方法。
- Next
Spring 学习——Bean容器的更多相关文章
- 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比
[原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...
- Spring学习-Bean的基本概念知识
4月份开始复习一遍spring相关知识.让自己巩固一下spring大法的深奥益处,所以就看了大佬的博客,转载留下来日后继续研读.认为重点的标记为红色 转载自:http://www.cnblogs.co ...
- Spring学习-- IOC 容器中 bean 的生命周期
Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...
- 【转】Spring学习---SpringIOC容器的初始化过程
[原文]https://www.toutiao.com/i6594400249429623304/ SpringIOC容器的初始化过程 简单来说,IoC容器的初始化是由refresh()方法来启动的, ...
- Spring学习-- Bean 的作用域
Bean 的作用域: 在 Spring 中 , 可以在 <bean> 元素的 scope 属性里设置 bean 的作用域. 默认情况下 , Spring 只为每个在 IOC 容器里声明的 ...
- Spring学习--Bean 之间的关系
Bean 之间的关系:继承.依赖. Bean 继承: Spring 允许继承 bean 的配置 , 被继承的 bean 称为父 bean , 继承这个父 bean 的 bean 称为子 bean. 子 ...
- spring的bean容器加载
1.在单独使用的时候可以通过ClassPathXmlApplicationContext(“配置文件.xml”);来启动容器. 2.在MVC下是通过启动servlet容器,初始化DispatcherS ...
- 黑马Spring学习 bean
- spring学习(二)---依赖注入
spring第二个特性是依赖注入. 学习依赖注入,首先应该明白两个问题:1,谁依赖谁:2,谁注入,注入什么? 首先还是看代码: 还是这个bean: package testSpring.busines ...
随机推荐
- LeetCode104.二叉树最大深度
给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7], ...
- Spring中集合注入方法
集合注入重要是对数组.List.Set.map的注入,具体注入方法请参照一下代码(重点是applicationContext.xml中对这几个集合注入的方式): 1.在工程中新建一个Departmen ...
- 在caffe-ssd的环境搭建中遇到报错信息:Makefile:588: recipe for target '.build_release/cuda/src/caffe/layers/softmax_loss_layer.o' failed
错误原因: 1.计算机没有安装GPU 2.有GPU但是NVCCFLAGS设置错误 解决方法: 1.对没有GPU的计算机,需要将Makefile中的CPU之前的#注释去掉,是的caffe运行的处理器进行 ...
- Mysql 修改字段长度、修改列名、新增列、修改自增主键起始值
alter table 表名 modify column 字段名 类型; 例如 数据库中user表 name字段是varchar(30) 可以用 ) ; --修改字段长度 )--修改表列名 ); -- ...
- report源码分析——宏的执行
uvm_info,uvm_error其实是对uvm_report_info,uvm_report_error的封装. 其中warning,error,fatal,macros默认都是定义为UVM_NO ...
- GDTR与LDTR
----段寄存器 一.访问GDT 当TI=0时表示段描述符在GDT中,如上图所示: 段描述符(64位) ①先从GDTR寄存器(48位,其中前32位base+16位长度)中获得GDT基址. ②然后再GD ...
- [C#]Socket通信BeginReceive异步接收数据何时回调Callback
原文地址:http://www.cnblogs.com/wangtonghui/p/3277303.html 最近在做服务器压力测试程序. 接触了一段时间Socket异步通讯,发现自己对BeginRe ...
- jQuery工具--$.each()和$.merge()
jQuery.each(object, [callback])或者jQuery(object).each([callback]) 概述 通用遍历方法,可用于遍历对象和数组. 不同于遍历 jQue ...
- 20155228 获取技能的成功经验和关于C语言学习的调查
内容提要 你有什么技能比大多人(超过90%以上)更好?针对这个技能的获取你有什么成功的经验?与老师博客中的学习经验有什么共通之处? 有关C语言学习的调查 你是怎么学习C语言的?(作业,实验,教材,其他 ...
- c# 规范用户输入控件
MaskedTextBox控件是一种特殊的文本框,它可以通过Mask属性设置格式标记符.在应用程序运行后,用户只能输入Mask属性允许的内容,列入日期.电话等 在“输入掩码”对话框的右下角有一个“使用 ...