Spring IOC (Inversion Of Control反转控制容器

一、对于IOC容器的简单理解

在java开发中将程序中的对象交给容器管理,而不是在对象的内部管理。

那么两个简单的问题去分析理解IOC容器

1.为什么叫反转:

IOC容器实现了将对象的管理由对象内部直接管理(比如在一个类的main方法中new了一个String对象)转换成在容器中被动的被注入,创建。把这种对对象管理方式的改变称为反转。

2.控制了什么:

IOC容器控制了外部资源的统一获取(不仅仅包括对象,还有其他的文件)

(敲下黑板:spring容器是IOC容器,但是IOC容器不是spring容器,因为基于IOC容器设计的框架不仅只有spring)

二、应用上下文

现在我们手上有了一个魔杖(IOC容器)但是我们还需要对应的魔咒(应用上下文)来驱动魔杖

spring容器有两种实现:

1.最基础的BeanFactory(实体工厂)由于功能过于简单所以不经常使用

2.由BeanFactory派生的多种应用上下文,其抽象接口是ApplicationContext,spring根据应用场景的不同给我们设计了几种应用上下文:

(1) AnnotationConfigApplicationContext:从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式;

(2)ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式;

(3)FileSystemXmlApplicationContext:从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件;

(4)AnnotationConfigWebApplicationContext:专门为web应用准备的,适用于注解方式;

我们在这里使用的是ClassPathXmlApplication,xml配置方式

三、简单的实现IOC控制对象

1.创建一个应用上下文applicationContext_ioc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
">
<beans>

2.创建一个类Student

package spring.ioc.unities;

public class Student {
private String stuNo;
private String stuName;
private int gender;
private String nativePlace;
private String classNo;
private String tel;
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public String getNativePlace() {
return nativePlace;
}
public void setNativePlace(String nativePlace) {
this.nativePlace = nativePlace;
}
public String getClassNo() {
return classNo;
}
public void setClassNo(String classNo) {
this.classNo = classNo;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
@Override
public String toString() {
return "Student [stuNo=" + stuNo + ", stuName=" + stuName + ", gender=" + gender + ", nativePlace="
+ nativePlace + ", classNo=" + classNo + ", tel=" + tel + "]";
} }

3.在xml中通过bean标签俩控制Bean

(1)标签中必要的两个属性

id(用于识别ioc容器中的bean)

class(id对应的类的位置,通常是包名+类名,建议直接复制,手写有可能出错)

<bean id="stu1" class="spring.ioc.unities.Student"></bean>  

(2)标签中其他的属性

scope属性:

 作用域  说明
 Singleton

Spring IOC容器中一个bean定义只有一个对象实例,默认情况下会在容器启动时初始化

 Prototype 每次从容器获取bean都是新的对象 
 Request  每次Http请求都会创建一个新的bean,只使用在WebApplicationContext中
 Session  类似request,每次有新的会话都会创建一个新的Bean,只使用在WebApplicationContext中

3.main函数中测试确认:

public static void main(String[] args) {

        ApplicationContext ioc =  new ClassPathXmlApplicationContext("applictionContext_ioc.xml");
Student stuA = (Student) ioc.getBean("stu1");
Student stuB = (Student) ioc.getBean("stu1");
//在ioc中获取的bean:
System.out.println("获取的属性为singleton的bean-------------------------");
System.out.println(stuA.toString()+stuB.toString());
//验证A,B是否是同一个实体
System.out.println("stua和stub是否是一个bean:"+(stuA==stuB));
Student stuC = (Student) ioc.getBean("stu2");
Student stuD = (Student) ioc.getBean("stu2");
System.out.println("获取的属性为prototype的bean-------------------------");
System.out.println(stuC.toString()+stuD.toString());
System.out.println("stuc和stud是否是一个bean:"+(stuC==stuD)); }

获得结果如下:

可以看出singleton属性的bean其实是单例模式下的bean.

Spring IOC 的简单使用的更多相关文章

  1. Spring IOC的简单实现

    简单的说,Spring就是通过工厂+反射将我们的bean放到它的容器中的,当我们想用某个bean的时候,只需要调用getBean("beanID")方法即可. 原理简单说明: Sp ...

  2. Spring IOC 方式结合TESTGN测试用例,测试简单java的命令模式

    java命令模式: 可以命令("请求")封装成一个对象,一个命令对象通过在特定的接收着上绑定一组动作来封装一个请求.命令对象直接把执行动作和接收者包进对象中,只对外暴露出执行方法的 ...

  3. 1.Spring IoC简单例子

    Spring IoC简单例子 1.IHelloMessage.java package com.tony.spring.chapter01; public interface IHelloMessag ...

  4. Spring容器的简单实现(IOC原理)

    引言:容器是什么?什么是容器?Spring容器又是啥东西?我给Spring容器一个对象名字,为啥能给我创建一个对象呢? 一.容器是装东西的,就像你家的水缸,你吃饭的碗等等. java中能作为容器的有很 ...

  5. Spring IOC 源码简单分析 03 - 循环引用

    ### 准备 ## 目标 了解 Spring 如何处理循环引用 ##测试代码 gordon.study.spring.ioc.IOC03_CircularReference.java   ioc03. ...

  6. Spring IOC 源码简单分析 02 - Bean Reference

    ### 准备 ## 目标 了解 bean reference 装配的流程 ##测试代码 gordon.study.spring.ioc.IOC02_BeanReference.java   ioc02 ...

  7. (反射+内省机制的运用)简单模拟spring IoC容器的操作

    简单模拟spring IoC容器的操作[管理对象的创建.管理对象的依赖关系,例如属性设置] 实体类Hello package com.shan.hello; public class Hello { ...

  8. spring IOC简单分析

    Spring IOC 体系结构 BeanFactory(BeanFactory 里只对 IOC 容器的基本行为作了定义,根本不关心你的 bean 是如何定义怎样加载的.正如我们只关心工厂里得到什么的产 ...

  9. Spring IOC 源码简单分析 04 - bean的初始化

      ### 准备 ## 目标 了解 Spring 如何初始化 bean 实例 ##测试代码 gordon.study.spring.ioc.IOC04_Initialization.java publ ...

随机推荐

  1. CPU爆满后的无助感

    告警 晚七点刚好上地铁,握在手里的手机震动了好几下,根据震动这几下的手感已经判断出这是钉钉在告警了,十有八九就是线上的问题,通过Zabbix监控的一台线上服务器已经五分钟不可达,这应该不会是网络网络问 ...

  2. 2018.8.8 python 初识函数

    主要内容: 1.函数定义 2.函数名,函数体以及函数的调用 3.函数的返回值 4.函数的参数 一.函数的定义 函数:对代码块和功能的封装和定义. 二.函数名.函数体及函数的调用 我们使用def关键字来 ...

  3. [springboot 开发单体web shop] 2. Mybatis Generator 生成common mapper

    Mybatis Generator tool 在我们开启一个新项目的研发后,通常要编写很多的entity/pojo/dto/mapper/dao..., 大多研发兄弟们都会抱怨,为什么我要重复写CRU ...

  4. 漏洞靶场--webug4.0安装

    官网:https://www.webug.org/ 官方版本里安装视频教程 7.19官网打不开,分享当初存在网盘的[7.1更新] 链接: https://pan.baidu.com/s/1F3658i ...

  5. eclipse 工具翻译插件安装

    http://download.eclipse.org/technology/babel/update-site/R0.15.1/oxygen

  6. Function:凸包,单调栈,题意转化,单峰函数三分,离线处理

    很难啊啊啊!!! bzoj5380原题,应该可以粘题面. 问题转换: 有一个n列1e9行的矩阵,每一列上都写着相同的数字Ai. 你从位置(x,y)出发每一步可以向左上方或左方走一步,最后走到第一行. ...

  7. 「刷题」Color 群论

    这道题乍一看挺水的,直接$ Ploya $就可以了,可是再看看数据范围:n<=1e9 那就是有1e9种置换,这不歇比了. 于是考虑式子的优化. 首先证明,转i次的置换的每个循环结大小是 $ gc ...

  8. 2019.11.11 洛谷月赛t3

    题目背景 由于Y校的老师非常毒瘤,要求\(zhouwc\)在\(csp\)考前最后\(3\)天参加期中考,\(zhouwc\)非常生气,决定消极考试,以涂完卡但全错为目标.现在\(retcarizy\ ...

  9. linux 自启动 | 三种方式自启动

    linux 实现自启动有多种方式,通过Linux 底层启动原理介绍,便可以理解以下几种方式 这里简单介绍一下这几种方式 一.自定义开机程序   /etc/rc.d/rc.local  1.vim  / ...

  10. 路径操作OS模块和Path类(全)一篇够用!

    路径操作 路径操作模块 os模块 os属性 os.name # windows是nt, linux是posix os.uname() # *nix支持 sys.platform #sys模块的属性, ...