Spring IOC(一)
最近复习,准备整理下复习笔记
Spring IOC 部分:
控制反转(Inversion of Control)
IOC是什么
简言之 IOC完成的事情原先由程序员主动通过new实例化对象事情,转交给spring负责。
1) 控制反转中控制指的是:控制类的对象
2) 控制反转中反转指的是转交给spring负责
3) IOC最大的作用:解耦
3.1) 程序员不需要管理对象,解除了对象管理和程序员之间的耦合。
何为ApplicationContext?
Application Context 是 BeanFactory 的子接口,也被成为 Spring 上下文。
Application Context 是 spring 中较高级的容器。和 BeanFactory 类似,它可以加载配置文件中定义的 bean,将所有的 bean 集中在一起,当有请求的时候分配 bean。
另外,它增加了企业所需要的功能,比如,从属性文件中解析文本信息和将事件传递给所指定的监听器。这个容器在 org.springframework.context.ApplicationContext interface 接口中定义。
ApplicationContext 包含 BeanFactory 所有的功能,一般情况下,相对于 BeanFactory,ApplicationContext 会更加优秀。当然,BeanFactory 仍可以在轻量级应用中使用,比如移动设备或者基于 applet 的应用程序。
最常被使用的 ApplicationContext 接口实现:
FileSystemXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径。
ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可,因为,容器会从
CLASSPATH 中搜索 bean 配置文件。
WebXmlApplicationContext:该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean。
环境搭建方面:
1 导入jar
1.1 四个核心包一个日志包(commons-logging)
2 在src下新建applicationContext.xml
2.1 文件名称和路径自定义
2.2 记住Spring容器ApplicationContext,applicationContext.xml配置的信息最终存储到了ApplicationContext容器中
2.3 Spring配置文件时基于schema
2.3.1 shema文件扩展名是.xsd
2.3.2 把shema理解为DTD(xml的语法检查器)的升级版
2.3.3 每次引入一个xsd文件是一个namespace(xmlns)
2.4 配置文件中只需要引入最基本的schema
2.4.1 通过<bean/>创建对象
2.4.2 默认配置文件被加载时创建对象
<?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">
<!--applicationContext.xml的配置信息最终都存储到了ApplicationContext容器中-->
3 编写测试方法
4 使用类加载applicationContext.xml
package com.qyx; import com.qyx.Bean.People;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test {
public static void main(String args[])
{
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");
//getBean方法(参数1:<bean>标签的id值,返回值类型);
//getBean方法的第二个参数可以不写,不写则是Object类型
People people=applicationContext.getBean("people",People.class);
System.out.println(people);
//取出spring 容器中所管理的所有的对象的id
//其方法返回的是一个String数组
String[] beansName=applicationContext.getBeanDefinitionNames();
for(String string:beansName)
{
System.out.println(string);
}
}
Spring 创建对象的三种方式
1.通过构造方法创建
1.1 无参构造创建:默认情况
无需配置,spring容器默认使用无参构造器来创建对象
1.2 有参构造创建:需要明确配置
1.2.1 需要在类中提供有参构造方法
1.2.2 在applicationContext.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">
<!--applicationContext.xml的配置信息最终都存储到了ApplicationContext容器中-->
<!--id表示获取对象标识
class 创建哪个类的对象
-->
<bean id="people" class="com.qyx.Bean.People">
<!--使用构造器进行创建-->
<!--index是构造器参数的索引下标-->
<!--name是构造器参数的名字-->
<!--type是参数的类型-->
<!--ref引用另一个bean给构造器参数赋值-->
<!--value赋给构造器参数的值-->
<!--前面三个参数可以只选其一,也可以全写,通过它们可以在多个构造器的情况下决定使用哪个构造器-->
<!--在用value赋值是,如果原类型是int,则不可写成java.lang.Integer,只能写为int-->
<constructor-arg index="0" name="id" type="int" value="001"></constructor-arg>
<constructor-arg index="1" name="name" type="java.lang.String" value="QYX"></constructor-arg>
<constructor-arg index="2" name="job" type="java.lang.String" value="架构师"></constructor-arg>
<constructor-arg index="3" name="major" type="java.lang.String" value="计算机科学与技术"></constructor-arg> </bean>
<!--如果不加constructor-arg参数,则默认使用无参构造器-->
<bean id="people1" class="com.qyx.Bean.People">
</bean>
</beans>
2.实例工厂
2.1 工厂设计模式:帮助创建类对象,一个工厂可以创建多个对象
2.2 实例工厂:需要先创建工厂,才能生产对象
2.3 实现步骤
2.3.1 必须要有一个实例工厂
package com.qyx.Bean;
public class PeopleFactory {43
{
return new People(002,"aaaa","bbbb","cccc");
}
}
2.3.2 在applicationContext.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">
</bean>
<!--以下为实例工厂模式创建对象-->
<!--如果不加constructor-arg参数,则默认使用无参构造器-->
<!--通过设置scope来进行单例模式设置-->
<!--工厂模式里的工厂一般都是单例-->
<bean id="factory" class="com.qyx.Bean.PeopleFactory" scope="singleton"></bean>
<!--配置bean同时指定生产它的工厂,同时指定生产它的方法-->
<bean id="peo1" factory-bean="factory" factory-method="newInstance"></bean>
</beans>
3.静态工厂
3.1 不需要创建工厂,快速创建对象
3.2 实现步骤
3.2.1 编写一个静态工厂(在方法上添加static)
package com.qyx.Bean;
public class PeopleFactory {
public static People newInstance02()
{
return new People(003,"dddd","eeee","ffff");
}
}
在applicationContext.xml中指定相关属性
<!--静态工厂-->
<bean id="peo2" class="com.qyx.Bean.PeopleFactory" factory-method="newInstance02"/>
Spring IOC(一)的更多相关文章
- 【初探Spring】------Spring IOC(三):初始化过程---Resource定位
我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ...
- 【初探Spring】------Spring IOC(一)
IOC:Inversion of Control(控制反转).IOC它所体现的并不是一种技术,而是一种思想,一种将设计好的对象交给容器来管理的思想.IOC的核心思想就体现在控制.反转这两个词上面,要理 ...
- spring ioc
spring ioc是spring的核心之一,也是spring体系的基础,那么spring ioc所依赖的底层技术是什么的?反射,以前我们开发程序的时候对象之间的相互调用需要用new来实现,现在所有的 ...
- Spring IoC源码解析——Bean的创建和初始化
Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...
- spring笔记6 spring IOC的中级知识
1,spring ioc的整体流程,xml配置 spring ioc初始化的流程结合上图 步骤编号 完成的工作 1 spring容器读取配置文件,解析称注册表 2 根据注册表,找到相应的bean实现类 ...
- 谈谈对Spring IOC的理解(转)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 自己动手编写spring IOC源码
前言:对于spring IOC概念不是很了解的朋友可以阅读我上一篇博客--轻松理解spring IOC(这两篇博客也是由于我的个人原因导致现在才发布,惭愧啊).通过这篇博客的理解之后,相信大家会对sp ...
- spring ioc 源码解析
什么是ioc? 通俗的解释是:(spring)框架中,完成对象的创建和注入的容器. springIOC体系结构: spring IOC的创建是典型的工厂模式,这一系列的bean工厂如上所示. 其核心是 ...
- Spring:源码解读Spring IOC原理
Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. I ...
- 谈谈对Spring IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
随机推荐
- SQLALchemy如何查询mysql某个区间内的数据
查了下,找到3种方式: 方法一注意时间格式:xxxx-xx-xx 方法二没有‘day’ 方法三的时间格式同方法一 1.result = Jobs.query.filter(Jobs.create_ti ...
- Flume采集日志
角色 Source 数据来源 (exec, kafka, http…)Channel 数据通道 (memory,file,jdbc)Sink 数据目的地 (kafka,hdfs,es…) Agent ...
- python—004
一.集合(set) 1.定义:不同的元素组成,无序排列的,可哈希的值(存放不可变类型:数字.字符串.元组) s={1,2,'ww',3,4,5,6,7,8,'ee'}print (type(s))pr ...
- C#学习笔记四(LINQ,错误和异常,异步编程,反射元数据和动态编程)
LINQ 1.使用类似的数据库语言来操作集合? 错误和异常 异步编程 1.异步和线程的区别: 多线程和异步操作两者都可以达到避免调用线程阻塞的目的.但是,多线程和异步操作还是有一些区别的.而这些区别造 ...
- 磊哥的密码箱icpc11526
问题 D: 磊哥的密码箱 时间限制: 1 Sec 内存限制: 128 MB提交: 238 解决: 61[提交] [状态] [命题人:admin] 题目描述 磊哥有个密码箱,里面装的都是令磊哥羞羞的 ...
- ubuntu系统熄屏无法唤醒
ubuntu系统熄屏无法唤醒 解决办法:重启后,安装laptop-mode-tools工具包. 1.检查是否安装了grep laptop-mode-tools 工具包 $ dpkg -l | grep ...
- 应用安全 - 社工 - By 大数据 - shodan - 汇总
使用 | 命令 搜索语法 hostname: 搜索指定的主机或域名,例如 hostname:”google” port: 搜索指定的端口或服务,例如 port:”” country: 搜索指定的国家, ...
- python基础--面向对象初始
# 类与对象,类是类别.种类,是面向对象设计中最重要的概念, # 对象是特征与技能的结合体, # 类是一系列对象相似特征与技能的结合体 # 例如:人是一个类,而我本人是一个对象,手,脚,是我的特征, ...
- rust学习小记(1)
本文的学习资料来自 Rust 程序设计语言 简体中文版 推荐用idea来写rust,装好插件rust和toml即可 cargo(包管理) 可以使用 cargo build 或 cargo check ...
- 02:Redis常见面试题
1.1 redis基础面试题 1.什么是Redis?简述它的优缺点? 1. Redis本质上是一个Key-Value类型的内存数据库,很像memcached. 2. 整个数据库统统加载在内存当中进行操 ...