Spring使用set注入为属性赋值

  • set注入
    • 简单类型的注入
    • 引用类型的注入
  • 构造注入
  • 自动注入
    • 按照名称进行注入
    • 按照类型注入
    • 按照构造自动注入

注入就是赋值的意思
Spring规定:Java中的基本数据类型和字符串都是简单数据类型
set注入的本质是调用set方法来赋值,因此在使用此方法注入时set方法必不可少

set注入

简单类型的注入

先创建一个简单的Hello类,定义一个属性及其的set方法

public class Hello {private String msg;public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}

在xml文件里使用set注入为Hello类里面的属性赋值
切记别名不可重复

    <!--id是对象的别名,class是绝对路径--><bean id="hello" class="spring.service.ba01.Hello"><!--name是属性名,value属性值--><property name="msg" value="Hello world"/></bean>

在HelloWorld类里面实例化出Hello类

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class HelloWorld {public static void main(String[] args) {//存储xml文件的路径String config = "ba01/ba01.xml";//生成ac,以便于实例化对象ApplicationContext ac =new ClassPathXmlApplicationContext(config);//实例化对象,hello就是xml文件中给Hello起的别名Hello hello = (Hello)ac.getBean("hello");System.out.println(hello.getMsg());}
}

结果如图所示,Hello已被实例化出来了

集合属性注入

//在Hello类加入属性
private List<String>list;
private Set<String> set;
private Map<String, String> map;

xml文件配置

<property name="list"><list><value>a</value><value>b</value><value>c</value></list></property><property name="map"><map><entry key="a" value="aaa"></entry><entry key="b" value="bbb"></entry></map></property><property name="set"><set><value>1</value><value>2</value><value>1</value></set></property>

结果

引用类型的注入

创建school类

public class school {private String name;private String address;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

创建student类

public class student {private school school;private String name;@Overridepublic String toString() {return "我叫:"+getName()+",我在位处于:"+school.getAddress()+"的名字叫:"+school.getName()+"上学";}public spring.service.ba01.school getSchool() {return school;}public void setSchool(spring.service.ba01.school school) {this.school = school;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

编写xml文件

    <bean id="school" class="spring.service.ba01.school"><property name="name" value="清华"/><property name="address" value="北京"/></bean><bean id="student" class="spring.service.ba01.student"><property name="name" value="张三"/><property name="school" ref="school"/></bean>

编写测试类

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {String config = "ba01/ba01.xml";ApplicationContext ac = new ClassPathXmlApplicationContext(config);student student = (student)ac.getBean("student");System.out.println(student);}
}

测试结果如图赋值成功

构造注入

构造注入即使用构造方法注入,而不使用set方法,也就是说不一定必须要写set方法,但是有参构造必须存在
创建Student类和School类

public class School {private String name;private String address;public School(String name, String address) {this.name = name;this.address = address;}@Overridepublic String toString() {return "School{" +"name='" + name + '\'' +", address='" + address + '\'' +'}';}
}
public class Student {private School school;private String name;private int age;public Student(School school, String name, int age) {this.school = school;this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"school=" + school +", name='" + name + '\'' +", age=" + age +'}';}
}

在xml文件里使用构造注入为属性赋值

 <bean id="SC" class="com.demo.test1.School"><constructor-arg name="address" value="北京"></constructor-arg><constructor-arg name="name" value="北大"></constructor-arg></bean><bean id="stu" class="com.demo.test1.Student"><constructor-arg index="0" ref="SC"></constructor-arg><constructor-arg index="1" value="张三"></constructor-arg><constructor-arg index="2" value="20"></constructor-arg></bean>

上述代码可以看出,构造注入的俩种写法,一种是name使用属性名来确定属性,另一种使用index,他是从0开始计算的
测试类

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {String config = "classpath:spring/ApplicationContext.xml";ApplicationContext ac = new ClassPathXmlApplicationContext(config);Student student = (Student)ac.getBean("stu");System.out.println(student);}
}

结果

自动注入


自动注入是采用约定大约配置的方式来实现的,程序和spring容器之间约定好,遵守某一种都认同的规则,来实现自动注入。

xml中可以在bean元素中通过autowire属性来设置自动注入的方式,autowire分为三种按照名称进行注入、按照类型进行注入和按照构造方法进行注入


按照名称进行注入

spring容器会按照set属性的名称去容器中查找同名的bean对象,然后将查找到的对象通过set方法注入到对应的bean中,未找到对应名称的bean对象则set方法不进行注入


创建Student和School类

public class Student {private School school;private String name;private String age;public School getSchool() {return school;}public void setSchool(School school) {this.school = school;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}@Overridepublic String toString() {return "Student [school=" + school + ", name=" + name + ", age=" + age + "]";}
}
public class School {private String address;private String name;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "School [address=" + address + ", name=" + name + "]";}
}

编写xml文件

 <bean id="sc" class="com.demo.autowire.School"><property name="address" value="北京"></property><property name="name" value="北大"></property></bean><bean id="mystu" class="com.demo.autowire.Student" autowire="byName"><property name="age" value="20"></property><property name="name" value="张三"></property></bean>

byName是根据名字来赋值,所以id名要和参数一致才可,列如此处的Student类中并没有为school属性赋值,我们准备使用byName自动赋值,那么我们在写xml文件的时候给school类的id必须和student类里school的属性名称一样才能完成赋值


测试类

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.demo.autowire.*;public class Test {public static void main(String[] args) {String config = "classpath:spring/ApplicationContext.xml";ApplicationContext ac = new ClassPathXmlApplicationContext(config);Student student = (Student) ac.getBean("mystu");System.out.println(student);}
}

结果如图所示赋值成功


按照类型注入


spring容器会遍历x类中所有的set方法,会在容器中查找和set参数类型相同的bean对象,将其通过set方法进行注入,未找到对应类型的bean对象则set方法不进行注入。

需要注入的set属性的类型和被注入的bean的类型需要满足isAssignableFrom关系。

按照类型自动装配的时候,如果按照类型找到了多个符合条件的bean,系统会报错。父子类实现关系都算同种

set方法的参数如果是下面的类型或者下面类型的数组的时候,这个set方法会被跳过注入:


创建Game类和User类

public class User {private Game game;private String name;public Game getGame() {return game;}public void setGame(Game game) {this.game = game;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "User [game=" + game + ", name=" + name + "]";}
}
public class Game {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Game [name=" + name + "]";}
}

编写xml文件

 <bean id="game" class="com.demo.autowire_type.Game"><property name="name" value="王者荣耀"></property></bean><!-- byType是按照类型自动赋值,在本例中我们需要自动赋值Game,他就会在xml文件里查找类型为game的,但是同种类型只能存在一个,实现类,父子类都算同种类型 也就是说,在这个xml文件里只可以存在一个game类。他的父子类,实现类都不能存在 --><bean id="user" class="com.demo.autowire_type.User" autowire="byType"><property name="name" value="张三"></property></bean>

测试类

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.demo.autowire.*;public class Test {public static void main(String[] args) {String config = "classpath:spring/ApplicationContext.xml";ApplicationContext ac = new ClassPathXmlApplicationContext(config);User user = (User) ac.getBean("user");System.out.println(user);}
}

结果


Game类的name被自动赋值了


按照构造自动注入

spring会找到x类中所有的构造方法(一个类可能有多个构造方法),然后将这些构造方法进行排序(先按修饰符进行排序,public的在前面,其他的在后面,如果修饰符一样的,会按照构造函数参数数量倒叙,也就是采用贪婪的模式进行匹配,spring容器会尽量多注入一些需要的对象)得到一个构造函数列表,会轮询这个构造器列表,判断当前构造器所有参数是否在容器中都可以找到匹配的bean对象,如果可以找到就使用这个构造器进行注入,如果不能找到,那么就会跳过这个构造器,继续采用同样的方式匹配下一个构造器,直到找到一个合适的为止。


创建Game类和User类

public class User {private Game game;private String name;public Game getGame() {return game;}public void setGame(Game game) {this.game = game;}public String getName() {return name;}public void setName(String name) {this.name = name;}public User(Game game) {super();this.game = game;}@Overridepublic String toString() {return "User [game=" + game + ", name=" + name + "]";}
}
public class Game {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Game [name=" + name + "]";}
}

编写xml文件

 <bean id="Game" class="com.demo.autowire_con.Game"><property name="name" value="王者荣耀"></property></bean><!-- 构造注入会采用贪婪模式,最大限度地注入属性,即当一个构造要注入三个,一个要注入俩个,会选择第一个 --><bean id="user" class="com.demo.autowire_con.User" autowire="constructor"><property name="name" value="张三"></property></bean>

测试类

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.demo.autowire_con.*;public class Test {public static void main(String[] args) {String config = "classpath:spring/ApplicationContext.xml";ApplicationContext ac = new ClassPathXmlApplicationContext(config);User user = (User) ac.getBean("User");System.out.println(user);}
}

结果,如图,构造注入赋值成功

【Spring】Spring使用xml注入为属性赋值相关推荐

  1. spring项目属性注入和bean管理xml 注入一般属性和集合属性

    IOC 介绍: 在Spring的应用中,Spring IoC容器可以创建.装配和配置应用组件对象,这里的组件对象称为Bean. Bean的实例化 在面向对象编程中,想使用某个对象时,需要事先实例化该对 ...

  2. Spring框架中XML配置特殊属性注入

    Spring框架中XML配置特殊属性注入 前言 创建测试类 其他类型属性 前言 Spring框架中,在通过set方式进行属性注入时,可能会遇到某些特殊字符的注入,例如:null和某些标签字符" ...

  3. Spring——Bean管理-xml方式进行属性注入

    目录 一.xml方式创建对象 二.xml方式注入属性 第①种方式注入:set方法注入 第②种方式注入:有参构造函数注入 constructor-arg:通过构造函数注入 用name标签属性: 不按照顺 ...

  4. @autowired注解原理_Spring框架第二谈:IOC,xml配置文件给属性赋值,注解实现赋值...

    在spring的对象文件中,给Java对象的属性赋值: di依赖注入,表示创建对象,给属性赋值di的实现方法有两种:1.在spring的配置文件中,使用标签完成,叫做基于XML的di实现2.使用spr ...

  5. spring + spring mvc + tomcat 面试题(史上最全)下篇

    场景1:单例的setter注入 这种注入方式应该是spring用的最多的,代码如下: @Service publicclass TestService1 {@Autowiredprivate Test ...

  6. Spring 注解 属性赋值与自动注入装配

    属性赋值: @Value,@PropertySource 自动装配,自动注入: @Autowired,@Resource,@Inject,Aware接口,@Profile 1.属性赋值练习: 配置类: ...

  7. Spring框架中XML配置文件注入集合(数组、LIST、MAP、SET)属性

    Spring框架中XML配置文件注入集合属性 前言 创建测试类与属性 配置XML配置文件 建立调用类 调用结果 前言 某些类的属性是可能是集合,包括:数组.LIST.MAP.SET等集合,在Sprin ...

  8. Spring(二)——Junit测试工具、属性的注入方式、注解

    文章目录 1. Junit 测试工具 2. getBean的五种用法 3. 属性的注入方式 4. bean的生存范围和加载策略 5. 自定义属性的注入方式 6. Spring中各类注解的作用 1. J ...

  9. 【Spring 基础篇三】属性注入与属性编辑器

         上篇我们了解了一下applicationContext.xml的两种注入方式,本篇我们来了解一下关于属性的注入以及操作.      在敲代码的过程中,我们很容易遇到这样的问题,比如一个Lis ...

  10. spring基础Bean管理基于xml注入

    1.基于xml注入属性 1.什么是Bean管理 Bean管理指的是两个操作 (1) Spring创建对象 (2) Spirng注入属性 2.Bean管理操作有两种方式 (1)基于xml配置文件方式实现 ...

最新文章

  1. 从缓冲上看阻塞与非阻塞socket在发送接收上的区别
  2. 英特尔收购人工智能公司 Nervana,开发深度学习技术
  3. 若依(基于SpringBoot的权限管理系统)集成MobileIMSDK实现IM服务端的搭建
  4. html中加入超链接方式的汇总
  5. 音视频技术开发周刊(第125期)
  6. 使用powermock 测试static 方法,jacoco统计覆盖率问题
  7. 微软:Vista SP2是最安全的操作系统
  8. JetBrains 加入 .NET 基金会
  9. java将数组中的数据修改,深度集成!
  10. 用dl元素编辑html个人信息,html dl dt dd标签元素语法结构与使用
  11. 大型Java项目架构演进(小白)
  12. MCGS 昆仑通态触摸屏 modbus TCP 数据转发
  13. Kubernetes集群部署之二CA证书制作
  14. 仪表板展示|DataEase可视化数据分析工具中的视图钻取和联动设置
  15. android espresso 教程,Espresso 设置说明
  16. windows11 数字键无法使用 修复办法 已解决
  17. 啡鸟集:什么样的咖啡豆,才是好的咖啡豆?
  18. windows7取消隐藏hosts文件的方法
  19. 绘画教程:动漫角色中男生女生脸部画法
  20. transE论文阅读 19年记录的

热门文章

  1. HDU 3709 平衡数 数位dp(Java版)
  2. 《传习录》 学习笔记
  3. N元语言模型的训练方法
  4. LaTEX 表格内容换行
  5. 数字图像处理(三)图像复原(噪声生成,噪声滤波器,逆滤波,维纳滤波,有约束最小二乘恢复)
  6. 短信机bug,发短信发的直吐血…………
  7. 微信的那个老外产品经理,又写了一篇《中国移动应用设计趋势》
  8. java根号n元素的合并排序算法_根号N段合并排序
  9. 5G适合py还是java,5G比4G到底有啥好处?看完就彻底明白了
  10. java导出excel 自定义表头