Java开发学习----DI依赖注入之自动装配与集合注入

一、自动配置

1.1 依赖自动装配
  • IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
1.2 自动装配方式
  • 按类型(常用)

  • 按名称

  • 按构造方法

  • 不启用自动装配

1.3 环境准备
  • 创建一个Maven项目

  • pom.xml添加依赖

  • resources下添加spring的配置文件

最终项目的结构如下:

[图片上传失败…(image-51aec0-1657012771748)]

(1)项目中添加BookDao、BookDaoImpl、BookService和BookServiceImpl类

public interface BookDao {
    public void save();
}

public class BookDaoImpl implements BookDao {

    private String databaseName;
    private int connectionNum;

    public void save() {
        System.out.println("book dao save ...");
    }
}
public interface BookService {
    public void save();
}

public class BookServiceImpl implements BookService{
    private BookDao bookDao;

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}

(2)resources下提供spring的配置文件

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


    
    
        
    

(3)编写AppForAutoware运行类,加载Spring的IOC容器,并从中获取对应的bean对象

public class AppForAutoware {
    public static void main( String[] args ) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();
    }
}
1.4 完成自动装配的配置

接下来,在上面这个环境中来完成 自动装配 :

自动装配只需要修改applicationContext.xml配置文件即可:

(1)将 <property> 标签删除

(2)在 <bean> 标签中添加autowire属性

首先来实现按照类型注入的配置

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


    
    
 
 
    

注意事项:

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

  • 被注入的对象必须要被Spring的IOC容器管理

  • 按照类型在Spring的IOC容器中如果找到多个对象,会报 NoUniqueBeanDefinitionException

一个类型在IOC中有多个对象,还想要注入成功,这个时候就需要按照名称注入,配置方式为:

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


    
    
 
 
    

注意事项:

  • 按照名称注入中的名称指的是什么?

    [图片上传失败…(image-f1fd54-1657012771747)]

    • bookDao是private修饰的,外部类无法直接方法

    • 外部类只能通过属性的set方法进行访问

    • 对外部类来说,setBookDao方法名,去掉set后首字母小写是其属性名

      • 为什么是去掉set首字母小写?

      • 这个规则是set方法生成的默认规则,set方法的生成是把属性名首字母大写前面加set形成的方法名

    • 所以按照名称注入,其实是和对应的set方法有关,但是如果按照标准起名称,属性名和set对应的名是一致的

  • 如果按照名称去找对应的bean对象,找不到则注入Null

  • 当某一个类型在IOC容器中有多个对象,按照名称注入只找其指定名称对应的bean对象,不会报错

两种方式介绍完后,以后用的更多的是 按照类型 注入。

最后对于依赖注入,需要注意一些其他的配置特征:

  1. 自动装配用于引用类型依赖注入,不能对简单类型进行操作

  2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用

  3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用

  4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

二、集合注入

上一篇博客我们已经能完成引入数据类型和简单数据类型的注入,但是还有一种数据类型 集合 ,集合中既可以装简单数据类型也可以装引用数据类型,对于集合,在Spring中该如何注入呢?

常见的集合类型有如下几种

  • 数组

  • List

  • Set

  • Map

  • Properties

针对不同的集合类型,该如何实现注入呢?

2.1 环境准备
  • 创建一个Maven项目

  • pom.xml添加依赖

  • resources下添加spring的配置文件applicationContext.xml

最终项目的结构如下:

[图片上传失败…(image-4ec417-1657012771748)]

(1)项目中添加添加BookDao、BookDaoImpl类

public interface BookDao {
    public void save();
}

public class BookDaoImpl implements BookDao {

public class BookDaoImpl implements BookDao {

    private int[] array;

    private List list;

    private Set set;

    private Map

(2)resources下提供spring的配置文件,applicationContext.xml

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


    

(3)编写AppForDICollection运行类,加载Spring的IOC容器,并从中获取对应的bean对象

public class AppForDICollection {
    public static void main( String[] args ) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
    }
}

接下来,在上面这个环境中来完成 集合注入 :

下面的所以配置方式,都是在bookDao的bean标签中使用 进行注入

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


    

    
2.2 注入数组类型
    
        100
        200
        300
    
2.3 注入List类型
    
        itcast
        itheima
        boxuegu
        chuanzhihui
    
2.4 注入Set类型
    
        itcast
        itheima
        boxuegu
        boxuegu
    
2.5 注入Map类型
    
        
        
        
    
2.6 注入Properties类型
    
        china
        henan
        kaifeng
    

说明:

  • property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写 <array><list><set><map><props> 标签

  • List的底层也是通过数组实现的,所以 <list><array> 标签是可以混用

  • 集合中要添加引用类型,只需要把 <value> 标签改成 <ref> 标签,这种方式用的比较少

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值