• 依赖注入(DI),自动配置,集合注入


    向一个类中传入数据有两种方式,普通方法(set),构造器。

    DI是描述容器中bean与bean之间依赖关系的过程,bean运行需要的数据有两种类型:引用类型,简单类型

    Spring提供两种注入方式

    setter注入

    构造器注入

    两种注入方式又因为注入数据不同分为两种,简单类型数据,引用类型数据

    就是运行类不需要自己声明对象,在容器中寻找到bean提取出来,注入到运行类中,减少耦合

    setter注入

    首先在在对象中注入对象类型

    声明对象属性

    在对象中生成对象的setter方法

    在配置文件中添加配置

    以上是引用类型的注入

    简单数据类型的注入怎么实现

    1.声明简单类型的属性,并提供相应的setter方法

    2.配置文件添加配置

    添加property标签,注意简单类型的路径换成value了,和引用类型的ref不同

    对于setter注入方式的基本使用就已经介绍完了,

    对于引用数据类型使用的是

    <property name="" ref=""/>

    对于简单数据类型使用的是

    <property name="" value=""/>

    构造器注入

    1.删除setter方法并提供带有参数的构造方法(constructor)(多个参数时也可以)

    2.配置文件中配置构造器注入

    constructor-arg标签对应了构造器方法的名称constructor

    name表示构造器中形参的值,必须保持一致

    ref表示容器中对应的其他bean的值

    以上是引用类型的注入,简单类型数据怎么注入呢

    1.声明简单数据,并生成带有参数的构造器

    2.配置完成多个属性构造器注入 

    反思:若是构造器中参数名发生变化,配置文件中的name值也要发生变化,这是一个耦合,如何消除

    方式一:删除name属性,添加type属性,按照类型注入

    方式二:删除type属性,添加index属性,按照索引下标注入,下标从0开始 

     ​​​​

    自动配置(重点在setter方法)

    自动配置,顾名思义就是将注入时在配置文件中的自动完成,不需要手动配置注入相关语句

    IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配

    1.将配置文件中的property标签删除,添加autowire属性

    一般选择按类型自动装配 

    2.需要注入属性的类中的对应属性的setter方法不能省略

    3.被注入的对象必须被Spring的IoC容器管理

    当实现类的bean对象被获取后,在bean对象中的属性有setter方法的会被自动装配,此时会按照实现类的setter方法提供的数据类型去Spring的IoC容器中寻找被注入的对象,寻找类型主要看bean的class属性,因为class对应数据的类型

    4.按照类型在Spring的IoC容器中如果找到多个对象,会报错NoUniqueBeanDefinitionException

    存在两个bean的class一致,那么按照类型寻找的被注入对象就会存在多个,此时就会报错

    怎么解决同一类型的不确定bean造成的报错呢

    使用byName装配

    注意此时寻找被注入对象仍然是按照setter方法提供的数据来实现的 

    按照类型注入使用的次数更多一点

    集合注入

    集合中既可以装简单数据类型也可以装引用数据类型,对于集合,在Spring中该如何注入呢?

    常见的集合类型:数组,List,Set,Map,Properties

    使用setter注入方式

    修改实现类的属性和set方法

    1. public class BookDaoImpl implements BookDao {
    2. private int[] array;
    3. private List<String> list;
    4. private Set<String> set;
    5. private Map<String,String> map;
    6. private Properties properties;
    7. public void setArray(int[] array) {
    8. this.array = array;
    9. }
    10. public void setList(List<String> list) {
    11. this.list = list;
    12. }
    13. public void setSet(Set<String> set) {
    14. this.set = set;
    15. }
    16. public void setMap(Map<String, String> map) {
    17. this.map = map;
    18. }
    19. public void setProperties(Properties properties) {
    20. this.properties = properties;
    21. }
    22. public void save() {
    23. System.out.println("book dao save ...");
    24. System.out.println("遍历数组:" + Arrays.toString(array));
    25. System.out.println("遍历List" + list);
    26. System.out.println("遍历Set" + set);
    27. System.out.println("遍历Map" + map);
    28. System.out.println("遍历Properties" + properties);
    29. }
    30. }

    修改配置文件

     

  • 相关阅读:
    【数据库数据恢复】EXT3文件系统ORACLE数据库误删除的数据恢复
    开源转闭源后,法院判定:分支使用“100%开源”是虚假宣传
    977. 有序数组的平方
    Sentinel实现服务降级并与api解耦
    自用版:客服话术大全
    go-zero微服务实战系列(三、API定义和表结构设计)
    [HNCTF 2022 WEEK2]ez_ssrf题目解析
    【Java基础】HashMap扩容 | CopyOnWriteArrayList 的底层原理 | 字节码 | Java 异常体系
    【ADB】蓝牙总结
    精通Nginx(10)-负载均衡
  • 原文地址:https://blog.csdn.net/cvpatient/article/details/125911045