Spring IOC
1. IOC --控制反转
IOC全称为 Inverse Of Control,表示控制反转。指的是程序员使用硬编码创建的对象转为由Spring容器来创建,对于对象生命周期的控制交给Spring容器来管理。控制反转解决了具有依赖关系的组件之间的强耦合,使得项目形态更加稳健
2. IOC的使用
spring ioc的使用需要依赖于spring生态中的一些模块,如bean、core…
2.1 依赖导入
想要使用spring ioc的全部功能可以导入下方依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.11</version>
</dependency>
2.2 创建需要ioc管理的类
public class User {
}
2.3 ioc配置文件
这里命名为: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标签 -->
<!-- bean标签表示一个交由ioc容器管理的对象 -->
<!-- 示例: -->
<bean name="user" class="com.dream.spring.ioc.model.User" />
</beans>
2.4 测试方法
@Test
public void iocTest(){
//应用上下文 类路径下的xml
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//根据Bean的名称获取类的对象
User user = context.getBean("user", User.class);
System.out.println(user);
}
3. DI — 依赖注入
在将对象交由ioc容器进行管理时,常常还需要为对象进行赋值,这就需要使用DI
DI全称为Dependency Injection,表示依赖注入。指的是在Spring创建对象的同时,为其属性赋值
首先给类中添加属性
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String username;
private String password;
private Map<String,Object> map;
private double[] c;
private UserInfo[] infos;
private List<String> list;
private Properties props;
private UserInfo info;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo {
private String name;
private String sex;
private int age;
private String hobby;
}
3.1 常见注入方式
常见的依赖注入有两种方式:set注入和构造方法注入
3.1.1 构造方法注入
构造注入指的是通过构造放入为属性注入值。
<!--application.xml-->
<bean name="s" class="com.dream.spring.ioc.model.UserInfo">
<!--这里按照顺序为属性注入值-->
<constructor-arg index="0" value="李四" />
<constructor-arg index="1" value="女" />
<constructor-arg index="2" value="22" />
<constructor-arg index="3" value="跳舞" />
</bean>
注:按照构造方法出现参数的顺序书写,index从0开始
3.1.2 set方法注入(最常用)
set方法注入,通过寻找property标签中的name属性值,首字母大写加上set,通过反射进行调用(setName())注意,并不是直接通过属性名进行赋值
<!--application.xml-->
<bean name="stu" class="com.dream.spring.ioc.model.UserInfo">
<property name="name" value="张三" />
<property name="age" value="20" />
<property name="sex" value="男" />
<property name="hobby" value="唱歌" />
</bean>
4.1 注入各种类型的参数
(以set注入方式)
4.1.1 注入常用数据类型
常用数据类型指8种基本数据类型以及对应的包装类、日期类型、字符串等。在注入时,可以使用value值直接写入“”之间。
注:Date类型需要使用默认的字符串格式yyyy/MM/dd
4.1.2 注入引用数据类型
对于引用数据类型,spring 提供了两种注入值的方式。
一种是通过 ref 属性来引用 已经定义在容器中的bean 对象从而进行值的注入;
一种是通过 property 标签下嵌套bean 标签来创建一个 bean 对象进行值的注入。
<!--第一种-->
<property name="" ref="" />
<!--第二种-->
<property name="">
<bean class=""></bean>
</property>
4.1.3 注入数组类型
注入数组类型需要在property 标签下嵌套array标签
示例:
数组中为基本数据类型
<property name="c" >
<array>
<value>20</value>
<value>30</value>
<value>40</value>
</array>
</property>
注:为引用数据类型的数组时,参照4.1.2进行注入,可以使用bean标签嵌套,在使用引用ref标签时,略有不同,存在单独的ref标签。
示例:
<property name="infos">
<array >
<ref bean="info"></ref>
</array>
</property>
综合示例:
<property name="students">
<array>
<!--引用数据类型 可以使用bean标签创建bean对象注入值-->
<!--<bean class=""></bean>-->
<!--引用数据类型 可以使用ref标签引用bean对象注入值-->
<ref bean="s" />
<ref bean="stu" />
<!--常用数据类型 可以使用value标签直接注入值-->
<!-- <value></value>-->
</array>
</property>
4.1.4 注入List集合对象
注入集合对象与数组类似,需要使用list标签。
<property name="list">
<list>
<!--引用数据类型 可以使用ref标签引用bean对象注入值-->
<ref bean="s" />
<!--引用数据类型 可以使用bean标签创建bean对象注入值-->
<!--<bean class=""></bean>-->
<value>aaaa</value>
<value>bbbb</value>
</list>
</property>
4.1.5 注入Set集合对象
示例:
<property name="friendNames">
<set>
<!--引用数据类型 可以使用ref标签引用bean对象注入值-->
<ref bean="s" />
<!--引用数据类型 可以使用bean标签创建bean对象注入值-->
<!--<bean class=""></bean>-->
<value>李四</value>
<value>王五</value>
</set>
</property>
4.1.6 注入Map集合对象
注入map对象,需要使用到map标签和其下的entry标签(map底层就是一个entry的对象数组)
示例:
<property name="map">
<map>
<entry key="a" value="1111"></entry>
<entry key="b" value="2222"></entry>
<!--引用数据类型 可以使用value-ref标签引用bean对象注入值-->
<entry key="c" value-ref="info"></entry>
<entry key="d">
<!--引用数据类型 可以使用bean标签创建bean对象注入值-->
<!--<bean class=""></bean>-->
</entry>
</map>
</property>
4.1.7 注入Properties对象
注入properties对象需要使用props标签
<property name="props">
<props>
<prop key="name">硕硕</prop>
<prop key="sex">男</prop>
</props>
</property>
注:properties中存放的键值都是String类型。