本文主要讲解Spring开发中三种不同的注入方式,以及集合数据类型的注入,仅供学习分享使用,如有不足之处,还请指正。

概述

Spring的注入方式一共有三种,如下所示:

  1. 通过set属性进行注入,即通过属性的geter,seter方法进入,如果没有对应的方法,就会报错。
  2. 通过构造函数进行注入,通过类的构造函数进行注入,如果参数个数和构造函数对应不上,也会跑异常。
  3. 通过p标签进行注入,通过引入p标签的方式进行注入。

前提准备

首先有一个Teacher类和Course类,课程需要有对应的教课老师,两个类代码如下:

Teacher类

 package com.hex.first;

 /**
* 老师类
* @author Administrator
*
*/
public class Teacher { /**
* 姓名
*/
private String teacherName=""; /**
* 年龄
*/
private int teacherAge=0; public String getTeacherName() {
return teacherName;
} public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
} public int getTeacherAge() {
return teacherAge;
} public void setTeacherAge(int teacherAge) {
this.teacherAge = teacherAge;
} /**
* 教师信息
*/
@Override
public String toString() {
return "Teacher [teacherName=" + teacherName + ", teacherAge=" + teacherAge + "]";
} /**
* 构造函数
*/
public Teacher() {
super();
// TODO Auto-generated constructor stub
} /**
* 构造函数
* @param teacherName
* @param teacherAge
*/
public Teacher(String teacherName, int teacherAge) {
this.teacherName = teacherName;
this.teacherAge = teacherAge;
} }

Course类

 package com.hex.first;

 /**
* 课程
* @author Administrator
*
*/
public class Course { /**
* 课程名
*/
private String courseName=""; /**
* 课时长
*/
private int courseHour=0; /**
* 课程老师
*/
private Teacher teacher; public String getCourseName() {
return courseName;
} public void setCourseName(String courseName) {
this.courseName = courseName;
} public int getCourseHour() {
return courseHour;
}
public void setCourseHour(int courseHour) {
this.courseHour = courseHour;
} public Teacher getTeacher() {
return teacher;
} public void setTeacher(Teacher teacher) {
this.teacher = teacher;
} /**
* 构造函数
*/
public Course() {
super();
// TODO Auto-generated constructor stub
} /**
* 构造函数
* @param courseName
* @param courseHour
*/
public Course(String courseName, int courseHour) {
this.courseName = courseName;
this.courseHour = courseHour;
} /**
* 三个参数的构造函数
* @param courseName
* @param courseHour
* @param teacher
*/
public Course(String courseName, int courseHour, Teacher teacher) {
this.courseName = courseName;
this.courseHour = courseHour;
this.teacher = teacher;
} /**
* 重写toString()方法
*/
@Override
public String toString() {
return "Course [courseName=" + courseName + ", courseHour=" + courseHour + ",teacher="+teacher+"]";
} }

通过属性的方式进行注入

在applicatonContext.xml中配置如下:

 <!-- 第1种: 通过set 方法进行赋值,属性必须有对应的set+属性名,第一个字母大写的方法,才可以赋值 -->
<bean id="teacher1" class="com.hex.first.Teacher">
<property name="teacherName" value="hex"></property>
<property name="teacherAge" value="20"></property>
</bean>
<!--
如果是常规的数据类型,采用property name value进行赋值
如果是对象类型,采用property name ref 进行赋值
-->
<bean id="course1" class="com.hex.first.Course">
<property name="courseName" value="Java"></property>
<property name="courseHour" value="120"></property>
<property name="teacher" ref="teacher1"></property>
</bean>

通过构造函数的方式进行注入

如果在采用构造函数的方式进行注入,则必须有对应的构造函数与之对应,在applicatonContext.xml中配置如下:

 <!--第2种: 采用构造函数,进行赋值 -->
<!--
如果构造参数的顺序,和构造函数中的参数顺序是一样的,则name(参数名称),index(参数顺序号),type(参数数据类型)均可以省略
如果不一样,则需要用name,index的其中一个来标识,如果参数的type不同,则也可以用type来区分
-->
<bean id="teacher2" class="com.hex.first.Teacher">
<constructor-arg name="teacherName" value="hex" index="0" type="String"></constructor-arg>
<constructor-arg name="teacherAge" value="22" index="1" type="int"></constructor-arg>
</bean>
<!--
如果是常规的数据类型,采用constructor-arg name value进行赋值
如果是对象类型,采用constructor-arg name ref 进行赋值
-->
<bean id="course2" class="com.hex.first.Course">
<constructor-arg name="courseName" value=".Net C#" index="0" type="String"></constructor-arg>
<constructor-arg name="courseHour" value="110" index="1" type="int"></constructor-arg>
<constructor-arg name="teacher" ref="teacher2" index="2" type="com.hex.first.Teacher"></constructor-arg>
</bean>

采用p标签的方式进行注入

如果需要采用p标签进行注入,则需要引入命名空间,如下所示:

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

配置如下:

 <!-- 第3种:通过P标签实现 ,需要引入命名空间-->
<!--
如果就常规数据类型,采用p:属性名="value"的方式进行赋值
如果是对象数据类型,采用p:属性名-ref=""的方式赋值
-->
<bean id="teacher3" class="com.hex.first.Teacher" p:teacherName="zs" p:teacherAge="21">
</bean>
<bean id="course3" class="com.hex.first.Course" p:courseName="C++" p:courseHour="100" p:teacher-ref="teacher3"> </bean>

以上三种方式,在创建对象时,都是一样的,如下所示:

 //通过Spring进行注入,Spring上下文对象
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//从Spring的IOC容器中获取id为course1的bean对象
Course course1 =(Course) context.getBean("course1");
System.out.println(course1);
//从Spring的IOC容器中获取id为course2的bean对象
Course course2 =(Course) context.getBean("course2");
System.out.println(course2);
//从Spring的IOC容器中获取id为course3的bean对象
Course course3 =(Course) context.getBean("course3");
System.out.println(course3);

集合类型的注入

首先有一个类,属性为集合数据类型,代码如下:

 package com.hex.first;

 import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set; /**
* 测试集合数据类型
* @author Administrator
*
*/
public class TestCollection {
/**
* 数组信息
*/
private String[] arrInfo; /**
* 列表信息
*/
private List<String> lstInfo; /**
* Map信息
*/
private Map<String,String> mapInfo; /**
* Set信息
*/
private Set<String> setInfo; private Properties propInfo; public String[] getArrInfo() {
return arrInfo;
} public void setArrInfo(String[] arrInfo) {
this.arrInfo = arrInfo;
} public List<String> getLstInfo() {
return lstInfo;
} public void setLstInfo(List<String> lstInfo) {
this.lstInfo = lstInfo;
} public Map<String, String> getMapInfo() {
return mapInfo;
} public void setMapInfo(Map<String, String> mapInfo) {
this.mapInfo = mapInfo;
} public Set<String> getSetInfo() {
return setInfo;
} public void setSetInfo(Set<String> setInfo) {
this.setInfo = setInfo;
} public Properties getPropInfo() {
return propInfo;
} public void setPropInfo(Properties propInfo) {
this.propInfo = propInfo;
} @Override
public String toString() {
return "TestCollection [arrInfo=" + Arrays.toString(arrInfo) + ", lstInfo=" + lstInfo + ", mapInfo=" + mapInfo
+ ", setInfo=" + setInfo + ", propInfo=" + propInfo + "]";
} }

通过Spring的配置文件进行注入,这里采用setters属性方式进行注入,如下所示:

 <!-- 集合数据类型 -->
<bean id="test1" class="com.hex.first.TestCollection">
<!-- 数组 -->
<property name="arrInfo">
<array>
<value>篮球</value>
<value>足球</value>
<value>网球</value>
</array>
</property>
<!-- 列表 -->
<property name="lstInfo">
<list>
<value>北京</value>
<value>上海</value>
<value>天津</value>
</list>
</property>
<!-- 键值对,每一个键值对为一个entry,有key,value两个属性 -->
<property name="mapInfo">
<map>
<entry>
<key>
<value>football</value>
</key>
<value>足球</value>
</entry>
<entry>
<key>
<value>basketball</value>
</key>
<value>篮球</value>
</entry>
<entry>
<key>
<value>ping</value>
</key>
<value>乒乓球</value>
</entry>
</map>
</property>
<!-- 数据集 -->
<property name="setInfo">
<set>
<value>AA</value>
<value>BB</value>
<value>CC</value>
</set>
</property>
<!-- props也是一个键值对 -->
<property name="propInfo">
<props>
<prop key="boy">男孩</prop>
<prop key="girl">女孩</prop>
</props>
</property>
</bean>

以上测试信息如下所示:

 十月 13, 2019 9:51:09 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1f17ae12: startup date [Sun Oct 13 21:51:09 CST 2019]; root of context hierarchy
十月 13, 2019 9:51:10 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
Course [courseName=Java, courseHour=120,teacher=Teacher [teacherName=hex, teacherAge=20]]
Course [courseName=.Net C#, courseHour=110,teacher=Teacher [teacherName=hex, teacherAge=22]]
Course [courseName=C++, courseHour=100,teacher=Teacher [teacherName=zs, teacherAge=21]]
TestClass [arrInfo=[篮球, 足球, 网球], lstInfo=[北京, 上海, 天津], mapInfo={football=足球, basketball=篮球, ping=乒乓球}, setInfo=[AA, BB, CC], propInfo={boy=男孩, girl=女孩}]

特殊符号处理

在配置applicationContext.xml实现注入时,如果遇到特殊字符,则需要进行转义,或者进行CDATA封装,如下所示:

如字符串:<Java> ,则需要配置成:

 <bean id="course1" class="com.hex.first.Course">
<property name="courseName" value="&lt;Java&gt;"></property>
<property name="courseHour" value="120"></property>
<property name="teacher" ref="teacher1"></property>
</bean>

或者采用CDATA方式,如下所示:

 <bean id="teacher1" class="com.hex.first.Teacher">
<property name="teacherName">
<value><![CDATA[<hex>]]></value>
</property>
<property name="teacherAge" value="20"></property>
</bean>

把代码在CDATA中不需要转义:解析器会忽略 CDATA 部分中的所有内容

备注

XML中的非法字符如下:

只有千锤百炼,才能成为好钢。

一起学Spring之三种注入方式及集合类型注入的更多相关文章

  1. Spring———bean的创建方式,注入方式,复杂类型注入 概括

    Spring相关概念和类    1.IOC             inverse of control    控制反转   反转了创建对象的方式            以前:new 对象,管理和维护 ...

  2. spring练习,使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打印输出。

    相关 知识 >>> 相关 练习 >>> 实现要求: 使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打印输出.要求如下: ...

  3. Spring学习(八)-----Spring注入值到集合类型的例子

    下面例子向您展示Spring如何注入值到集合类型(List, Set, Map, and Properties). 支持4个主要的集合类型: List – <list/> Set – &l ...

  4. spring集合类型注入

    spring集合类型注入 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUB ...

  5. spring boot-- 三种启动方式

    spring-boot的三种启动方式 1. 直接运行SpringbootApplication.java 2.在项目目录下运行mvn spring-boot:run 3.先编译项目mvn instal ...

  6. Ioc和Aop扩展--多种方式实现依赖注入(构造注入,p命名空间注入,集合类型注入,注入null和注入空值)

    构造注入 语法: <constructor-arg>    <ref bean="bean的id"/> </constructor-arg> 1 ...

  7. 阶段3 2.Spring_04.Spring的常用注解_5 自动按照类型注入

    运行出现了空指针异常 @Autowired 注解出现的位置 AutoWired的代码 常用的就是写类上和方法上. 运行测试,刚才运行是一个空指针异常 也就是通过Autowired 这个accountD ...

  8. spring 2种下载方式 下载地址 download 地址

    spring 在官网只提供 maven 的下载方式,把zip方式的不再提供,两种方法下载: 1.想找回以前版本的spring zip包,如果知道版本号,那么直接在google里输入 ” spring ...

  9. Spring -- 三种配置方式

    1.Explicit configuration in XML:显示的XML配置. 优点: 1)XML配置方式进一步降低了耦合,使得应用更加容易扩展,即使对配置文件进一步修改也不需要工程进行修改和重新 ...

随机推荐

  1. spring cloud 之 -- eureka vs consul,该选择谁?

    0--前言 spring cloud的服务注册中心,该选择谁?在选择前,我们首先需要来了解下分布式的CAP定理: 所谓CAP,是指: Consistency:一致性:就是在分布式系统中的所有数据备份, ...

  2. Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览

    ​ ​本文是Spring Cloud专栏的第一篇文章,了解本篇文章内容有助于更好的理解后面文章 ​ 一.网站架构演变过程 1-1.传统架构 传统的SSH架构,分为三层架构 web控制层.业务逻辑层.数 ...

  3. 并行通信芯片8255A学习总结

    并行通信接口8255A AB口为两个数据端口,C口可以作为数据端口也可以作为状态端口 8255A是一个40引脚的双列直插式芯片 引脚如下 D0-D7:双向数据信号线. RD:读信号线. WR:写信号线 ...

  4. 使用 SecureRandom 产生随机数采坑记录

    公众号「码海」欢迎关注 背景 我们的项目工程里经常在每个函数需要用到 Random 的地方定义一下 Random 变量(如下) public void doSomethingCommon() { Ra ...

  5. WebMagic 实现爬虫入门教程

    本示例实现某电影网站最新片源名称列表及详情页下载地址的抓取. webmagic是一个开源的Java垂直爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发. WebMagic 特点: 完全 ...

  6. 成功build Maven但eclipse中依然显示该工程有错误

    在mac pro的控制台中,成功执行 mvn package,但该工程在eclipse仍然显示有错误. 解决办法:右键该工程 -> Maven -> Update project,勾选 F ...

  7. luogu P1850 换教室

    题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n 节课程安排在 n 个时间段上.在第 i (1 ≤ i ≤ n)个时间段上,两节内容 ...

  8. Apple Developer swift教程学习笔记

    https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson6. ...

  9. 压缩感知重构算法之SP算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

  10. [TimLinux] Django 信号

    1. 信号定义 django包含有一个“信号分发器”,在框架内任何时候,在任何地方,有动作发生时,用来帮助解耦应用之间获取通知.简言之,信号允许特定的发送者通知一系列接收者某一特定动作已经发生了.特别 ...