Spring DI(依赖注入)

DI依赖注入

  • IoC(Inversion Of Control)控制翻转,Spring反向控制应用程序所需要使用的外部资源
  • DI(Dependency Injection)依赖注入,应用程序运行依赖的资源由Spring为其提供,资源进入应用程序的方式称为注入
  • 站在spring角度就是ioc,站在应用程序角度就是di
  • 可以理解为Spring提供的给对象赋值的功能

IoC与DI的关系:IoCDI是同一件事站在不同角度看待问题

在这里插入图片描述

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>
  1. 集合类型数据注入——list
<property name="al"><list><value>itzhuzhu</value><value>66666</value></list>
</property>
  1. 集合类型数据注入——props
<property name="properties"><props><prop key="name">itzhuzhu123</prop><prop key="value">666666</prop></props>
</property>
  1. 集合类型数据注入——array
<property name="arr"><array><value>123456</value><value>66666</value></array>
</property>
  1. 集合类型数据注入——set
 <property name="hs"><set><value>itzhuzhu</value><value>66666</value></set>
</property>
  1. 集合类型数据注入——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标签代替构造方法

  1. 引入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">
  1. 使用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

  1. ApplicationContext是一个接口,提供了访问spring容器的API

  2. ClassPathXmlApplicationContext是一个类,实现了上述功能

  3. ApplicationContext的顶层接口是BeanFactory

  4. BeanFactory定义了bean相关的最基本操作

  5. ApplicationContext在BeanFactory基础上追加了若干新功能

对比BeanFactory

  1. BeanFactory创建的bean采用延迟加载形式,使用才创建

  2. ApplicationContext创建的bean默认采用立即加载形式

FileSystemXmlApplicationContext

可以加载文件系统中任意位置的配置文件,而ClassPathXmlApplicationContext只能加载类路径下的配置文件

BeanFactory

Resource res = new ClassPathResource("applicationContext.xml");
BeanFactory bf = new XmlBeanFactory(res);
UserService userService = (UserService)bf.getBean("userService");

第三方资源配置

阿里数据源方案Druid

  1. 先在pom加Druid配置
        <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency>
  1. 然后再在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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring注解开发入门教程

注解开发&#xff1a; 什么是驱动注解&#xff1f; 注解启动时使用注解的形式替代xml配置&#xff0c;将繁杂的spring配置文件从工程中彻底消除掉&#xff0c;简化书写 注解驱动的弊端 为了达成注解驱动的目的&#xff0c;可能会将原先很简单的书写&#xff0c;变的更加复杂XM…

Spring整合Mybatis和JUnit

Spring整合Mybatis&#xff1a; 注解整合MyBatis分析 业务类使用注解形式声明bean&#xff0c;属性采用注解注入建立独立的配置管理类&#xff0c;分类管理外部资源&#xff0c;根据功能进行分类&#xff0c;并提供对应的方法获取bean使用注解形式启动bean扫描&#xff0c;加载…

Java-NIO(三):直接缓冲区与非直接缓冲区

直接缓冲区与非直接缓冲区的概念&#xff1a;1&#xff09;非直接缓冲区&#xff1a;通过 static ByteBuffer allocate(int capacity) 创建的缓冲区&#xff0c;在JVM中内存中创建&#xff0c;在每次调用基础操作系统的一个本机IO之前或者之后&#xff0c;虚拟机都会将缓冲区的…

Spring IOC扫描器与注册器

核心接口&#xff1a; 组件扫描器&#xff1a; 开发过程中&#xff0c;需要根据需求加载必要的bean&#xff0c;排除指定bean 设定组件扫描加载过滤器&#xff1a; 名称&#xff1a;ComponentScan 类型&#xff1a;类注解 位置&#xff1a;类定义上方 作用&#xff1a;设置…

Spring AOP切入点与通知XML类型

AOP&#xff1a; AOP(Aspect Oriented Programing)面向切面编程&#xff0c;一种编程范式&#xff0c;隶属于软工范畴&#xff0c;指导开发者如何组织程序结构AOP弥补了OOP的不足&#xff0c;基于OOP基础之上进行横向开发 uOOP规定程序开发以类为主体模型&#xff0c;一切围绕对…

给iOS项目中添加图片,并通过UIImageView引用和显示该UIImage图片

【问题】 关于iOS/iPhone中的文件选择对话框&#xff0c;用于用户去选择图片等文件 过程中&#xff0c;问题转换为&#xff0c;需要给当前iOS项目中&#xff0c;添加一个图片。 类似于Windows开发中的资源文件&#xff0c;其中图片文件属于资源的一种。 并且&#xff0c;接着可…

AOP底层原理与注解配置详解

注解开发AOP制作步骤&#xff1a; 在XML格式基础上 导入坐标&#xff08;伴随spring-context坐标导入已经依赖导入完成开启AOP注解支持配置切面Aspect定义专用的切入点方法&#xff0c;并配置切入点Pointcut为通知方法配置通知类型及对应切入点Before 注解开发AOP注意事项&am…

MacOS Apple M1 安装ARM架构的JDK及动态切换版本

JDK下载安装&#xff1a; 咱就是说&#xff0c;ARM版本的JDK就是一个字&#xff0c;真特么快&#xff0c;想变快吗&#xff0c;赶紧下载叭&#xff01;&#xff01; 1、下载地址&#xff1a;https://www.azul.com/downloads/?packagejdk 筛选一下MacOS下ARM架构的JDK版本&…

梯度下降和EM算法,kmeans的em推导

I. 牛顿迭代法给定一个复杂的非线性函数f(x)&#xff0c;希望求它的最小值&#xff0c;我们一般可以这样做&#xff0c;假定它足够光滑&#xff0c;那么它的最小值也就是它的极小值点&#xff0c;满足f′(x0)0&#xff0c;然后可以转化为求方程f′(x)0的根了。非线性方程的根我…

Spring事务详解与使用

Spring事务核心对象 J2EE开发使用分层设计的思想进行&#xff0c;对于简单的业务层转调数据层的单一操作&#xff0c;事务开启在业务层或者数据层并无太大差别&#xff0c;当业务中包含多个数据层的调用时&#xff0c;需要在业务层开启事务&#xff0c;对数据层中多个操作进行组…

黑马程序员博学谷Java就业班课程

1、资料全无加密&#xff0c;可任意试看 2、内容包括课程资料 地址:https://www.boxuegu.com/class/outline-1112.html

设计模式一の设计模式详解

一、设计模式定义 设计模式&#xff08;Design Pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的&#xff1a;为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化&#xff1b;…

Spring模板对象

Spring模块对象: 把共性的方法抽取出来固定为一个模板&#xff0c;后续再操作只需要填充内容即可。 比如&#xff1a;淘宝每次买东西都要填写地址&#xff0c;只是每次买的东西不一样&#xff0c;所以可以做一个默认地址&#xff0c;每次买东西都要去选商品就行了&#xff0c;不…

SpringMVC入门案例

SpringMVC 概述&#xff1a; SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 三层架构 表现层&#xff1a;负责数据展示业务层&#xff1a;负责业务处理数据层&#xff1a;负责数据操作 MVC&#xff08;Model View Controller&#xff09;&#xff1a;一种用于设计创建…

SpringMVC请求中的普通、POJO、数组集合类型传参与类转换器

SpringMVC将传递的参数封装到处理器方法的形参中&#xff0c;达到快速访问参数的目的。 普通类型参数传参 参数名与处理器方法形参名保持一致 访问URL&#xff1a; http://localhost/requestParam1?nameitzhuzhu&age14 RequestMapping("/requestParam1")publi…

SpringMVC-HandlerInterceptor拦截器的使用与参数详解

拦截器概念&#xff1a; 拦截器&#xff08; Interceptor&#xff09;是一种动态拦截方法调用的机制&#xff0c;请求处理过程解析核心原理&#xff1a; AOP思想拦截器链&#xff1a;多个拦截器按照一定的顺序&#xff0c;对原始被调用功能进行增强 作用&#xff1a; 在指定的…

使用FindBugs-IDEA插件找到代码中潜在的问题

另一篇使用文档&#xff0c;参照&#xff1a;https://www.cnblogs.com/huaxingtianxia/p/6703315.html 我们通常都会在APP上线之后,发现各种错误,尤其是空指针异常,这些错误对于用户体验来说是非常不好的,但其实大部分的问题,我们都能够提前发现. 在编写代码的过程中,可能不会时…

霍炬:再谈百度:KPI、无人机,以及一个必须给父母看的案例

霍炬&#xff1a;再谈百度&#xff1a;KPI、无人机&#xff0c;以及一个必须给父母看的案例 作者&#xff1a;霍炬。 原文链接&#xff1a;http://www.donews.com/idonews/article/8147.shtm没想到我之前的一篇关于百度的文章引起了这么大的反馈。非常多朋友称赞我写的好&…

使用SpringMVC模拟文件上传与下载案例

文件上传下载 SpringMVC封装了Tomcat的上传文件功能 MultipartResolver接口 MultipartResolver接口定义了文件上传过程中的相关操作&#xff0c;并对通用性操作进行了封装MultipartResolver接口底层实现类CommonsMultipartResovlerCommonsMultipartResovler并未自主实现文件上…

JSR表单校验框架

表单校验的重要性&#xff1a; 表单校验保障了数据有效性、安全性 不适用表单检验数据可以随意输入&#xff0c;导致错误的结果。后端表单校验的重要性&#xff0c;比如输入框采集成绩&#xff0c;如果前端做了检验&#xff0c;但是用户比较牛逼&#xff0c;他在地址栏上直接加…