Spring深入浅出(一)IOC的基本知识
Spring前言
Spring是一个企业级开发框架,为解决企业级项目开发过于复杂而创建的,框架的主要优势之一就是分层架构,允许开发者自主选择组件。
Spring的两大核心机制是IOC(控制反转)和AOP(面向切面编程),从开发的角度讲,我们使用Spring框架就是用它的IOC和AOP。
IOC是典型的工厂模式,通过工厂去注入对象。
AOP则是代理模式的体现。
IOC控制反转
IOC也叫控制反转,首先从字面意思理解,什么叫控制反转?反转的是什么?
在传统的程序开发中,需要调用对象时,通常由调用者来创建被调用者的实例,即对象是由调用者主动使用new关键字出来的。
但在Spring框架中创建对象的工作不再由调用者来完成,而是交给IOC容器来创建,再推送给调用者,整个流程完成反转,所以是控制反转。也就是
例如:买礼品。
传统方式:你去礼品店,需要自己去挑,然后自己带回来。
IOC:你只需要把需要的东西的清单放在家门口,然后就像圣诞老人一样将礼物放到你们的门口,你可以直接拿到用就行。
IOC的代码描述与解释
通过传统方式创建并且实例化一个对象
1.传统模式去生成一个人的对象,有属性和set/get方法
public class Person {
private int id;
private String name; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.在测试方法中去实例化Person对象
public class Test {
public static void main(String[] args) {
Person p = new Person();
System.out.println(p);
}
}
通过Spring的方式去创建并且实例化一个对象
准备工作:
1.添加Spring相关jar包。
2.创建配置文件,可以自定义文件名applicationContext.xml。
3.调用API。
<?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"> <!-- 配置Person对象-->
<!--
1.id:对象名。
2.class:实体类的全路径名
-->
<bean id="p" class="com.test.entity.Person"></bean> </beans>
public class Test {
public static void main(String[] args) {
//1.加载spring的配置文件,生成ApplicationContext对象。
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.调用ApplicationContext的getBean方法获取对象,通过在配置文件中的bean的id值获取对象
Person p = (Student) applicationContext.getBean("p");
System.out.println(p);
}
}
程序在加载spring的配置文件的时候创建person对象,通过反射机制调用无参构造函数,所以要求交给IOC容器管理的类必须有无参构造函数。此时的person对象的属性全部为空,因为调用无参构造只会创建对象而不会进行赋值,如何赋值呢?
给实体类赋初始值(无参构造的方式)
添加property标签:name对应实体类中的属性名,value是需要赋予属性的初始值。可以在property标签中使用其属性名,也可以在property中使用value标签
注意: (1)若包含特殊字符,比如 name="<ZhangSan>",需要使用<![CDATA[<ZhangSan>]]>进行配置。
(2)Spring是通过调用每个属性的setter方法来完成属性的赋值。所以实体类必须有setter方法,否则加载时报错,getter方法可写可不写。
<?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"> <!-- 配置Person对象-->
<!--
1.id:对象名。
2.class:实体类的全路径名
--> <bean id="p" class="com.test.entity.Person">
<property name="id" value="1"></property>
<property name="name">
<value><![CDATA[<ZhangSan>]]></value>
</property>
<property name="name" value="zhangsan"></property>
</bean> </beans>
调用方法与上面一样,就不再描述了。需要注意的如下:
//1、第一种方式,使用配置文件中的id,这也是最常用的方式
Person p = (Student) applicationContext.getBean("p"); //2、第二种方式,直接使用类名,但是如果在配置文件中有两个bean都是由Student类生成的,IOC容器无法将两个bean都返回,必须指定一个唯一的bean。因此不推荐使用
Person p = (Student) applicationContext.getBean(Person.class);
给实体类赋初始值(有参构造的方式)
1.创建一个实体类
2.在配置文件中的属性写法
3.实例化
//实体类
public class Person {
private int id;
private String name; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(int id, String name,) {
super();
this.id = id;
this.name = 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"> <!-- 通过有参构造函数创建对象 --> <!--
1.此时IOC容器会根据constructor-arg标签去加载对应的有参构造函数,创建对象并完成属性赋值。
name的值需要与有参构造的形参名对应,value是对应的值。
-->
<bean id="p" class="com.test.entity.Person">
<constructor-arg name="id" value="1"></constructor-arg>
<constructor-arg name="name" value="ZhangSan"></constructor-arg>
</bean> <!--
2.除了使用name对应参数外,还可以通过下标index对应。
index的值必须和实体类中的顺序一一对应
-->
<bean id="p2" class="com.test.entity.Person">
<constructor-arg index="0" value="2"></constructor-arg>
<constructor-arg index="2" value="LiSi"> </constructor-arg>
</bean> </beans>
IOC容器管理多个对象
//创建一个班级类
public class Classes {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
} //创建一个学生类
public class Student {
private int id;
private String name;
private Classes classes;
public Classes getClasses() {
return classes;
}
public void setClasses(Classes classes) {
this.classes = classes;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = 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"> <!-- 创建classes对象 -->
<bean id="classes" class="com.hzit.entity.Classes">
<property name="id" value="1"></property>
<property name="name" value="Java班"></property>
</bean> <!-- 创建stu对象 -->
<bean id="stu" class="com.hzit.entity.Student">
<property name="id" value="1"></property>
<property name="name" value="zhangsan"></property>
<!-- 将classes对象赋给stu对象 使用ref标签(引用)-->
<property name="classes" ref="classes"></property>
</bean> </beans>
在spring的配置文件中,通过ref属性将其他bean赋给当前bean对象,这种方式叫做依赖注入(DI),DI也是Spring中IOC的重要一环,所以一般说的IOC包括DI。
在实体类中包含Array,List,Map的赋值
public class Classes {
private int id;
private String name;
private List<Student> students; public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = 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"> <!-- 配置classes对象 -->
<bean id="classes" class="com.hzit.entity.Classes">
<property name="id" value="1"></property>
<property name="name" value="Java班"></property>
<property name="students">
<!-- 注入student对象 -->
<list>
<ref bean="stu"/>
<ref bean="stu2"/>
</list>
</property>
</bean> <bean id="stu" class="com.hzit.entity.Student">
<property name="id" value="1"></property>
<property name="name" value="Zhangsan"></property>
</bean> <bean id="stu2" class="com.hzit.entity.Student">
<property name="id" value="2"></property>
<property name="name" value="LiSi"></property>
</bean> </beans>
上述描述了集合属性通过list标签和ref标签完成注入(数组与list一样)。
ref的bean属性指向需要注入的bean对象。
Set,Map,Properties等集合的方式与list相同,只是标签不同,分别是<set></set>,<map></map>,<props></props>
总结
IOC是Spring的核心,很重要。使用Spring开发项目时,控制层,业务层,DAO层都是通过IOC来完成依赖注入(DI)的。
Spring深入浅出(一)IOC的基本知识的更多相关文章
- Spring Ioc源码分析系列--Ioc的基础知识准备
Spring Ioc源码分析系列--Ioc的基础知识准备 本系列文章代码基于Spring Framework 5.2.x Ioc的概念 在Spring里,Ioc的定义为The IoC Containe ...
- Spring深入浅出(二)IOC的单例 ,继承,依赖,JDBC,工厂模式以及自动装载
IOC的单例模式--Bean Spring中的bean是根据scope来决定的. scope有4种类型: 1.singleton:单例模型,表示通过Spring容器获取的该对象是唯一的.常用并且默认. ...
- Spring学习之Ioc控制反转(1)
开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------- ...
- Spring系列之IOC的原理及手动实现
目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 导语 Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架.也是几乎所有J ...
- Spring框架中IoC(控制反转)的原理(转)
原文链接:Spring框架中IoC(控制反转)的原理 一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作, ...
- Spring入门1. IoC入门实例
Spring入门1. IoC入门实例 Reference:Java EE轻量级解决方案——S2SH 前言: 之前学习过关于Spring的一点知识,曾经因为配置出现问题,而总是被迫放弃学习这些框架技术, ...
- Spring中的IOC
在学习spring的时候,最常听到的词应该就是IOC和AOP了,以下,我从我的角度再次理解一下Spring里的IOC和AOP. IOC简单介绍 IoC(InversionofControl):IoC就 ...
- Spring.NET的IoC容器(The IoC container)——简介(Introduction)
简介 这个章节介绍了Spring Framework的控制反转(Inversion of Control ,IoC)的实现原理. Spring.Core 程序集是Spring.NET的 IoC 容器实 ...
- 用IDEA详解Spring中的IoC和DI(挺透彻的,点进来看看吧)
用IDEA详解Spring中的IoC和DI 一.Spring IoC的基本概念 控制反转(IoC)是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心.依赖注入(DI)是 ...
- 依赖注入(DI)与控制反转(IOC)基础知识
依赖注入(DI)与控制反转(IOC)基础知识 一.什么是依赖注入? 依赖注入英文是Dependcy Injection简写DI,依赖注入会将所依赖的对象自动交由目标对象使用,而不是让对象自己去获取. ...
随机推荐
- Cocos2d-x 多点触摸
多点触摸的实现步骤与单点触摸类似,setTouchEnabled(true)开启触摸功能,注冊触摸事件,重载多点触摸函数:ccTouchesBegan(開始).ccTouchesMoved(移动).c ...
- C#调用webservice(二)
第二篇调用webservice,web服务是http://webservice.webxml.com.cn/webservices/DomesticAirline.asmx,航班查询服务 添加web服 ...
- (转载)Android:学习AIDL,这一篇文章就够了(下)
前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...
- JavaScript学习——使用JS完成省市二级联动
1.我们希望在注册页面中添加一个字段(籍贯),当用户选择一个具体的省份,在后面的下拉列表中动态加载该省份下所有的城市.显示的效果如下: 2.步骤分析: 第一步:确定事件(onchange)并为其绑定一 ...
- HTML基础——网站图片显示页面
1.图片标签 <img /> 属性: src:指的是图片显示的路径(位置) 绝对路径:D:\Pictures\Saved Pictures 相对路径: ①同一级:直接写文件名称或者./文件 ...
- STM8S103之ADC
如何快速了解ADC,查看Reference manual中ADC registers章节,初步了解到ADC ADC buffer register和ADC data register Analog W ...
- double int 类型的区别
内部组织格式不同: po [NSString stringWithFormat:@"%d", f] 107886912 (lldb) po [NSString stringWith ...
- 【AnjularJS系列2 】— 表单控件功能相关指令
第二篇,表单控件功能相关指令. ng-checked控制radio和checkbox的选中状态 ng-selected控制下拉框的选中状态 ng-disabled控制失效状态 ng-multiple控 ...
- Msql免安装版安装
文首提要: 我下载的MySQL版本是:mysql-5.7.17-winx64.zip Archive版:系统:Windows7 64位. 一.解压文件 下载好MySQL后, ...
- DCDCBigBig's first blog @cnblogs~
其实初二末的时候我就在CSDN上开了博客(主要是为了存模板),但是无奈CSDN的页面真的太辣眼睛了…… 然后我就加入博客园欢快的大家庭啦!!!顺便膜拜巨佬学长%%%(我是蒟蒻不要喷我) 页面设置感谢x ...