**控制反转**(Inversion of Control,缩写为**IoC**),是[面向对象编程]中的一种设计原则,可以用来减低计算机[代码]之间的[耦合度]。其中最常见的方式叫做[依赖注入]Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
控制反转IOC: 把对象创建和对象之间的调用过程,交给spring进行管理
使用IOC目的: 为了降低耦合度
上面的入门案例 就是IOC实现
底层原理
使用xml 解析,工厂模式,反射
?IOC接口 (BeanFactory)
IOC思想基于IOC容器完成,IOC容器底层就是工厂对象
Spring提供IOC容器实现两种方式 (2个接口)
(1)BeanFactory: IOC 容器基本实现,是spring内部的使用接口,不提供开发人员进行使用
加载配置文件时,不会创建对象,在获取(使用)对象时,才去创建对象
(2)ApplicationContext:ApplicationContext是BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用,
加载配置文件时候就会把 配置文件中配置的对象进行创建
IOC操作Bean管理
1. 什么是bean管理
? bean管理指的是两个操作:
? a. spring 创建对象
? b. spring 注入属性
2. Bean管理操作有2种方式
? ?a 基于xml方式
? ?b.基于注解方式
???
(1)在spring配置文件种,使用bean标签,标签里面添加对应的属性,就可以实现对象创建
(2)bean标签常用属性
id属性: 唯一标识
class属性:类全路径 (包类路径)
(3)创建对象时候,默认执行无参构造方法,完成对象的创建
<!--配置User对象创建-->
<bean id="user" class="com.ly.User">
?基于xml方式注入属性
(1)DI: 依赖注入, 就是注入属性
第一种子 注入方式: 使用set方法进行注入
(a) 创建类,定义属性和setter
?package com.ly; ?? ?public class Book { ?? ? ? //创建属性 ? ? ?private String bName; ? ? ?private String author; ?? ? ? ?public void setbName(String bName) { ? ? ? ? ?this.bName = bName; ? ? } ? ? ?public void setAuthor(String author) { ? ? ? ? ?this.author = author; ? ? } ? ? ?public void print(){ ? ? ? ? ?System.out.println(bName+","+author); ? ? } ?}
??(b) 在spring配置文件中 ,配置对象及属性
<!--使用set 方法注入属性--> <bean id="book" class="com.ly.Book"> <!--使用property完成属性注入 name:类里面属性名称 value:向属性注入的值 --> <property name="author" value="王丽丽"></property> <property name="bName" value="李四"></property> </bean>
(c)测试
?@Test ? ? ?public void tesBook(){ ? ? ? ? ?//1. 加载spring配置文件 ? ? ? ? ?ApplicationContext context = new ClassPathXmlApplicationContext("demo1.xml"); ? ? ? ? ?//2.获取 配置创建的对象 ? ? ? ? ?Book book = context.getBean("book", Book.class); ? ? ? ? ?book.print(); ? ? } ??
?控制台输出: ?李四,王丽丽
(a) 创建类,定义属性,生成带参构造方法
?package com.ly; ?// 使用 有参构造注入 ?public class Order { ? ? ?private String oName; ? ? ?private String address; ?? ? ? ? ? ?public Order(String oName, String address) { ? ? ? ? ?this.oName = oName; ? ? ? ? ?this.address = address; ? ? } ? ? ? ?//为了测试 结果 添加的 ? ? ? public void print(){ ? ? ? ? ?System.out.println(oName+"::"+address); ? ? } ?}
(b)在spring配置文件中 进行配置
?<!--使用 带参构造方式注入--> ? ? ?<bean id="order" class="com.ly.Order"> ? ? ? ? ?<constructor-arg name="address" value="天津市"></constructor-arg> ? ? ? ? ?<constructor-arg name="oName" value="玩具车"></constructor-arg> ? ? ?</bean>
(c) 测试
?@Test ? ? ?public void tesOrder(){ ? ? ? ? ?//1. 加载spring配置文件 ? ? ? ? ?ApplicationContext context = new ClassPathXmlApplicationContext("demo1.xml"); ? ? ? ? ?//2.获取 配置创建的对象 ? ? ? ? ?Order order = context.getBean("order", Order.class); ? ? ? ? ?order.print(); ? ? }
?? ?? ?控制台输出 : ?玩具车::天津市
(1)使用p命名空间注入, 可以简化基于xml配置方式
a. 添加p命名空间 xmlns:p="http://www.springframework.org/schema/p"
?<beans xmlns="http://www.springframework.org/schema/beans" ? ? ? ? xmlns:p="http://www.springframework.org/schema/p" ? ? ? ? ? ? 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">
??b.进行属性注入,在bean标签里面进行操作
?<bean id="book" class="com.ly.Book" p:author="李四" p:bName="html"></bean>
基于xml注入其他类型属性
1.字面量(固定值)
a. null值 ---<null/> 标签
<bean id="book" class="com.ly.Book"> ?? ? ? ? ? ?<property name="author" value="王丽丽"></property> ? ? ? ? ?<property name="bName" value="李四"></property> ? ? ? ? ?<!--address 值为 null 空值--> ? ? ? ? ?<property name="address"> ? ? ? ? ? ? ?<null/> ? ? ? ? ?</property> ? ? ?</bean>
b.属性值包含特殊符号?使用转义?<property name="address" value="<南京>"></property>
?或者cdata ?<property name="address"> ? ? ? ? <value><![CDATA[<南京>]]></value> ? </property> ??
?控制台输出 ?李四,王丽丽,<南京>