详解Spring Bean的集合注入和自动装配

作者:倔强的牛角 时间:2023-02-18 15:02:58 

一、Spring Bean 集合注入

在【Spring学习笔记(三)】已经讲了怎么注入基本数据类型和引用数据类型,接下来介绍如何注入比较特殊的数据类型——集合

集合常用标签

集合注入,用法也很简单,只需要在 Bean 标签下的 <property><constructor-arg>元素中添加以下集合的标签,再通过value或者ref进行属性注入

标签说明
<list>用于注入 list 集合,允许重复
<set>用于注入 set集合,不允许重复
<map>用于注入 key-value 的map集合, key 和 value 可以是任意类型
<props>用于注入 key-value 的properties集合,key 和 value 必须是是字符串类型

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

案例

1.创建一个Collection类和Dept类,代码如下

/*Collection类*/
public class Collection {
   //1.数组
   private int[] array;
   //2.list集合
   private List<Dept> list;
   //3。set集合
   private Set<Dept> set;
   //4.map集合
   private Map<String, String> map;
   //5.properties集合
   private Properties properties;
   //打印各个集合
   public void fmt() {
       System.out.println("打印array:" + Arrays.toString(array));
       System.out.println("打印List:" + list);
       System.out.println("打印Set:" + set);
       System.out.println("打印Map:" + map);
       System.out.println("打印Properties:" + properties);
   }
   -----省略setter方法-----    
}
/*Dept类*/
public class Dept {
   //部门编号
   private int deptNo;
   //部门名称
   private String deptName;
   @Override
   public String toString() {
       return "Dept{" +
           "deptNo=" + deptNo +
           ", deptName='" + deptName + '\'' +
           '}';
   }
   -----省略setter方法-----
}

2.编写spring配置文件

<!--部门类属性注入-->
<bean id="dept" class="com.bighorn.pojo.Dept">
   <property name="deptNo" value="1"/>
   <property name="deptName" value="后端组"/>
</bean>

<!--Collection类属性注入-->
<bean id="collection" class="com.bighorn.pojo.Collection">
   <!--数组类型-->
   <property name="array">
       <array>
           <value>114514</value>
           <value>114514</value>
           <value>114514</value>
       </array>
   </property>
   <!--List 类型-->
   <property name="list">
       <list>
           <ref bean="dept"/>
           <ref bean="dept"/>
           <ref bean="dept"/>
       </list>
   </property>
   <!--Set 类型-->
   <property name="set">
       <set>
           <ref bean="dept"/>
           <ref bean="dept"/>
           <ref bean="dept"/>
       </set>
   </property>
   <!--Map 类型-->
   <property name="map">
       <map>
           <entry key="name" value="bighorn"/>
           <entry key="age" value="18"/>
           <entry key="sex" value="man"/>
       </map>
   </property>
   <!--Properties 类型-->
   <property name="properties">
       <props>
           <prop key="username">root</prop>
           <prop key="password">123456</prop>
       </props>
   </property>
</bean>

3.编写运行程序

public static void main(String[] args) {
   //获取IoC容器
   ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
   //从容器中获取对象
   Collection collection = context.getBean("collection", Collection.class);
   //调用方法打印各个集合
   collection.fmt();
}

运行结果如下

详解Spring Bean的集合注入和自动装配

二、Spring Bean自动装配

Spring 在 Bean 与 Bean 之间建立依赖关系的行为称为 &ldquo;装配&rdquo;

Spring Bean 属性注入 前面学习了,在 spring配置文件中通过 <constructor-arg><property> 中的 ref 属性,手动维护 Bean 与 Bean 之间的依赖关系的,即手动装配

手动装配图

详解Spring Bean的集合注入和自动装配

什么是自动装配

如果容器中Bean很多,依赖关系又非常复杂,此时手动装配就略显吃力且繁琐了,所以Spring 框架为我们提供了 &ldquo;自动装配&rdquo; 功能,提高开发效率。

Spring 自动装配:Spring IoC容器根据自动装配方式,为指定的 Bean 从应用上下文(AppplicationContext 容器)自动查找并自动注入它所依赖的 Bean。

自动装配的方式

Spring 默认不支持自动装配的。使用自动装配,则需要对 Spring XML 配置文件中 <bean> 元素的 autowire 属性进行设置,此时就不需要ref属性了。

属性值说明
byName按名称自动装配。 Bean 的 id 或 name 属性值与这个对象属性的名称相同
byType按类型自动装配。 Bean 的 class 属性值与这个对象属性的类型相匹配
constructor按构造器参数自动装配。
default默认采用上一级元素 <beans> 设置的自动装配方式(default-autowire)进行装配。
no默认值,表示不使用自动装配。

案例

1.创建员工类Employee和部门类Dept,添加各个成员变量的setter方法

/*员工类Employee*/
public class Employee {
   //员工编号
   private String empNo;
   //员工姓名
   private String empName;
   //部门信息
   private Dept dept;
   //各个属性的setter方法
   public void setEmpNo(int empNo) {
       this.empNo = empNo;
   }
   public void setEmpName(String empName) {
       this.empName = empName;
   }
   public void setDept(Dept dept) {
       this.dept = dept;
   }
   ----省略toString方法------  
}

/*部门类Dept*/
public class Dept {
   //部门编号
   private String deptNo;
   //部门名称
   private String deptName;
   //各个属性的setter方法
   public void setDeptNo(int deptNo) {
       this.deptNo = deptNo;
   }
   public void setDeptName(String deptName) {
       this.deptName = deptName;
   }
   ----省略toString方法------
}

2.编写spring配置文件

<!--部门类属性注入-->
<bean id="dept" class="com.bighorn.pojo.Dept">
   <property name="deptNo" value="2"/>
   <property name="deptName" value="前端组"/>
</bean>
<!--员工类属性注入-->
<bean id="employee" class="com.bighorn.pojo.Employee" autowire="byType">
   <property name="empNo" value="114514"/>
   <property name="empName" value="lzh"/>
</bean>

3.编写运行程序

public static void main(String[] args) {
   //获取IoC容器
   ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
   //从容器中获取对象
   Employee employee = context.getBean("employee", Employee.class);
   System.out.println(employee);
}

结果如下图

详解Spring Bean的集合注入和自动装配

注意点

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

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

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

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

来源:https://juejin.cn/post/7103901326894972941

标签:Spring,Bean,集合注入,自动装配
0
投稿

猜你喜欢

  • java中Servlet程序下载文件实例详解

    2022-04-28 18:26:10
  • 浅谈java的byte数组的不同写法

    2023-03-10 07:53:12
  • Mybatis日志参数快速替换占位符工具的详细步骤

    2023-09-30 21:29:36
  • SpringBoot2.0整合SpringCloud Finchley @hystrixcommand注解找不到解决方案

    2021-08-26 12:54:32
  • AndroidStudio实现微信界面设计

    2022-09-16 22:45:40
  • Java反射机制及Method.invoke详解

    2023-11-22 17:25:28
  • Springboot启动流程详细分析

    2023-11-29 00:23:10
  • java io文件操作删除文件或文件夹的7种方法

    2022-08-09 13:29:21
  • Java%(取模运算)全面讲解

    2022-03-02 06:11:34
  • Android 获得屏幕宽高的三种方式

    2023-03-29 00:26:51
  • C#通过链表实现队列的方法

    2023-06-19 15:14:17
  • 详解Jvm中时区设置方式

    2023-12-09 02:59:19
  • 浅谈springboot之JoinPoint的getSignature方法

    2022-12-25 11:23:20
  • 使用Java 实现一个“你画手机猜”的小游戏

    2021-06-03 19:19:27
  • 老生常谈Java 网络编程 —— Socket 详解

    2023-07-12 16:32:54
  • springmvc实现json交互-requestBody和responseBody

    2023-02-26 17:10:45
  • Spring实现一个简单的SpringIOC容器

    2023-02-06 21:03:43
  • Spring Boot配置Thymeleaf(gradle)的简单使用

    2023-04-18 07:41:42
  • java8 Stream大数据量List分批处理切割方式

    2023-02-10 22:34:36
  • Java实现文件切割拼接的实现代码

    2022-04-15 08:10:03
  • asp之家 软件编程 m.aspxhome.com