一、自动配置

上一篇博客花了大量的时间把Spring的注入去学习了下,总结起来就两个字麻烦。麻烦在配置文件的编写配置上。那有更简单方式么?有,自动配置

1.1 依赖自动装配

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

1.2 自动装配方式

  • 按类型(常用)

  • 按名称

  • 按构造方法

  • 不启用自动装配

1.3 环境准备

  • 创建一个Maven项目

  • pom.xml添加依赖

  • resources下添加spring的配置文件

最终项目的结构如下:

(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"?>
<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 id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
   <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
       <property name="bookDao" ref="bookDao"/>
   </bean>
</beans>

(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"?>
<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 class="com.itheima.dao.impl.BookDaoImpl"/>
   <!--autowire属性:开启自动装配,通常使用按类型装配-->
   <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>

</beans>

注意事项:

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

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

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

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

<?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 class="com.itheima.dao.impl.BookDaoImpl"/>
   <!--autowire属性:开启自动装配,通常使用按类型装配-->
   <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byName"/>

</beans>

注意事项:

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

    • 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

最终项目的结构如下:

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

public interface BookDao {
   public void save();
}

public class BookDaoImpl implements BookDao {
   
public class BookDaoImpl implements BookDao {

   private int[] array;

   private List<String> list;

   private Set<String> set;

   private Map<String,String> map;

   private Properties properties;

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

       System.out.println("遍历数组:" + Arrays.toString(array));

       System.out.println("遍历List" + list);

       System.out.println("遍历Set" + set);

       System.out.println("遍历Map" + map);

       System.out.println("遍历Properties" + properties);
  }
//setter....方法省略,自己使用工具生成
}

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

<?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 id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
</beans>

(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标签中使用<property>进行注入

<?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 id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
       
   </bean>
</beans>

2.2 注入数组类型

<property name="array">
   <array>
       <value>100</value>
       <value>200</value>
       <value>300</value>
   </array>
</property>

2.3 注入List类型

<property name="list">
   <list>
       <value>itcast</value>
       <value>itheima</value>
       <value>boxuegu</value>
       <value>chuanzhihui</value>
   </list>
</property>

2.4 注入Set类型

<property name="set">
   <set>
       <value>itcast</value>
       <value>itheima</value>
       <value>boxuegu</value>
       <value>boxuegu</value>
   </set>
</property>

2.5 注入Map类型

<property name="map">
   <map>
       <entry key="country" value="china"/>
       <entry key="province" value="henan"/>
       <entry key="city" value="kaifeng"/>
   </map>
</property>

2.6 注入Properties类型

<property name="properties">
   <props>
       <prop key="country">china</prop>
       <prop key="province">henan</prop>
       <prop key="city">kaifeng</prop>
   </props>
</property>

配置完成后,运行下看结果:

说明:

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

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

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

Java开发学习(七)----DI依赖注入之自动装配与集合注入的更多相关文章

  1. Java开发学习(六)----DI依赖注入之setter及构造器注入解析

    一.DI依赖注入 首先来介绍下Spring中有哪些注入方式? 我们先来思考 向一个类中传递数据的方式有几种? 普通方法(set方法) 构造方法 依赖注入描述了在容器中建立bean与bean之间的依赖关 ...

  2. Spring学习七----------Bean的配置之自动装配

    © 版权声明:本文为博主原创文章,转载请注明出处 Bean的自动装配(Autowiring) no:不启用自动装配,此时需要手动注入.参考:Spring学习三----------注入方式 defaul ...

  3. Java开发学习心得(一):SSM环境搭建

    目录 Java开发学习心得(一):SSM环境搭建 1 SSM框架 1.1 Spring Framework 1.2 Spring MVC Java开发学习心得(一):SSM环境搭建 有一点.NET的开 ...

  4. Java开发学习(二十五)----使用PostMan完成不同类型参数传递

    一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...

  5. Java开发学习(二十六)----SpringMVC返回响应结果

    SpringMVC接收到请求和数据后,进行了一些处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎样,处理完以后,都需要将结果告知给用户. 比如:根据用户ID查 ...

  6. Java开发学习(三十六)----SpringBoot三种配置文件解析

    一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...

  7. Java开发学习(四十一)----MyBatisPlus标准数据层(增删查改分页)开发

    一.标准CRUD使用 对于标准的CRUD功能都有哪些以及MyBatisPlus都提供了哪些方法可以使用呢? 我们先来看张图: 1.1 环境准备 这里用的环境就是Java开发学习(四十)----MyBa ...

  8. Java开发学习心得(二):Mybatis和Url路由

    目录 Java开发学习心得(二):Mybatis和Url路由 1.3 Mybatis 2 URL路由 2.1 @RequestMapping 2.2 @PathVariable 2.3 不同的请求类型 ...

  9. 我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法

    本文参考: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html http://www.blogjava.net/ ...

随机推荐

  1. 计算机系统6-> 计组与体系结构3 | MIPS指令集(中)| MIPS汇编指令与机器表示

    上一篇计算机系统5-> 计组与体系结构2 | MIPS指令集(上)| 指令系统从顶层讲解了一个指令集 / 指令系统应当具备哪些特征和工作原理.这一篇就聚焦MIPS指令集(MIPS32),看看其汇 ...

  2. Vue Router的简单了解

    Vue Router Vue Router官方文档 传统Web项目开发往往采用超链接实现页面之间的切换和跳转.Vue开发的是单页面应用(Single Page Application,SPA),不能使 ...

  3. Nginx下载文件指定文件名称

    配置 location ^~/TEMP/ { alias/share/files/; if ($request_uri ~* ^.*\/(.*)\.(txt|doc|pdf|rar|gz|zip|do ...

  4. MATLAB地图工具箱学习心得(二)设计可变参数和位置拾取的“放大镜”式投影程序

    最近刚好因为一些原因整理这方面的内容,所以还是把这篇鸽了一年多的博客顺手写出来了∠( ᐛ 」∠)_.因为是当时课程设计的一部分,程序上难免会有一些不足和bug,在这里将设计的思路分享给大家. 本篇博客 ...

  5. XCTF练习题---MISC---Banmabanma

    XCTF练习题---MISC---Banmabanma flag:flag{TENSHINE} 解题步骤: 1.观察题目,打开附件 2.发现是一张斑马图片,这是典型的条形码啊,直接开网站识别 网站:h ...

  6. [题解] [AGC024F] Simple Subsequence Problem

    题目大意 有一个 01 串集合 \(S\),其中每个串的长度都不超过 \(N\),你要求出 \(S\) 中至少是 \(K\) 个串的子序列的最长串,如果有多解,输出字典序最小的那组解. 由于 \(S\ ...

  7. 命令工具 -(1)Vim 文本编辑器学习

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 前言 提起 Linux,大家都听说过这句话:Linux 一切皆文件. 配置一个服务就是在修改它 ...

  8. 看 AWS 如何通过 Nitro System 构建竞争优势

    目录 目录 目录 前言 Amazon Nitro System Overview AWS EC2 的虚拟化技术演进之路 Nitro Hypervisor Nitro Cards Nitro Contr ...

  9. 三大特性,多个场景,Serverless 应用引擎 SAE 全面升级

    作者:营火 微服务能力大提升,更新增 Job.PHP 等场景,延展 Serverless 新边界 点击此处,获得阿里云 SAE 发布会直播 PPT! 企业的数字化随着互联网的普及发展越来越快,技术架构 ...

  10. python 通过线上API查询ip归属地

    API为国外API,频率限制1分钟45个ip 脚本如下 1 #!/usr/bin/env python3 2 #-*-coding:utf-8-*- 3 4 import requests,re,js ...