本文主要讲解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. PAT甲级专题|最短路

    PAT甲级最短路 主要算法:dijkstra 求最短最长路.dfs图论搜索. 1018,dijkstra记录路径 + dfs搜索路径最值 25分,错误点暂时找不出.. 如果只用dijkstra没法做, ...

  2. 使用PDO连接数据库

    PDO(PHP数据对象) 是一个轻量级的.具有兼容接口的PHP数据连接拓展,是一个PHP官方的PECL库,随PHP 5.1发布,需要PHP 5的面向对象支持,因而在更早的版本上无法使用.它所提供的数据 ...

  3. python推导式pythonic必备

    编程规范 今天公司新出了一套Python编程规范2.0,一直觉得自己写代码路子有点野,所以仔细的看了下. 多数的内容在网上都能搜到,但有几点需要说说 让我觉得羞愧的注释率 公司要求代码注释行,占代码总 ...

  4. 转:Spring配置文件<context:property-placeholder>标签使用漫谈

    <context:property-placeholder>标签提供了一种优雅的外在化参数配置的方式,不过该标签在Spring配置文件中只能存在一份!!! 众所周知,Spring容器是采用 ...

  5. list tuple dict 方法

    >>> dir(list)['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir_ ...

  6. 最强Java并发编程详解:知识点梳理,BAT面试题等

    本文原创更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. 知识体系系统性梳理 Java 并发之基础 A. Java进阶 - Java 并发之基础:首先全局的了解并发的知识体系,同时了解 ...

  7. NetCore 3.0 中使用Swagger生成Api说明文档及升级报错原因

    认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参 ...

  8. node - 流 浅析

    概念 流(stream)是 Node.js 中处理流式数据的抽象接口. stream 模块用于构建实现了流接口的对象. Node.js 提供了多种流对象. 例如,HTTP 服务器的请求和 proces ...

  9. Bomb后端云使用

    Bomb是后台云托管工具,在Bomb官网注册会员,即可免费使用后台数据库服务.https://www.bmob.cn/app/list 创建应用后,在设置里获取密钥.根据官方文档集成. 在集成后运行时 ...

  10. 分析Crash文件

    应用在没有发布前,可以通过打印log很方便的查看错误信息.但是发布后,就需要根据Crash文件来定位了. 将手机连接电脑,通过XCode获取Crash文件.Window ->Devices -& ...