目录
IOC:控制反转(Inversion of Controll)
IOC:控制反转(Inversion of Controll)
详解:将原来手动 new 关键字创建对象的权力交给 Spring ,通过在配置文件中配置 Bean 标签形式创建对象(交给 Spring,由 Spring 创建对象过程)
DI:依赖注入(Denpendcy Injection)
详解:为组件中成员变量完成赋值过程,被称为依赖注入
语法:
1、组件对象中需要哪个组件(谁),将谁声明为成员变量,并提供其公开的 SET 方法
2、在 Spring 配置文件中,对应的组件标签内完成属性的复制操作
控制反转就是将原来手动通过 new 关键字创建对象的权力交给 Spring,由 Spring 工厂创建对象的过程,当然 Spring 不仅要创建对象,还要在创建对象的同时通过DI的方式维护组件与组件调用关系。
1、SET注入-使用成员变量的 SET 方法形式进行赋值
- 注入八大基本类型、String 类型、Date 类型, 统一使用 value 属性进行注入
- 注入对象类型(引用类型),统一使用 ref 属性注入
- 注入数据类型,使用 <array>
- 注入集合类型,使用 <list>
- 注入 Map 类型,使用 <map><entity>
- 注入 properties,使用 <props>
<?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">
<!--
通过 spring 管理组件
bean:用来管理组件对象的创建
id:用来指定 spring 框架创建的当前组件对象在 spring(容器|工厂)中唯一标识(全局唯一)
class:指定管理组件对象的全限定名称(包.类)
-->
<bean id="userService" class="com.grocery.service.UserService">
<!--
依赖的注入
property:用来给组件中的属性进行赋值操作
name:用来指定给组件中的哪个属性名进行赋值
ref:用来指定赋值对象在工厂中唯一标识 bean的id
value:八大基本类型、String、Date(日期格式默认为 yyyy/MM/dd HH:mm:ss)类型值的注入
-->
<property name="userDao" ref="userDao"></property>
<property name="userName" value="张三"></property>
<property name="age" value="18"></property>
<property name="sex" value="true"></property>
<property name="birthDay" value="2021/09/21 23:54:29"></property>
<property name="friendNames">
<array>
<value>小陈</value>
<value>小柳</value>
<value>小胡</value>
<value>小王</value>
</array>
</property>
<property name="userDaos">
<array>
<ref bean="userDao"></ref>
<ref bean="userDao"></ref>
<ref bean="userDao"></ref>
</array>
</property>
<property name="classNames">
<list>
<value>班级1</value>
<value>班级2</value>
<value>班级3</value>
</list>
</property>
<property name="map">
<map key-type="java.lang.String">
<entry key="辽宁" value="沈阳"></entry>
<entry key="北京" value="北京"></entry>
<entry key="上海" value="上海"></entry>
</map>
</property>
<property name="properties">
<props>
<prop key="spring.id">id</prop>
<prop key="spring.name">name</prop>
<prop key="spring.value">value</prop>
</props>
</property>
</bean>
<bean id="userDao" class="com.grocery.dao.UserDao"></bean>
</beans>
2、构造注入-使用构造方法形式进行注入
使用类中构造方法为类中成员变量赋值的过程,称之为构造注入。
语法:
1、需要哪个组件属性将谁声明为成员变量,并提供公开构造方法
2、在配置文件中对应的组件标签内部使用 <constructor-arg> 标签进行注入
private String userName;
private int age;
public UserService(){
}
public UserService(String userName, int age){
this.userName = userName;
this.age = age;
}
<!--
构造方法注入
使用 constructor-arg 标签
index:构造方法上的参数索引
name:构造方法上的参数名称
value:指定的值(八大基本类型、String类型、Date类型)
ref:对象(引用类型)
其他类型参考 SET 注入
-->
<bean id="userService" class="com.grocery.service.UserService">
<constructor-arg index="0" name="userName" value="小灰灰"></constructor-arg>
<constructor-arg index="1" name="age" value="18"></constructor-arg>
</bean>
缺点:不够灵活,需要配置多个不同参数的构造方法 ,不推荐使用
3、自动注入-通过配置文件中完成类中属性自动赋值
在 Spring 工厂配置文件中通过制定自动注入方式,开启组件属性的自动赋值
注意:
1、底层使用的原理也是使用 SET 方式注入
2、自动注入需要在对应组件标签开启才能使用
3、只能用于引用类型的注入(对象、组件)
语法:
1、需要谁将谁声明为成员变量,并提供 SET 方法
2、在对应组件标签上加入 autowired 属性并指定自动注入方式即可
import com.grocery.dao.UserDao;
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void getName(String userName){
System.out.println("userService:" + userName);
userDao.getName(userName);
}
}
<bean id="userDao" class="com.grocery.dao.UserDao" />
<!--
自动注入
autowire:用来给组件中成员变量完成自动赋值操作
byName:根据名称自动注入
byType:根据类型自动注入 根据成员变量在工厂中的类型,找到即赋值,找不到不赋值
-->
<bean id="userService" class="com.grocery.service.UserService" autowire="byName" />