DI依赖注入
IoC
(Inversion Of Control)控制翻转,Spring反向控制应用程序所需要使用的外部资源DI
(Dependency Injection)依赖注入,应用程序运行依赖的资源由Spring为其提供,资源进入应用程序的方式称为注入IoC与DI的关系:IoC
与DI
是同一件事站在不同角度看待问题
set注入:
名称:property
类型:标签
归属:bean标签
作用:使用set方法的形式为bean提供资源
格式:
<bean>
<property/>
bean>
基本属性:
<property name="propertyName" value="propertyValue" ref="beanId"/>
ref
,其他用value
演示:
public interface UserDao {
void save();
}
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("UserDao执行");
}
}
public class UserServiceImpl implements UserService {
// 添加引用类型和非引用的变量
private UserDao userDao;
private int num;
private String version;
// 1、对需要注入的变量添加set方法
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void setNum(int num) {
this.num = num;
}
public void setVersion(String version) {
this.version = version;
}
@Override
public void save() {
System.out.println("UserService执行" + num + version);
userDao.save();
}
}
<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 id="userService" class="com.itzhuzhu.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
<property name="num" value="1998"/>
<property name="version" value="itzhuzhu"/>
bean>
<bean id="userDao" class="com.itzhuzhu.service.dao.impl.UserDaoImpl"/>
beans>
构造器注入
名称:constructor-arg
类型:标签
归属:bean标签
作用:使用构造方法的形式为bean提供资源,兼容早期遗留系统的升级工作
格式:
<bean>
<constructor-arg />
bean>
<constructor-arg index="arg-index" type="arg-type" ref="beanId"/>
<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 id="userDao" class="com.itzhuzhu.service.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itzhuzhu.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao"/>
<constructor-arg name="num" value="1998"/>
<constructor-arg name="version" value="itzhuzhu"/>
bean>
beans>
public class UserServiceImpl implements UserService {
// 添加引用类型和非引用的变量
private UserDao userDao;
private int num;
private String version;
private BookDao bookDao;
public UserServiceImpl(UserDao userDao, int num, String version, BookDao bookDao) {
this.userDao = userDao;
this.num = num;
this.version = version;
this.bookDao = bookDao;
}
// 1、对需要注入的变量添加set方法
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void setNum(int num) {
this.num = num;
}
public void setVersion(String version) {
this.version = version;
}
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void save() {
System.out.println("UserService执行" + num + version);
userDao.save();
bookDao.save();
}
}
集合类型数据注入:
名称:array,list,set,map,props
类型:标签
归属:property标签 或 constructor-arg标签
作用:注入集合数据类型属性
格式:
<property>
<list>list>
property>
<property name="al">
<list>
<value>itzhuzhuvalue>
<value>66666value>
list>
property>
<property name="properties">
<props>
<prop key="name">itzhuzhu123prop>
<prop key="value">666666prop>
props>
property>
<property name="arr">
<array>
<value>123456value>
<value>66666value>
array>
property>
<property name="hs">
<set>
<value>itzhuzhuvalue>
<value>66666value>
set>
property>
<property name="hm">
<map>
<entry key="name" value="itzhuzhu123"/>
<entry key="value" value="6666666666"/>
map>
property>
演示:
public class BookDaoImpl implements BookDao {
private ArrayList al;
private Properties properties;
private int[] arr;
private HashSet hs;
private HashMap hm ;
public void setAl(ArrayList al) {
this.al = al;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public void setArr(int[] arr) {
this.arr = arr;
}
public void setHs(HashSet hs) {
this.hs = hs;
}
public void setHm(HashMap hm) {
this.hm = hm;
}
public void save() {
System.out.println("book dao running...");
System.out.println("ArrayList:"+al);
System.out.println("Properties:"+properties);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
System.out.println("HashSet:"+hs);
System.out.println("HashMap:"+hm);
}
}
配置文件
<bean id="userDao" class="com.itzhuzhu.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itzhuzhu.Service.impl.UserServiceImpl" p:bookDao-ref="bookDao" p:userDao-ref="userDao"/>
<bean id="bookDao" class="com.itzhuzhu.dao.impl.BookDaoImpl">
<property name="al">
<list>
<value>itzhuzhuvalue>
<value>666666value>
list>
property>
<property name="properties">
<props>
<prop key="name">itzhuzhu123prop>
<prop key="value">666666prop>
props>
property>
<property name="arr">
<array>
<value>12345value>
<value>666666value>
array>
property>
<property name="hs">
<set>
<value>itzhuzhuvalue>
<value>666666value>
set>
property>
<property name="hm">
<map>
<entry key="name" value="itzhuzhu123"/>
<entry key="value" value="666666"/>
map>
property>
bean>
UserServiceImpl调用BookDao的save();
使用p命名空间简化配置
名称:p:propertyName,p:propertyName-ref
类型:属性
归属:bean标签
作用:为bean注入属性值
格式:
<bean p:propertyName="propertyValue" p:propertyName-ref="beanId"/>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
beans>
演示:
<bean id="userService" class="com.itzhuzhu.service.impl.UserServiceImpl" p:userDao-ref="userDao"p:bookDao-ref="bookDao"/>
C标签代替构造方法
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<bean class="com.itheima.xml.Person" c:_0="3" c:name="Jason3"/>
SpEL
Spring提供了对EL表达式的支持,统一属性注入格式
类型:属性值
归属:value属性值
作用:为bean注入属性值
格式:
<property value="EL">bean>
注意:所有属性值不区分是否引用类型,统一使用value赋值
所有格式统一使用 value=“********”
常量 #{10} #{3.14} #{2e5} #{‘itcast’}
引用bean #{beanId}
引用bean属性 #{beanId.propertyName}
引用bean方法 beanId.methodName().method2()
引用静态方法 T(java.lang.Math).PI
运算符支持 #{3 lt 4 == 4 ge 3}
正则表达式支持 #{user.name matches‘[a-z]{6,}’}
集合支持 #{likes[3]}
演示:
<bean id="userService" class="com.itzhuzhu.service.impl.UserServiceImpl">
<property name="userDao" value="#{userDao}"/>
<property name="bookDao" value="#{bookDao}"/>
<property name="num" value="#{666666666}"/>
<property name="version" value="#{'itzhuzhu'}"/> 字符加单引号
bean>
properties文件
Spring提供了读取外部properties文件的机制,使用读取到的数据为bean的属性赋值
操作步骤
1.准备外部properties文件
2.开启context
命名空间支持
xmlns:context="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xds"
3.加载指定的properties
文件
<context:property-placeholder location="classpath:filename.properties"/>
<context:property-placeholder location="classpath:*.properties"/>
4.使用加载的数据
<bean id="userDao" class="com.itzhuzhu.service.impl.UserDaoImpl">
<property name="userName" value="${username}"/>
<property name="password" value="${password}"/>
bean>
注意:如果需要加载所有的properties文件,可以使用*.properties
表示加载所有的properties文件
注意:读取数据使用${propertiesName}
格式进行,其中propertiesName
指properties文件中的属性名
import导入配置文件
名称:import
类型:标签
归属:beans标签
作用:在当前配置文件中导入其他配置文件中的项
格式:
<beans>
<import />
beans>
基本属性:
resource:加载的配置文件名
resource:加载的配置文件名
new ClassPathXmlApplicationContext("applicationContext-user.xml","applicationContext-book.xml");
Spring容器中的bean定义冲突问题
同id的bean,后定义的覆盖先定义的
导入配置文件可以理解为将导入的配置文件复制粘贴到对应位置
导入配置文件的顺序与位置不同可能会导致最终程序运行结果不同
ApplicationContext
ApplicationContext是一个接口,提供了访问spring容器的API
ClassPathXmlApplicationContext是一个类,实现了上述功能
ApplicationContext的顶层接口是BeanFactory
BeanFactory定义了bean相关的最基本操作
ApplicationContext在BeanFactory基础上追加了若干新功能
对比BeanFactory
BeanFactory创建的bean采用延迟加载形式,使用才创建
ApplicationContext创建的bean默认采用立即加载形式
FileSystemXmlApplicationContext
可以加载文件系统中任意位置的配置文件,而ClassPathXmlApplicationContext只能加载类路径下的配置文件
BeanFactory
Resource res = new ClassPathResource("applicationContext.xml");
BeanFactory bf = new XmlBeanFactory(res);
UserService userService = (UserService)bf.getBean("userService");
第三方资源配置
阿里数据源方案Druid
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.2.8version>
dependency>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver">property>
<property name="url" value="jdbc:mysql://localhost:3306/spring_ioc">property>
<property name="username" value="root">property>
<property name="password" value="root">property>
bean>