参考视频:【尚硅谷】Spring框架视频教程(spring5超详细源码级讲解)
一、什么是Bean管理
1、Spring创建对象
2、Spring注入属性
二、Bean管理操作有两种方式
1、基于xml配置文件方式实现
<!--配置User对象创建-->
<bean id="user" class="com.rjs.demo.User"></bean>
(1)在spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建
(2)在bean标签有很多属性,介绍常用的属性
*id 属性:唯一标识
*class 属性:类全路径(包类路径)
*name 属性:id替代
(3)创建对象时,默认也是无参数构造方法完成对象创建(alt + insert)
这里创建了一个构造方法
改成有参构造方法时运行失败,因为创建对象时是默认执行无参构造;
执行有参构造方法需要(你要在类中先写对应参数的构造方法,然后在配置文件中用相同的构造器)。
2、基于注解方式实现
(1) DI:依赖注入,就是注入属性
原始方法-set方法
package com.rjs.demo;
public class Book {
private String bname;
public void setbname(String banme) {
this.bname = bname;
}
public static void main(String[] args) {
Book book = new Book();
book.setbname("abc");
}
}
有参构造
package com.rjs.demo;
public class Book {
private String bname;
// set注入
public void setbname(String banme) {
this.bname = bname;
}
// 有参构造注入
public Book(String bname) {
this.bname = bname;
}
public static void main(String[] args) {
// Book book = new Book(); set 注入
// book.setbname("abc");
}
// 有参构造注入
Book book = new Book("abc");
}
3、第一种注入方式:使用set方式进行注入
(1) 创建类,定义属性和对应的set方法
/*
* 演示使用set方法进行属性注入
*/
public class Book1 {
// 创建属性
private String bname;
private String bauthor;
// 创建属性对应的set方法
public void setBname(String bname) {
this.bname = bname;
}
public void setBauthor(String bauthor) {
this.bauthor = bauthor;
}
}
(2) 在spring配置文件配置对象创建,配置属性注入
<!--set方法注入属性-->
<bean id="book" class="com.rjs.demo.Book1">
<!--使用property完成属性注入
name:类里面属性名称
value:向属性注入的值
-->
<property name="bname" value="魔法书"></property>
<property name="bauthor" value="软件手"></property>
</bean>
测试
@Test
public void testBook(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
// 2 获取配置创建的对象
Book1 book1 = context.getBean("book", Book1.class);
System.out.println(book1);
book1.testDemo();
}
运行结果
4、第二种注入方式:使用有参数构造进行注入
(1) 创建类,定义属性,创建属性对应有参数构造方法
/*
使用有参数构造注入
*/
public class Orders {
private String oname;
private String address;
public Orders(String oname,String address) {
this.oname = oname;
this.address = address;
}
}
(2)在spring配置文件中进行配置
<!--有参构造注入属性 constructor-arg-->
<bean id="orders" class="com.rjs.demo.Orders">
<constructor-arg name="oname" value="电脑"></constructor-arg>
<constructor-arg name="address" value="China"></constructor-arg>
</bean>
name 里面填数字 代表 第几个参数
<constructor-arg name="0" value="电脑"></constructor-arg>
/*
使用有参数构造注入
*/
public class Orders {
private String oname;
private String address;
public Orders(String oname,String address) {
this.oname = oname;
this.address = address;
}
public void ordersTest(){
System.out.println(oname + "::" + address);
}
}
测试案例
@Test
public void testOrders(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
// 2 获取配置创建的对象
Orders orders = context.getBean("orders", Orders.class);
System.out.println(orders);
orders.ordersTest();
}
结果
5、p 名称空间注入(了解)
(1)使用 p 名称空间注入,可以简化基于 xml 配置方式
第一步 添加 p 名称空间在配置文件中
<!--相关约束-->
<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">
第二步 进行属性注入,在 bean 标签里面进行操作
<!--P 空间-->
<bean id="book" class="com.rjs.demo.Book1" p:bname="酒虫" p:bauthor="软件手" >
</bean>
测试
@Test
public void testBook(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
// 2 获取配置创建的对象
Book1 book1 = context.getBean("book", Book1.class);
System.out.println(book1);
book1.testDemo();
}