Spring之DI依赖注入

怼烎@ 2023-10-05 23:49 138阅读 0赞

6、(DI)依赖注入

DI与IOC的关系:

相同问题不同角度分析。

在这里插入图片描述

  • 名称:property
  • 类型:标签
  • 归属:bean标签
  • 作用:使用set方法的形式为bean提供资源
  • 格式:

    1. <bean>
    2. <property />
    3. </bean>
  • 基本属性:

    1. <property name="propertyName" value="propertyValue" ref="beanId"/>

name:对应bean中的属性名,要求该属性必须提供可访问的set方法(严格规范为此名称是set方法对应名称)

value:设定非引用类型属性对应的值,不能与ref同时使用

ref:设定引用类型属性对应bean的id ,不能与value同时使用

  • 注意:一个bean可以有多个property标签

    <?xml version=”1.0” encoding=”UTF-8”?>












6.1、构造器注入

  • 名称:constructor-arg
  • 类型:标签
  • 归属:bean标签
  • 作用:使用构造方法的形式为bean提供资源,兼容早期遗留系统的升级工作
  • 格式:

    1. <bean>
    2. <constructor-arg />
    3. </bean>
  • 基本属性:

    1. <constructor-arg name="argsName" value="argsValue />

name:对应bean中的构造方法所携带的参数名

value:设定非引用类型构造方法参数对应的值,不能与ref同时使用

其他属性:

  1. <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”?>











6.2、Set方式注入【重点】

依赖注入:Set注入!

  • 依赖:bean对象的创建依赖于容器!
  • 注入: 上bean对象中的所有属性,由容器来注入!

【环境搭建】

1.复杂类型
  1. package com.blue.pojo;
  2. public class Address {
  3. private String address;
  4. public String getAddress() {
  5. return address;
  6. }
  7. public void setAddress(String address) {
  8. this.address = address;
  9. }
  10. }
2.真实测试对象
  1. public class Student {
  2. private String name;
  3. private Address address;
  4. private String[] books;
  5. private List<String> hobbies;
  6. private Map<String,String> card;
  7. private Set<String> games;
  8. private String wife;
  9. private Properties into;

beans.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <bean id="student" class="com.blue.pojo.Student">
  6. <!-- 第一种,普通注入,value -->
  7. <property name="name" value="blue"/>
  8. </bean>
  9. </beans>

MyTest

  1. public class MyTest {
  2. public static void main(String[] args) {
  3. ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
  4. Student student = (Student) context.getBean("student");
  5. System.out.println(student.getName());
  6. }
  7. }

集合注入方式:

  • 名称:array,list,set,map,props
  • 类型:标签
  • 归属:property标签 或 constructor-arg标签
  • 作用:注入集合数据类型属性
  • 格式:

    1. <property>
    2. <list></list>
    3. </property>

(1)集合类型数据注入——list

  1. <property name="al">
  2. <list>
  3. <value>itheima</value>
  4. <value>66666</value>
  5. </list>
  6. </property>

(2)集合类型数据注入——props

  1. <property name="properties">
  2. <props>
  3. <prop key="name">itheima666</prop>
  4. <prop key="value">666666</prop>
  5. </props>
  6. </property>

(3)集合类型数据注入——array (了解)

  1. <property name="arr">
  2. <array>
  3. <value>123456</value>
  4. <value>66666</value>
  5. </array>
  6. </property>

(4)集合类型数据注入——set(了解)

  1. <property name="hs">
  2. <set>
  3. <value>itheima</value>
  4. <value>66666</value>
  5. </set>
  6. </property>

(5)集合类型数据注入——map(了解)

  1. <property name="hm">
  2. <map>
  3. <entry key="name" value="itheima66666"/>
  4. <entry key="value" value="6666666666"/>
  5. </map>
  6. </property>

掌握:props、list

案例:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. https://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <!--1.创建spring控制的资源-->
  7. <!--bean可以使用多个名称,使用那么属性完成,中间使用,隔开-->
  8. <!-- <bean id="userService" name="userService1" class="com.DI.service.Impl.UserServiceImpl">
  9. <!–3.将要租注入的引用类型的变量通过property属性进行注入,对应的name是要注入的变量名 使用ref属性声明要注入的bean的id–>
  10. <property name="userDao" ref="userDao"/>
  11. <property name="num" value="666"/>
  12. <property name="version" value="楠木"/>
  13. </bean>-->
  14. <!--将要注入的资源声明为bean,引用类型需要声明,非引用类型的不用声明,直接赋值-->
  15. <!--<bean id="userDao" class="com.DI.Dao.Impl.UserDaoImpl">
  16. <!–不加name,也可以加index:从0开始–>
  17. <constructor-arg name="password" value="12345"/>
  18. <constructor-arg name="username" value="root"/>
  19. <constructor-arg name="driver" value="123"/>
  20. </bean>
  21. <!–构造注入–>
  22. <bean id="userService" name="userService1" class="com.DI.service.Impl.UserServiceImpl">
  23. <!– 使用构造方法进行set注入,需要保障注入的属性与bean中定义的属性一致–>
  24. <!–一致指顺序一致或类型一致或使用index解决问题–>
  25. <constructor-arg name="userDao" ref="userDao"/>
  26. <constructor-arg name="num" value="66666"/>
  27. <constructor-arg name="version" value="楠木"/>
  28. </bean>-->
  29. <!--其余类型注入-->
  30. <bean id="userDao" class="com.DI.Dao.Impl.UserDaoImpl">
  31. <!--不加name,也可以加index:从0开始-->
  32. <constructor-arg name="password" value="12345"/>
  33. <constructor-arg name="username" value="root"/>
  34. <constructor-arg name="driver" value="123"/>
  35. </bean>
  36. <bean id="userService" name="userService1" class="com.DI.service.Impl.UserServiceImpl">
  37. <property name="userDao" ref="userDao"/>
  38. <property name="bookDao" ref="bookDao"/>
  39. </bean>
  40. <bean id="bookDao" name="bookDao" class="com.DI.Dao.Impl.BookDaoImpl">
  41. <property name="al">
  42. <list>
  43. <value>楠木1</value>
  44. <value>楠木2</value>
  45. </list>
  46. </property>
  47. <property name="props">
  48. <props>
  49. <prop key="name">小米</prop>
  50. <prop key="value">大米</prop>
  51. </props>
  52. </property>
  53. <property name="arr">
  54. <array>
  55. <value>6666</value>
  56. <value>9999</value>
  57. </array>
  58. </property>
  59. <property name="hs">
  60. <set>
  61. <value>楠木3</value>
  62. <value>楠木4</value>
  63. </set>
  64. </property>
  65. <property name="hm">
  66. <map>
  67. <entry key="name" value="楠木5"></entry>
  68. <entry key="name" value="楠木6"></entry>
  69. </map>
  70. </property>
  71. </bean>
  72. </beans>

6.3、拓展方式注入

  • 名称:p:propertyName,p:propertyName-ref
  • 类型:属性
  • 归属:bean标签
  • 作用:为bean注入属性值
  • 格式:

    1. <bean p:propertyName="propertyValue" p:propertyName-ref="beanId"/>
  • 注意:使用p命令空间需要先开启spring对p命令空间的的支持,在beans标签中添加对应空间支持

    1. <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">

    后续课程中还将开启其他的命名空间,方式同上

  • 案例:

    1. <bean
    2. id="userService"
    3. class="com.itheima.service.impl.UserServiceImpl"
    4. p:userDao-ref="userDao"
    5. p:bookDao-ref="bookDao"
    6. />

标签P

简化书写,直接注入属性值

  1. xmlns:p="http://www.springframework.org/schema/p"

注意点:p命名和c命名空间不能直接使用,需要导入xml约束!

  1. xmlns:p="http://www.springframework.org/schema/p"
  2. xmlns:c="http://www.springframework.org/schema/c"
  3. <?xml version="1.0" encoding="UTF-8"?>
  4. <beans xmlns="http://www.springframework.org/schema/beans"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xmlns:p="http://www.springframework.org/schema/p"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  8. <bean id="user" class="com.lfs.pojo.User" p:name="blue" p:age="18"/>
  9. </beans>

加配置–测试:

test:

  1. public class MyTest {
  2. public static void main(String[] args) {
  3. ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml");
  4. User user = context.getBean("user", User.class);
  5. System.out.println(user);
  6. }
  7. }

标签C

c标签:通过构造器注入

  1. xmlns:c="http://www.springframework.org/schema/c"
  2. public class User {
  3. private String name;
  4. private int age;
  5. public User() {
  6. }
  7. public User(String name, int age) {
  8. this.name = name;
  9. this.age = age;
  10. }
  11. <bean id="user" class="com.blue.pojo.User" p:name="blue" p:age="18"/>
  12. <bean id="user" class="com.blue.pojo.User" c:age="18" c:name="blue"/>

SpEL

  • Spring提供了对EL表达式的支持,统一属性注入格式
  • 类型:属性值
  • 归属:value属性值
  • 作用:为bean注入属性值
  • 格式:

    1. <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]}
  • 案例:

    1. <bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
    2. <property name="userDao" value="#{userDao}"/>
    3. <property name="bookDao" value="#{bookDao}"/>
    4. <property name="num" value="#{666666666}"/>
    5. <property name="version" value="#{
    6. 'itcast'}"/>
    7. </bean>

properties文件加载

  • Spring提供了读取外部properties文件的机制,使用读取到的数据为bean的属性赋值
  • 操作步骤

    1.准备外部properties文件

    2.开启context命名空间支持

    1. xmlns:context="http://www.springframework.org/schema/context"

3.加载指定的properties文件

  1. <context:property-placeholder location="classpath:filename.properties">

4.使用加载的数据

  1. <property name="propertyName" value="${propertiesName}"/>
  • 注意:如果需要加载所有的properties文件,可以使用*.properties表示加载所有的properties文件
  • 注意:读取数据使用**${propertiesName}格式进行,其中propertiesName**指properties文件中的属性名

    <?xml version=”1.0” encoding=”UTF-8”?>























团队开发

  • 名称:import
  • 类型:标签
  • 归属:beans标签
  • 作用:在当前配置文件中导入其他配置文件中的项
  • 格式:

    1. <beans>
    2. <import />
    3. </beans>
  • 基本属性:

    1. <import resource=“config.xml"/>

resource:加载的配置文件名

  • Spring容器加载多个配置文件

    1. new ClassPathXmlApplicationContext("config1.xml","config2.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

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

第三方资源配置—>Druid

  • 阿里数据源方案Druid

    1. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    2. <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    3. <property name="url" value="jdbc:mysql://localhost:3306/spring_ioc"></property>
    4. <property name="username" value="root"></property>
    5. <property name="password" value="root"></property>
    6. </bean>

发表评论

表情:
评论列表 (有 0 条评论,138人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringDI(依赖注入)

    依赖注入(DI)是一个过程,在这个过程中,对象仅通过构造函数参数、工厂方法的参数或在对象被实例化后通过属性设置来定义它们的依赖项(即与该对象一起工作的其他对象)。然后,容器在创

    相关 Spring---DI依赖注入

    上一篇介绍了关于IOC的内容:IOC称为控制反转,简单来说就是讲对象的创建的权利以及对象的生命周期的管理过程交给Spring容器来管理,从此在开发的过程中不需要关注对象的创建以

    相关 Spring依赖注入DI

    开头语:本文是我整理网上各种资料后整合而成的一篇文章。文中涉及到了代码重构、面向接口编程、持久化和工厂设计模式的内容。 1. Spring是什么?