Spring DI依赖注入

﹏ヽ暗。殇╰゛Y 2023-10-11 09:44 142阅读 0赞

一、依赖注入介绍

  1. spring动态的向某个对象提供它所需要的其他对象。这一点是通过DIDependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉springA中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。

  简单来说什么是依赖注入,就是给属性赋值(包括基本数据类型和引用数据类型)。

二、依赖注入的方式

(1)构造器注入

  1. 过将@Autowired注解放在构造器上来完成构造器注入,默认构造器参数通过类型自动装配.
  2. <bean id="accountService" class="com.buba.service.impl.AccountServiceImpl">
  3. <constructor-arg name="name" value="mys"></constructor-arg>
  4. <constructor-arg name="age" value="21"></constructor-arg>
  5. <constructor-arg name="time" ref="now"></constructor-arg>
  6. </bean>
  7. @Service
  8. public class BookServiceImpl implements BookService{
  9. private BookMapper bookMapper;
  10. @Autowired
  11. public BookServiceImpl(BookMapper bookMapper) {
  12. this.bookMapper=bookMapper;
  13. }
  14. }
  15. 构造器注入的方式,能够保证注入的组件不可变,并且确保需要的依赖不为空。此外,构造器注入的依赖总是能够在返回客户端(组件)代码的时候保证完全初始化的状态。

2.接口注入

  1. @Service
  2. public class BookServiceImpl implements BookService{
  3. @Autowired
  4. private BookMapper bookMapper;
  5. }

3.setter注入

  1. 通过<property>标签
  2. <bean id="book" class="com.buba.pojo.Book"
  3. init-method="myInit" destroy-method="myDestroy" scope="singleton">
  4. <property name="bid" value="1"></property>
  5. <property name="bname" value="冰菓"></property>
  6. </bean>
  7. @Service
  8. public class BookServiceImpl implements BookService{
  9. private BookMapper bookMapper;
  10. @Autowired
  11. public void setBookMapper(BookMapper bookMapper) {
  12. this.bookMapper = bookMapper;
  13. }
  14. public BookMapper getBookMapper() {
  15. return bookMapper;
  16. }
  17. }

setter的方式能用让类在之后重新配置或者重新注入。

三、Spring向对象属性注入集合类型

  1. 创建一个实体类对象,用于演示数组、集合、Properties注入方式。
  2. package com.buba.pojo;
  3. import lombok.Data;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.Properties;
  7. import java.util.Set;
  8. @Data
  9. public class Book {
  10. private String[] array;
  11. private List<String> list;
  12. private Set<String> set;
  13. private Map<String,Object> map;
  14. private Properties properties;
  15. }
  16. applicationContext.xml配置如下。
  17. <?xml version="1.0" encoding="UTF-8"?>
  18. <beans xmlns="http://www.springframework.org/schema/beans"
  19. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  20. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  21. <bean id="book" class="com.buba.pojo.Book">
  22. <property name="array">
  23. <array>
  24. <value>平凡的世界</value>
  25. <value>三体</value>
  26. </array>
  27. </property>
  28. <property name="list">
  29. <list>
  30. <value>简爱</value>
  31. <value>活着</value>
  32. </list>
  33. </property>
  34. <property name="set">
  35. <set>
  36. <value>呐喊</value>
  37. <value>百年孤独</value>
  38. </set>
  39. </property>
  40. <property name="map">
  41. <map>
  42. <entry key="1" value="老人与海"></entry>
  43. <entry key="2" value="挪威的森林"></entry>
  44. </map>
  45. </property>
  46. <property name="properties">
  47. <props>
  48. <prop key="driver">com.mysql.cj.jdbc.Driver</prop>
  49. <prop key="url">jdbc:mysql://localhost:3306/test</prop>
  50. <prop key="username">root</prop>
  51. <prop key="password">root</prop>
  52. </props>
  53. </property>
  54. </bean>
  55. </beans>
  56. 执行测试:
  57. package com.buba;
  58. import com.buba.pojo.Book;
  59. import org.springframework.context.support.ClassPathXmlApplicationContext;
  60. public class Test {
  61. @org.junit.Test
  62. public void test(){
  63. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  64. Book book = context.getBean(Book.class);
  65. System.out.println(book);
  66. }
  67. }

四、自动装配

(1)@Autowired

  1. @Autowired的自动装配,默认是根据类型注入,可以用于构造器、接口、方法注入。且必须有一个Bean候选者注入,默认required=true,如果允许出现0Bean候选者需要设置属性“required=false”,“required”属性含义和@Required一样,只是@Required只适用于基于XML配置的setter注入方式,只能打在setting方法上。可以通过@Qualifier("名称")注解来指定名称装配

(2)@Resource

  1. @Resource注解可以标注在字段或属性的setter方法上,但它默认按名称装配。名称可以通过@Resourcename属性指定,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。

如果本文对您有很大的帮助,还请点赞关注一下。

发表评论

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

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

相关阅读

    相关 SpringDI(依赖注入)

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

    相关 DI依赖注入

    在DI(依赖注入)中,能注入的数据是有三种类型的: 1、基本类型和String 2、其他bean类型(在配置文件中或者注解配置过的bean对象) 3、复杂类型/集

    相关 Spring---DI依赖注入

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

    相关 Spring依赖注入DI

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