创建对象和注入属性(xml方式)
IOC操作之Bean管理操作
什么是Bean管理?
- Bean管理指的是两个操作:
- Spring创建对象
- Spring注入属性
Bean管理操作有两种方式:
- 基于xml配置文件方式实现
- 基于注解方式实现
这里主要来讲解IOC操作之Bean管理操作的基于xml方式的实现:
① 基于xml方式创建对象
<!-- 配置User对象创建 -->
<bean id = "user" class = "com.ffyc.spring5.User"></bean>
-
在Spring配置文件中, 使用bean标签来创建对象, 标签里面添加属性, 就可以实现对象的创建
-
在bean标签中有很多属性, 我们这里来介绍常用的属性:
- id属性 : 唯一标识(注意: 并不是对象名)
- class属性 : 类的全路径(全类名)
我们以前的时候很多时候后端都是学习SSH, 其中的第一个S就是Spring框架, 第二个S就是Struts框架, H指的是hibernate框架, 现在后端我们大多数都是学习SSM, 其中第一个S还是Spring, 但是第二个S是Spring-MVC, M指的是MyBatis框架
注意: 这里我们Spring中使用xml方式创建对象的时候默认也是执行的无参构造方法, 如果没有无参构造方法,那么默认情况之下我们是执行的无参构造方法, 就会报出一个运行时异常: java.lang.NoSuchMethodException
②基于XML方式注入属性
注入属性就是依赖注入, 简称ID, 是IOC的实现方式之一, 还有一种IOC实现方式是依赖查找
- 为什么说注入属性就是依赖注入?
- 因为注入属性其实就是建立一个对象和一个对象之间的关系(如果属性是对象类型的话), 那么其实注入属性就是依赖注入
- 依赖注入其实就是: 在IOC容器运行期间, 动态的将某种依赖关系注入到对象中
- 因为注入属性其实就是建立一个对象和一个对象之间的关系(如果属性是对象类型的话), 那么其实注入属性就是依赖注入
IOC理论提出的观点: 借助"第三方"实现具有依赖关系的对象之间的结构
通过IOC方式创建对象, 就可以将原本对象A获得依赖对象B的过程从主动行为变成了被动行为,控制权颠倒了过来,所以就称之为"控制反转"
依赖注入的前提就是要创建对象(有了对象才能注入属性):
-
第一种注入方式: 使用set方法进行注入
-
创建类, 定义属性和提供对应的set方法
package com.ffyc.spring5 public class Book { //声明一个bname属性 private String bname; //声明一个bauthor属性 private String bauthor; //提供对应的set()方法 public void setBname(String bname) { this.bname = bname; } public void setBauthor(String bauthor) { this.bauthor = bauthor; } //定义一个普通方法, 在这个方法中输出对应的属性值 public void testDemo(){ System.out.println(bname + ":" + bauthor); } }
-
在Spring配置文件中配置对象创建, 配置属性注入(依赖注入)
<!-- 配置Book对象创建 --> <bean id = "book" class = "com.ffyc.spring5.Book"> <!-- set方法注入属性(依赖注入) --> <!-- 使用property标签进行属性注入--> <property name = "bname" value = "易筋经"></property> <property name = "bauthor" value = "达摩老祖"></property> </bean>
-
测试方法进行测试:
public void testBook(){ //1.加载Spring配置文件 ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); //2.获取配置中创建的对象 Book book = context.getBean("book", Book.class); //3.测试 System.out.println(book); book.testDemo(); }
- 我们加载Spring配置文件之后会得到一个上下文对象(其实是一个工厂对象)ApplicationContext接口实现类, 也是BeanFactory接口实现类
- 我们的ApplicationContext接口继承了BeanFactory接口
- 我们可以通过ApplicationContext接口实现类对象调用其中都getBean()方法获取到对应的配置文件中创建的对象, 所以ApplicationContext其实就相当于是工厂对象
- 我们加载Spring配置文件之后会得到一个上下文对象(其实是一个工厂对象)ApplicationContext接口实现类, 也是BeanFactory接口实现类
-
-
第二种注入方式: 使用有参构造方法进行注入
-
创建类, 定义属性, 创建属性对应的构造方法
-
注意: 这里我们使用有参构造方法进行注入的时候我们一定要显示的声明有有参构造方法, 当我们的有参方法声明之后我们的虚拟机就不会为我们生成默认无参构造方法了, 而这个时候我们spring创建对象的时候默认使用的是无参构造方法, 但是这个时候我们显式声明了有参构造之后如果没有同样显示的声明无参构造, 那么在创建对象的时候就会出错, 就会出现一个运行时异常: NoSuchMethodException
- 所以我们一定要注意: 我们一般声明有参构造方法之后都要再同时声明有对应的无参构造方法
package com.ffyc.spring5; public class Orders { //声明属性: private String oname; private String address; //创建有参构造方法 //因为此时我们依赖注入的时候使用的有参构造方法来实现 public Orders(String oname, String address) { this.oname = oname; this.address = address; } //注意: 这里我们一定还要显示的声明无参构造方法, 因为我们的Spring中默认配置文件中创建bean对象时调用的是类中的无参构造方法 public Orders(){ } //编写一个普通成员方法, 在此成员方法中输出类中的属性值 public void OrdersTest(){ System.out.println(oname + ":" + address); } }
-
-
在Spring配置文件中进行配置
<!-- 有参构造方法注入属性(使用构造方法进行依赖注入) --> <bean id = "orders" class = "com.ffyc.spring5.Orders"> <!-- 使用constructor-arg标签来进行属性注入 --> <constructor-arg name = "oname" value = "电脑"></constructor-arg> <constructor-arg name = "address" value = "china"></constructor-arg> </bean>
-
constructor-arg标签就也是用来依赖注入的标签, 使用constructor-arg标签进行依赖注入的时候调用的是有参构造方法完成的
-
constructor标签中的属性:
- name : 我们要注入属性的属性名
- value : 要注入的属性值
- index : 表示要注入的属性是有参构造中的第几个属性
- 比如: 此时我们上面提供的有参构造中oname属性是第一个属性, 就是索引为0的属性, 所以我们上面的< constructor-arg name = “oname” value = “电脑”>< /constructor-arg>就可以使用< constructor-arg index = “0” value = “电脑”>< /constructor-arg>来代替
- 也就是此时的索引就是根据有参构造形参列表中的顺序, 有参构造中的顺序确定的, 所以就是属于Java中的索引, 所以就是从0开始的
-