【Spring】Spring使用xml注入为属性赋值
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注入为属性赋值相关推荐
- spring项目属性注入和bean管理xml 注入一般属性和集合属性
IOC 介绍: 在Spring的应用中,Spring IoC容器可以创建.装配和配置应用组件对象,这里的组件对象称为Bean. Bean的实例化 在面向对象编程中,想使用某个对象时,需要事先实例化该对 ...
- Spring框架中XML配置特殊属性注入
Spring框架中XML配置特殊属性注入 前言 创建测试类 其他类型属性 前言 Spring框架中,在通过set方式进行属性注入时,可能会遇到某些特殊字符的注入,例如:null和某些标签字符" ...
- Spring——Bean管理-xml方式进行属性注入
目录 一.xml方式创建对象 二.xml方式注入属性 第①种方式注入:set方法注入 第②种方式注入:有参构造函数注入 constructor-arg:通过构造函数注入 用name标签属性: 不按照顺 ...
- @autowired注解原理_Spring框架第二谈:IOC,xml配置文件给属性赋值,注解实现赋值...
在spring的对象文件中,给Java对象的属性赋值: di依赖注入,表示创建对象,给属性赋值di的实现方法有两种:1.在spring的配置文件中,使用标签完成,叫做基于XML的di实现2.使用spr ...
- spring + spring mvc + tomcat 面试题(史上最全)下篇
场景1:单例的setter注入 这种注入方式应该是spring用的最多的,代码如下: @Service publicclass TestService1 {@Autowiredprivate Test ...
- Spring 注解 属性赋值与自动注入装配
属性赋值: @Value,@PropertySource 自动装配,自动注入: @Autowired,@Resource,@Inject,Aware接口,@Profile 1.属性赋值练习: 配置类: ...
- Spring框架中XML配置文件注入集合(数组、LIST、MAP、SET)属性
Spring框架中XML配置文件注入集合属性 前言 创建测试类与属性 配置XML配置文件 建立调用类 调用结果 前言 某些类的属性是可能是集合,包括:数组.LIST.MAP.SET等集合,在Sprin ...
- Spring(二)——Junit测试工具、属性的注入方式、注解
文章目录 1. Junit 测试工具 2. getBean的五种用法 3. 属性的注入方式 4. bean的生存范围和加载策略 5. 自定义属性的注入方式 6. Spring中各类注解的作用 1. J ...
- 【Spring 基础篇三】属性注入与属性编辑器
上篇我们了解了一下applicationContext.xml的两种注入方式,本篇我们来了解一下关于属性的注入以及操作. 在敲代码的过程中,我们很容易遇到这样的问题,比如一个Lis ...
- spring基础Bean管理基于xml注入
1.基于xml注入属性 1.什么是Bean管理 Bean管理指的是两个操作 (1) Spring创建对象 (2) Spirng注入属性 2.Bean管理操作有两种方式 (1)基于xml配置文件方式实现 ...
最新文章
- 从缓冲上看阻塞与非阻塞socket在发送接收上的区别
- 英特尔收购人工智能公司 Nervana,开发深度学习技术
- 若依(基于SpringBoot的权限管理系统)集成MobileIMSDK实现IM服务端的搭建
- html中加入超链接方式的汇总
- 音视频技术开发周刊(第125期)
- 使用powermock 测试static 方法,jacoco统计覆盖率问题
- 微软:Vista SP2是最安全的操作系统
- JetBrains 加入 .NET 基金会
- java将数组中的数据修改,深度集成!
- 用dl元素编辑html个人信息,html dl dt dd标签元素语法结构与使用
- 大型Java项目架构演进(小白)
- MCGS 昆仑通态触摸屏 modbus TCP 数据转发
- Kubernetes集群部署之二CA证书制作
- 仪表板展示|DataEase可视化数据分析工具中的视图钻取和联动设置
- android espresso 教程,Espresso 设置说明
- windows11 数字键无法使用 修复办法 已解决
- 啡鸟集:什么样的咖啡豆,才是好的咖啡豆?
- windows7取消隐藏hosts文件的方法
- 绘画教程:动漫角色中男生女生脸部画法
- transE论文阅读 19年记录的