5、DI依赖注入
1、概念
IOC:控制反转
,从容器的角度考虑,spring容器控制资源,并给到别的应用程序资源。
DI:依赖注入
,从应用程序的角度考虑,它是被IOC容器注入资源的,这也就叫依赖注入。
- 依赖:bean对象的创建依赖于容器
- 注入:bean对象中的所有属性,由容器来注入
2、依赖注入的两种方式
- set注入
- 构造器注入
1、set注入–属性注入(主流)
主要是注入引用数据类型
1、将要注入的到别的地方的类注册到spring容器当中
2、将要被注入的类注册到spring容器当中,并且这个类中要有成员变量,然后又set方法
3、在要被注入的类的bean中注册property属性,然后name=set的名字开头小写,id就是这个要注册到别的地方的这个类的id
应用场景:业务层需要使用dao层的方法,传统的做法就是创建对象,在spring中就不一样了,是把这两个类都注册到spring中,然后给一个成员变量和set,接着把这个类的id和成员的name写进去。
UserDao
package com.zhu.dao;
public interface UserDao {
public void add();
}
UserDaoImpl
package com.zhu.dao;
public class UserDaoImpl implements UserDao{
private String name;
public void add() {
System.out.println("这个添加方法运行了...");
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
UserService
package com.zhu.service;
public interface UserService {
public void add();
}
UserServiceImpl
package com.zhu.service;
import com.zhu.dao.UserDao;
public class UserServiceImpl implements UserService{
//这里业务层要调用dao层的类,以前是直接创建对象使用,这里使用spring容器的set注入
private UserDao userDao;
private int num;
@Override
public void add() {
System.out.println("service 跑起来了");
userDao.add();
System.out.println(num);
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void setNum(int num) {
this.num = num;
}
}
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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--1、将方法这个类配置到spring容器当中,目的:让spring帮我们创建java对象
id:配置一个唯一标识
class:设置类的全类名,spring会利用反射技术调用类的无参构造创建对象
-->
<bean id="userDaoImpl" class="com.zhu.dao.UserDaoImpl">
<!-- 设置属性值-->
<property name="name" value="你妈买菜必涨价"></property>
</bean>
<!-- 我们要往这个类中注入别的类,所以我们的类中要有成员变量,然后往这个成员变量中set这个类
ref:引用数据类型,也就是要注入的这个类的bean的id
-->
<bean id="userService" class="com.zhu.service.UserServiceImpl">
<property name="userDao" ref="userDaoImpl"></property>
<property name="num" value="333"></property>
</bean>
</beans>
Test
package com.zhu.test;
import com.zhu.dao.UserDaoImpl;
import com.zhu.service.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
//2、加载spring容器
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
//3、从spring容器中获取bean资源,获取到的也就是这个类的对象
UserServiceImpl userService = (UserServiceImpl) context.getBean("userService");
userService.add();
}
}
2、构造器注入(了解)
构造器注入和set注入类似
name:适用于任何时候(最好用)
type:适用于类型不一样的时候(几乎用不到)
index:根据下标给属性设置值(鸡肋)
如果定义好了之后,再往构造方法里面加值,整个坐标就会被打乱,所以说这个属性很垃圾,别用!!!!
<constructor-arg ref="conversionService"></constructor-arg>
<constructor-arg name="num" value="11"></constructor-arg>
<constructor-arg name="name" value="hell0"></constructor-arg>
3、集合注入
简单,就像注入属性一样。
<bean id="student" class="com.zhu.Student">
<property name="a" value="1"></property>
<property name="b" value="22"></property>
<property name="c" value="1.1"></property>
<property name="d" value="奥利给"></property>
<property name="arrayList">
<list>
<value>name</value>
<value>age</value>
</list>
</property>
<!-- 数组拷贝list的格式也能用-->
<property name="arr">
<array>
<value>1111</value>
<value>2</value>
</array>
</property>
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
6、p命名空间(了解)
7、springEL表达式(了解)
使用EL表达式:ref就可以改成value了
value="#{userDao}"
了解即可,没啥用
8、外部properties文件
jdbc的外部文件
命名空间这里需要修改很多
<!-- 1、 加载命名空间的支持:xmlns:context="http://www.springframework.org/schema/context"-->
<!-- 2、加载配置文件-->
<context:property-placeholder location="classpath*:jdbc.properties"/>
<bean id="student" class="com.zhu.Student" >
<property name="password" value="${username}"></property>
<property name="userName" value="${pwd}"></property>
9、import导入配置文件
原因:好几个人同时维护一个spring容器,会出现很多问题
解决:使用主和副配置文件解决,一个文件是主文件,后面的副文件都挂在主文件上面
<!--导入别的spring容器-->
<import resource="applicationContext-user.xml"/>
- spring容器也可以加载多个配置文件(了解,不会写)
10、ClassPathXmlApplicationContext对象
了解即可