Spring DI(依赖注入)
DI依赖注入
IoC
(Inversion Of Control)控制翻转,Spring反向控制应用程序所需要使用的外部资源DI
(Dependency Injection)依赖注入,应用程序运行依赖的资源由Spring为其提供,资源进入应用程序的方式称为注入- 站在spring角度就是ioc,站在应用程序角度就是di
- 可以理解为Spring提供的给对象赋值的功能
IoC与DI的关系:IoC
与DI
是同一件事站在不同角度看待问题
set注入:
名称:property
类型:标签
归属:bean标签
作用:使用set方法的形式为bean提供资源
格式:
<bean><property/></bean>
基本属性:
<!--property: 调用set方法注入参数/属性值name: 属性名称value: 注入的值-->
<property name="propertyName" value="propertyValue" ref="beanId"/>
- name:对应bean中的属性名,要求该属性必须提供可访问的set方法(严格规范为此名称是set方法对应名称)
- value:设定非引用类型属性对应的值,不能与ref同时使用
- ref:设定引用类型属性对应bean的id ,不能与value同时使用
- 注意:一个bean可以有多个property标签
- Set注入,包装类型也会被看做是普通的数据类型去用,都用value,注入对象用
ref
,其他用value
演示:
public interface UserDao {void save();
}
public class UserDaoImpl implements UserDao {@Overridepublic 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;}@Overridepublic void save() {System.out.println("UserService执行" + num + version);userDao.save();}
}
<?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 id="userService" class="com.itzhuzhu.service.impl.UserServiceImpl"><!--将要注入的引用类型的变量通过property实行进行注入,对应的name是注入的变量名,ref是bean的id,Integer也是非引用--><!--引用类型用ref 其他都用value--><property name="userDao" ref="userDao"/><property name="num" value="1998"/><property name="version" value="itzhuzhu"/></bean><!--2、将要注入的资源声明为bean--><bean id="userDao" class="com.itzhuzhu.service.dao.impl.UserDaoImpl"/>
</beans>
构造器注入
名称:constructor-arg
类型:标签
归属:bean标签
作用:使用构造方法的形式为bean提供资源,兼容早期遗留系统的升级工作
格式:
<bean><constructor-arg />
</bean>
- 基本属性:
<constructor-arg name="argsName" value="argsValue />
name:对应bean中的构造方法所携带的参数名
value:设定非引用类型构造方法参数对应的值,不能与ref同时使用
其他属性:
<constructor-arg index="arg-index" type="arg-type" ref="beanId"/>
- ref:设定引用类型构造方法参数对应bean的id ,不能与value同时使用
- type :设定构造方法参数的类型,用于按类型匹配参数或进行类型校验
- index :设定构造方法参数的位置,用于按位置匹配参数,参数index值从0开始计数
- 注意:一个bean可以有多个constructor-arg标签
<?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"><!--2、将要注入的资源声明为bean--><bean id="userDao" class="com.itzhuzhu.service.dao.impl.UserDaoImpl"/><bean id="userService" class="com.itzhuzhu.service.impl.UserServiceImpl"><!--使用构造方法进行set注入,需要保障注入的属性与bean中定义的属性类型一致,因为顺序是按照构造方法的顺序默认排的--><!--一致指的是顺序或类型,可以使用name和index解决问题--><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;}@Overridepublic void save() {System.out.println("UserService执行" + num + version);userDao.save();bookDao.save();}
}
集合类型数据注入:
名称:array,list,set,map,props
类型:标签
归属:property标签 或 constructor-arg标签
作用:注入集合数据类型属性
格式:
<property><list></list>
</property>
- 集合类型数据注入——list
<property name="al"><list><value>itzhuzhu</value><value>66666</value></list>
</property>
- 集合类型数据注入——props
<property name="properties"><props><prop key="name">itzhuzhu123</prop><prop key="value">666666</prop></props>
</property>
- 集合类型数据注入——array
<property name="arr"><array><value>123456</value><value>66666</value></array>
</property>
- 集合类型数据注入——set
<property name="hs"><set><value>itzhuzhu</value><value>66666</value></set>
</property>
- 集合类型数据注入——map
<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>itzhuzhu</value><value>666666</value></list></property><property name="properties"><props><prop key="name">itzhuzhu123</prop><prop key="value">666666</prop></props></property><property name="arr"><array><value>12345</value><value>666666</value></array></property><property name="hs"><set><value>itzhuzhu</value><value>666666</value></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"/>
- 注意:使用p命令空间需要先开启spring对p命令空间的的支持,在beans标签中添加对应空间支持
<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标签代替构造方法
- 引入C名称空间
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<!-- c标签命名空间 -->xmlns:c="http://www.springframework.org/schema/c"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
- 使用c标签
<!--c:_0: 表示给指定参数列表的下标参数注入值c:name: 指定参数列表中的参数名称注入值--><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"><!--name是对应的属性名,value是对应配置文件的属性名--><!--<property name="propertyName" value="${propertiesName}"/>--><property name="userName" value="${username}"/><property name="password" value="${password}"/></bean>
注意:如果需要加载所有的properties文件,可以使用
*.properties
表示加载所有的properties文件注意:读取数据使用
${propertiesName}
格式进行,其中propertiesName
指properties文件中的属性名
import导入配置文件
名称:import
类型:标签
归属:beans标签
作用:在当前配置文件中导入其他配置文件中的项
格式:
<beans><import />
</beans>
基本属性:
resource:加载的配置文件名
<import resource=“applicationContext-user.xml"/>
resource:加载的配置文件名
- Spring容器加载多个配置文件
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
- 先在pom加Druid配置
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency>
- 然后再在applicationContext加下面的
<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>
Spring DI(依赖注入)相关推荐
- Spring DI依赖注入讲解
DI:dependency injection 依赖注入 在spring框架负责创建Bean对象时,动态将依赖对象注入到Bean组件. public class UserServiceImpl imp ...
- Spring DI(依赖注入)注解篇
1 课程内容介绍 我之前写的的一篇博客Spring核心功能DI(依赖注入)xml篇主要介绍了如何通过配置xml的方式来实现依赖注入,今天我们来介绍如何通过注解方式完成我们的依赖注入操作. 2 注入基本 ...
- Spring DI(依赖注入)Xml篇
1 DI(依赖注入)简单介绍 如果您对Spring了解甚少,建议先移步我的另一篇博客Spring核心功能IOC之HelloWorld因为下面的内容是在该文章基础上进行阐述的 .我们可以通过一段简单代码 ...
- 手写Spring DI依赖注入,嘿,你的益达!
手写DI 提前实例化单例Bean DI分析 DI的实现 构造参数依赖 一:定义分析 二:定义一个类BeanReference 三:BeanDefinition接口及其实现类 四:DefaultBean ...
- Spring DI[依赖注入]
依赖注入(Dependency Injection,简称DI)意思是由容器或者框架将被调用类注入给调用对象,以此来降低调用对象和被调用类之间的依赖关系. 依赖注入主要有2种不同的实现形式: 1. 构造 ...
- Spring DI依赖注入方式
1.构造器注入 2.Set方式注入[重点] 依赖注入:Set注入 依赖:bean对象的创建依赖于容器 注入:bean对象中的所有属性,由容器来注入. [环境搭建] Student package co ...
- Spring DI(依赖注入)构造器注入篇
Spring 在不使用自动装配的方式进行注入需要我们必须为成员属性提供setter方法,这种方式相对比较繁琐,除了setter方法注入方式外,Spring还为我们提供了构造器配置的注入方式. 构造器默 ...
- 【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入
IoC 控制反转.DI 依赖注入 Spring 简介 Spring 基本使用 - IoC 容器 依赖注入 (Dependency Injection) 基于 setter 的注入 - 自定义对象 be ...
- Spring(二)--------Spring配置、DI依赖注入、Bean自动装配
Spring(二)--------Spring配置.DI依赖注入.Bean自动装配 5.Spring配置 5.1 别名 设置别名:第一种方式alias <!--其中name为ID的对应值--&g ...
最新文章
- tcpdump 抓取icmp数据包
- UIView上的控件使用push方法跳转
- HDU1114 Piggy-Bank 【全然背包】
- 跨域资源共享CORS详解
- Linux大作业任务书,《Linux系统管理》期末大作业任务书(2014.12)(1).doc
- 【TensorFlow】Win10+TensorFlow+Anaconda+CUDA+cuDNN
- SVN 使用hooks 自动更新到远程的web目录下
- el-select传递多个参数_python函数是如何进行参数传递的
- QT学习之路七(qt的数据库操作)
- 论学习计划的 重要性
- 软件测试助理利弊,女生做软件测试的利弊都有什么?
- C++ - _T含义 C++语言中“_T”是什么意思?
- 惊!西游记内幕竟是这样的。
- 浅谈Nginx转发匹配规则
- unity文字转语音插件(中文版)教程
- 计算机电路英语词汇,PCB专业英语词汇对照表(大全)
- 风丘科技为您提供车载以太网解决方案
- BHQ-1 amine,1308657-79-5,BHQ染料通过FRET和静态猝灭的组合工作
- 做公关必用的四大法宝
- pycharm汉化之后切换回英文