一、ioc能解决什么问题

  1、Spring是什么

      spring是以ioc和aop为核心,能整合第三方框架和类库的企业级应用开源框架。

  2、程序的耦合问题

   例子:Driver类必须存在,编译才通过,JdbcDemo依赖Driver,这种类之间或方法之间的依赖关系就称为耦合。注册驱动改为根据类名反射创建对象,Driver类不存在,编译时也能通过,降低程序间的依赖称为解耦。实际开发中,要编译期不依赖,运行时才依赖。

public class JdbcDemo {
public static void main(String[] args) throws Exception{
//1.注册驱动
// DriverManager.registerDriver(new com.mysql.jdbc.Driver());
     Class.forName("com.mysql.jdbc.Driver");
//2.获取连接//3.获取操作数据库的预处理对象//4.执行SQL,得到结果集//5.遍历结果集//6.释放资源
}
}

  

  3、工厂模式解耦

   使用配置文件来配置controller,service,dao三层对象的全限定类名,创建一个类读取配置文件,创建和获取三层对象,这个类就是工厂。使用Map来存放创建的对象,这个Map称为容器。使用工厂模式,获取对象的方式由主动new对象变为被动的由工厂提供,工厂去容器查找或创建。这种被动的获取对象的方式就是控制反转。其作用就是降低程序耦合度。

public class BeanFactory {
// 1、定义Properties对象
private static Properties pros;
// 2、定义保存对象的容器
private static Map<String, Object> beans;
// 3、使用静态代码块为Properties赋值
static {
try {
// 4、读取配置文件
pros = new Properties();
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
pros.load(in);
// 5、实例化容器
beans = new HashMap<String, Object>();
// 6、取出配置文件所有key(三层对象的类名)
Enumeration keys = pros.keys();
// 7、遍历枚举
while (keys.hasMoreElements()) {
String key = keys.nextElement().toString();
// 8、根据key取出全限定类名
String beansPath = pros.getProperty(key);
// 9、反射创建对象
Object value = Class.forName(beansPath).newInstance();
// 10、保存key(id)和value(对象)到容器
beans.put(key, value);
}
} catch (Exception e) {
throw new ExceptionInInitializerError("初始化properties失败!");
}
} /**
* 根据bean的名称获取对象
*/
public static Object getBean(String beanName){
return beans.get(beanName);
}
}

二、ioc是什么

  1、ioc的定义 

   ioc(inversion of control),意思是控制反转,将创建对象的权限交给框架,获取对象的方式由主动变为被动。spring就是通过ioc容器管理对象,ioc容器实质上就是一个对象工厂,使用BeanFactory工厂接口或子接口来实例化ioc容器。

  2、spring的对象工厂结构 

三、ioc怎么用

  1、XML文件配置ioc

   一般把spring配置文件命名为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 id="demo" class="com.test.Demo" scope="singleton" init-method="init" destroy-method="destroy"></bean>
</beans>

    

  (1)实例化bean的方式

  空参构造函数的xml配置如下,Demo类中必须存在空参构造函数Demo()

<bean id="demo" class="com.test.Demo"></bean>

  静态工厂的xml配置如下,getDemo为工厂类创建Demo对象的的静态方法

<bean id="beanFactory"class="com.test.BeanFactory" factory-method="getDemo"></bean>

  实例工厂的xml配置如下,createDemo为工厂类创建Demo对象的的普通方法

<bean id="beanFactory" class="com.test.BeanFactory"></bean>
<bean id="demo" factory-bean="beanFactory" factory-method="createDemo"></bean>

  (2)DI 依赖注入

    DI(Dependency Injection)依赖注入,是ioc的具体实现,ioc降低了类之间的耦合度,但类之间的依赖关系依然存在,这时就需要spring的DI来维护依赖关系。

xm配置文件如下

<bean id="demo" class="com.test.Demo">
<constructor-arg name="name" value="张三"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>
<!-- 配置一个日期对象 -->
<bean id="now" class="java.util.Date"></bean>

xm配置文件如下

<bean id="demo" class="com.test.Demo">
<property name="name" value="张三" ></property>
<property name="age" value="18"></property>
<property name="birthday" ref="now"></property>
</bean>
<!-- 配置一个日期对象 -->
<bean id="now" class="java.util.Date"></bean>

xm配置文件如下

<bean id="demo" class="com.test.Demo" p:name="张三" p:age="18" />

  2、注解配置ioc

    配置文件applicationContext.xml必须添加如下配置,扫描包及子包下所有类,spring才能侦测到注解标识的组件。<context:component-scan> 元素会自动注册一个bean的后置处理器:AutowiredAnnotationBeanPostProcessor的实例。该后置处理器可以自动装配标记了注解的属性。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.test"></context:component-scan>
</beans>
    如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类。
<context:component-scan base-package="com.test" resource-pattern="autowire/*.class"/>

  3、全注解配置 ioc

    可以完全不写xml配置文件,全部使用注解完成配置。

Spring基础之IOC的更多相关文章

  1. Spring基础——在 IOC 容器中 Bean 之间的关系

    一.在 Spring IOC 容器中 Bean 之间存在继承和依赖关系. 需要注意的是,这个继承和依赖指的是 bean 的配置之间的关系,而不是指实际意义上类与类之间的继承与依赖,它们不是一个概念. ...

  2. Java之Spring基础与IoC

    Spring About Spring 开源免费框架,轻量级,非入侵式框架.Spring就是一个轻量级的控制反转(IOC)和面向切片编程(AOP)的框架 Maven repo:Spring Web M ...

  3. 01—Spring基础配置IOC

  4. Spring笔记:IOC基础

    Spring笔记:IOC基础 引入IOC 在Java基础中,我们往往使用常见关键字来完成服务对象的创建.举个例子我们有很多U盘,有金士顿的(KingstonUSBDisk)的.闪迪的(SanUSBDi ...

  5. Spring基础知识

    Spring基础知识 利用spring完成松耦合 接口 public interface IOutputGenerator { public void generateOutput(); } 实现类 ...

  6. spring之初识Ioc&Aop

    Spring框架的作用 spring是一个轻量级的企业级框架,提供了ioc容器.Aop实现.dao/orm支持.web集成等功能,目标是使现有的java EE技术更易用,并促进良好的编程习惯. Spr ...

  7. Spring 基础知识

    Spring架构简单描述 原文:https://www.shiyanlou.com/courses/document/212 Spring 概述 1. Spring 是什么 Spring是一个开源的轻 ...

  8. Spring学习之Ioc控制反转(1)

    开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------- ...

  9. Spring框架(3)---IOC装配Bean(注解方式)

    IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...

随机推荐

  1. [svc]frp内网穿透

    什么是穿透 可以任意暴漏内网任何服务,加入你在你的办公网络有台pc,可以上网就可以了, 你可以在你电脑上安装各类服务器, 暴漏如80 22等端口, 注意 这可以暴漏到公网哦, 在出口不做任何nat情况 ...

  2. 两种方法直接删除数组中特定值的项(JavaScript)

    一.问题详情: 直接删除意为原数组需要被改变,而不是得到另一个数组. 二.JavaScript实现 (一)巧用数组的push( ).shift( )方法 function del(arr,num) { ...

  3. spark系列-4、spark序列化方案、GC对spark性能的影响

    一.spark的序列化 1.1.官网解释 http://spark.apache.org/docs/2.1.1/tuning.html#data-serialization 序列化在任何分布式应用程序 ...

  4. 解决Chrome插件安装时出现的“程序包无效”问题

    问题原因,新版的插件头部文件的修改,导致旧版的插件包无法使用,解决方式:解压. 1.把下载后的.crx扩展名的离线Chrome插件的文件扩展名改成.zip或者.rar(如果看不到Chrome插件的扩展 ...

  5. Codeforces Round #509 (Div. 2) A. Heist 贪心

    There was an electronic store heist last night. All keyboards which were in the store yesterday were ...

  6. vue element select多选回显

    我们经常在使用 Element组件里面的 select多选 场景:添加账号的时候需要选择可见分公司(分公司为多选),添加成功之后可以编辑,需要回显添加时所提交的分公司 代码如下: 多选框: data( ...

  7. 使用Python实现批量ping操作

    在日常的工作中,我们通常会有去探测目标主机是否存活的应用场景,单个的服务器主机可以通过计算机自带的DOS命令来执行,但是业务的存在往往不是单个存在的,通常都是需要去探测C段的主机(同一个网段下的存活主 ...

  8. golang之channel

    Buffered Channels package main import "fmt" func main() { ch := make(chan int, 2) ch <- ...

  9. LTE基站开局流程

    1.全局参数配置 MOD  ENODEB :修改基站 ADD  CNOPERATOR: 添加运营商 ADD  CNOPERATORTA:添加跟踪区(TA) 2.设备参数配置(机柜.机框.RRU.光纤链 ...

  10. 完了!CPU一味求快出事儿了!

    自我介绍 我叫阿Q,是CPU一号车间里的员工,我所在的这个CPU足足有8个核,就有8个车间,干起活来杠杠滴. 我所在的一号车间里,除了负责执行指令的我,还有负责取指令的小A,负责分析指令的小胖和负责结 ...