Spring———IOC (控制反转)
一、IOC容器
1、什么是IOC(控制反转)
- 对象之间的调用和创建过程,交给Spring5进行管理
- 使用IOC目的:为了降低耦合度
2、IOC底层原理
- XML解析、工厂模式、反射
3、Spring 提供的IOC容器实现的两种方式(两个接口)
- BeanFactory接口:IOC容器基本实现是Spring内部接口的使用接口,不提供给开发人员进行使用(加载配置文件时候不会创建对象,在获取对象时才会创建对象。)
- =ApplicationContext接口:BeanFactory接口的子接口,提供更多更强大的功能,提供给开发人员使用(加载配置文件时候就会把在配置文件对象进行创建)推荐使用!
二、IOC容器Bean管理
1、IOC操作Bean管理
- Bean管理就是两个操作 a)Spring创建对象 b)Spring注入属性
2、基于XML创建对象
<!-- 1.基于 xml文件 创建对象演示-->
<bean id="username" class="com.zh.Day_01.Bean_demo.User" >
3、基于XML方式注入属性 ,有参的构造函数的注入
<!-- 2.基于 set的方法注入属性值 name 是 bean类里面的名称 value 是属性的值-->
<property name="name" value="小浩纸~"></property>
<property name="age" value="19"></property>
<property name="address" value="江西~"></property>
<!-- 3.有参的构造函数的注入-->
<constructor-arg name="name" value="小浩~"></constructor-arg>
<constructor-arg name="age" value="199"></constructor-arg>
<constructor-arg name="address" value="江西~"></constructor-arg>
4、注入空值null 和特殊字符
<!-- 4.给属性注入null值-->
<property name="name">
<!-- 在里面加入一个null 标签-->
<null></null>
</property>
<!-- 5.特殊字符的注入 1> 把<>进行转义 < ; >
2> 把特殊字符内容写到一个 <![CDATA[...]]> 内-->
<property name="address">
<value><![CDATA[<<南京>>]]></value>
</property>
5、注入属性-外部注入bean
<!-- 先创建两个对象-->
<bean id="service" class="com.zh.Day_02.Bean_Demo_01.service">
<!-- 注入属性dao对象
name : 这个类里面的属性名
ref : 创建 dao这个类的 标签里的id值
-->
<property name="daoText" ref="dao"></property>
</bean>
<bean id="dao" class="com.zh.Day_02.Bean_Demo_01.dao"></bean>
6、注入内部bean和级联赋值
- 内部注入
<!-- 内部bean 的演示
<bean id="Emp" class="com.zh.Day_02.Bean_Demo_02.Emp">
<!-- 给普通的属性注入值-->
<property name="eName" value="小浩纸~"></property>
<!-- 给类属性注入值 简称 内部bean-->
<property name="eDept">
<bean id="Dept" class="com.zh.Day_02.Bean_Demo_02.Dept">
<!-- 给 Dept 属性赋值-->
<property name="DName" value="技术部"></property>
</bean>
</property>
</bean>-->
- 级联bean 演示
<!-- 联级bean 演示-->
<bean id="Emp" class="com.zh.Day_02.Bean_Demo_02.Emp">
<!-- 属性赋值-->
<property name="eName" value="浩浩~~~"></property>
<property name="eDept" ref="mmmm"></property>
</bean>
<bean id="mmmm" class="com.zh.Day_02.Bean_Demo_02.Dept">
<property name="DName" value="技术部~~"></property>
</bean>
- 第二种方式
<!-- 第二钟方法 必须添加一个get方法-->
<bean id="Emp" class="com.zh.Day_02.Bean_Demo_02.Emp">
<!-- 属性赋值-->
<property name="eName" value="浩浩~~~"></property>
<property name="eDept" ref="mmmm"></property>
<!-- 在bean 里面必须给 get方法-->
<property name="eDept.DName" value="技术部门"></property>
</bean>
<bean id="mmmm" class="com.zh.Day_02.Bean_Demo_02.Dept">
<!-- <property name="DName" value="技术部~~"></property>-->
</bean>
7、基于XML注入数组、集合属性
<!-- 给 数组 集合 注入值-->
<bean id="ZhouHao" class="com.zh.Day_02.Bean_Demo_03.Student">
<!-- 给数组注入值-->
<property name="array_" >
<array>
<value>java课程</value>
<value>mysql</value>
</array>
</property>
<!-- 给list 注入值-->
<property name="list_" >
<list>
<value>江西</value>
<value>南昌</value>
</list>
</property>
<!-- 给set 注入值-->
<property name="set_">
<set>
<value>帅哥</value>
<value>嘿嘿</value>
</set>
</property>
<!-- 给map 注入值-->
<property name="map_">
<map>
<entry key="no1" value="小浩纸"></entry>
<entry key="no2" value="浩浩"></entry>
</map>
</property>
8、在集合里面设置对象类型值
<!-- 给list 对象属性注入值-->
<!-- 给 数组 集合 注入值-->
<bean id="ZhouHao" class="com.zh.Day_02.Bean_Demo_03.Student">
<property name="list_course">
<list>
<ref bean="course1"></ref>
<ref bean="course2"></ref>
</list>
</property>
</bean>
<!-- 创建多个对象-->
<bean id="course1" class="com.zh.Day_02.Bean_Demo_03.Course">
<property name="name" value="java__"></property>
</bean>
<bean id="course2" class="com.zh.Day_02.Bean_Demo_03.Course">
<property name="name" value="mysql"></property>
9、提取集合中公共的部分进行注入
<!-- 提取list集合 类型属性 注入-->
<util:list id="ZhouHao">
<value>java</value>
<value>mysql</value>
<value>html5</value>
</util:list>
<!-- 将提取list的属性进行注入-->
<bean id="bbbb" class="com.zh.Day_02.Bean_Demo_04.book">
<property name="listBook" ref="ZhouHao"></property>
</bean>