一起学Spring之三种注入方式及集合类型注入

前端之家收集整理的这篇文章主要介绍了一起学Spring之三种注入方式及集合类型注入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

概述

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

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

前提准备

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

Teacher类

 1 package com.hex.first;
 2 
 3 /**
 4  * 老师类
 5  * @author Administrator
 6  *
 7  */
 8 public class Teacher {
 9     
10     11      * 姓名
12      13     private String teacherName="";
14     
15     16      * 年龄
17      18     private int teacherAge=019 
20     
21 
22     public String getTeacherName() {
23         return teacherName;
24     }
25 
26     void setTeacherName(String teacherName) {
27         this.teacherName =28 29 
30     int getTeacherAge() {
31          teacherAge;
32 33 
34     void setTeacherAge( teacherAge) {
35         this.teacherAge =36 37     
38     
39 
40     41      * 教师信息
42      43     @Override
44      String toString() {
45         return "Teacher [teacherName=" + teacherName + ",teacherAge=" + teacherAge + "]"46 47     
48     
49     50      * 构造函数
51      52      Teacher() {
53         super();
54         // TODO Auto-generated constructor stub
55 56 
57     58 59      * @param teacherName
60  teacherAge
61      62     public Teacher(String teacherName,63         64         65 66 
67 }
View Code

Course类

 * 课程
 Course {
     * 课程名
private String courseName=""     * 课时长
int courseHour=019     
20     21      * 课程老师
22      23     private Teacher teacher;
24     
25      String getCourseName() {
26          courseName;
27 28     
29      setCourseName(String courseName) {
30         this.courseName =31 32     
33      getCourseHour() {
34          courseHour;
35 36     void setCourseHour( courseHour) {
37         this.courseHour =38 39     
 Teacher getTeacher() {
41          teacher;
42 43     
 setTeacher(Teacher teacher) {
this.teacher = Course() {
 courseName
 courseHour
public Course(String courseName,1)">66     
67     
68     69      * 三个参数的构造函数
70 71 72  teacher
73      74      courseHour,Teacher teacher) {
75         76         77         78 79 
80     81      * 重写toString()方法
82      83 84     85         return "Course [courseName=" + courseName + ",courseHour=" + courseHour + ",teacher="+teacher+"]"86 87     
88     
89 }
View Code

通过属性的方式进行注入

在applicatonContext.xml中配置如下:

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

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

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

第2种: 采用构造函数,进行赋值         如果构造参数的顺序,和构造函数中的参数顺序是一样的,则name(参数名称),index(参数顺序号),type(参数数据类型)均可以省略
        如果不一样,则需要用name,index的其中一个来标识,如果参数的type不同,则也可以用type来区分
 5      ="teacher2" 7         constructor-arg ="hex" index="0" type="String"constructor-arg 8         ="22"="1"="int" 9             如果是常规的数据类型,采用constructor-arg name value进行赋值
12         如果是对象类型,采用constructor-arg name ref 进行赋值
13      ="course2"15         =".Net C#"16         ="110"17           ref="2"采用p标签的方式进行注入

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

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

配置如下:

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

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

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

集合类型的注入

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

import java.util.Arrays;
 java.util.List;
 java.util.Map;
 java.util.Properties;
 java.util.Set;
 8 
10  * 测试集合数据类型
13  14  TestCollection {
     * 数组信息
 String[] arrInfo;
     * 列表信息
private List<String> lstInfo;
26      * Map信息
27      28     private Map<String,String> mapInfo;
29     
     * Set信息
32      private Set<String> setInfo;
34     
35      Properties propInfo;
36     
37      String[] getArrInfo() {
38          arrInfo;
39 40     
41      setArrInfo(String[] arrInfo) {
42         this.arrInfo =44     
45     public List<String> getLstInfo() {
46         47 void setLstInfo(List<String> lstInfo) {
50         this.lstInfo =51 52     
53     public Map<String,1)"> getMapInfo() {
56     
void setMapInfo(Map<String,1)"> mapInfo) {
58         this.mapInfo =60     
61     public Set<String> getSetInfo() {
62         63 64     
65     void setSetInfo(Set<String> setInfo) {
66         this.setInfo =67 68 
69      Properties getPropInfo() {
70          propInfo;
72 
73      setPropInfo(Properties propInfo) {
74         this.propInfo =75 76 
77 78     79         return "TestCollection [arrInfo=" + Arrays.toString(arrInfo) + ",lstInfo=" + lstInfo + ",mapInfo=" + mapInfo
80                 + ",setInfo=" + setInfo + ",propInfo=" + propInfo + "]"82 
83 }
View Code

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

 集合数据类型 ="test1"="com.hex.first.TestCollection" 数组 ="arrInfo" 5             array 6                 value>篮球 7                 >足球 8                 >网球 9             10          列表 ="lstInfo"13             list14                 >北京15                 >上海16                 >天津17             18         19          键值对,每一个键值对为一个entry,有key,value两个属性 20         ="mapInfo"21             map22                 entry23                     key24                         >football25                     26                     27                 28                 29                     30                         >basketball31                     32                     33                 34                 35                     36                         >ping37                     38                     >乒乓球39                 40              数据集 43         ="setInfo"44             set45                 >AA46                 >BB47                 >CC48             49          props也是一个键值对 51         ="propInfo"52             props53                 prop ="boy">男孩prop54                 ="girl">女孩55             56         >

以上测试信息如下所示:

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

特殊符号处理

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

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

2     ="&lt;Java&gt;">
3     4     5 >

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

2     ="teacherName"3         ><![CDATA[<hex>]]>5     >

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

备注

XML中的非法字符如下:

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

原文链接:https://www.f2er.com/spring/882600.html

猜你在找的Spring相关文章