一、自动配置

上一篇博客花了大量的时间把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. .NET宝藏API之:IHostedService,后台任务执行

    我们在项目开发的过程中可能会遇到类似后台定时任务的需求,比如消息队列的消费者. 按照.NetF时的开发习惯首先想到的肯定是Windows Service,拜托,都什么年代了还用Windows服务(小声 ...

  2. Python常用数据结构-字典——2.1 字典方法 keys()

    python字典常用方法: keys()               #  获取所有的键 values()            #  获取所有的值 items()              #  获 ...

  3. 劳动节快乐!手写个核心价值观编码工具 - Python实现

    前言 今天是五一劳动节,祝各位无产阶级劳动者节日快乐! 然后来整活分享一些有趣的东西~ 这个小工具是我大学时做着玩的,对于各位接班人来说,12个词的核心价值观这东西,大家都非常熟悉了,这工具可以实现将 ...

  4. Centos 7.4_64位系统安装指南

    小土豆Linux学习随笔 -- 清听凌雪慕忆 目录 1. 范围 1.1标识 1.2 文档概述 2. 安装环境 3. 安装步骤 4. 注意事项 1. 范围 1.1标识 CentOS 7.4 64位系统安 ...

  5. PHP代码审计之SQL注入

    代码审计之SQL注入 SQL注入攻击(SQLInjection),是攻击者在表单中提交精心构造的sql语句,改变原来的sql语句,如果web程序没有对提交的数据经过检查,那么就会造成sql注入攻击. ...

  6. 虚拟 DOM 与 DOM Diff

    虚拟 DOM 与 DOM Diff 本文写于 2020 年 9 月 12 日 虚拟 DOM 在今天已经是前端离不开的东西了,因为他的好处实在是太多了. 在<高性能 JavaScript>一 ...

  7. 什么是Docker容器?(全面了解使用)

    一:为什么需要Docker容器? 1.引入 1.1麻烦的环境部署 1.在软件开发中,最麻烦的事情之一就是环境配置.在正常情况下,如果要保证程序能运行,我们需要设置好操作系统,以及各种库和组件的安装. ...

  8. Redis集群高频问答,连夜肝出来了

    Redis 集群方案 Redis集群方案应该怎么做?都有哪些方案?  使用codis方案:目前用的多的集群方案,基本和twemproxy一致的效果,但它支持在节点数量改变情况下,旧节点数据可恢复到新h ...

  9. 好客租房56-props深入(3props校验-约束规则)

    1常见类型:Array,bool,func,number,object,string 2React:element 3必填项:isRequred 4特定结构的想:shape({}) //导入react ...

  10. 面试官:BIO、NIO、AIO是什么,他们有什么区别?

    哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 书接上回,感觉上次的公司氛围不 ...