spring5(三):IOC操作Bean管理(基于xml方式)
创始人
2025-06-01 08:54:07
0

IOC操作Bean管理(基于xml方式)

  • 前言
    • 一、基于 xml 方式创建对象
    • 二、基于 xml 方式注入属性
      • 1. 使用 set 方法进行属性注入
      • 2. 使用有参数构造进行属性注入
      • 3. p 名称空间注入简化操作(了解)
    • 三、xml 注入其它类型属性
      • 1. 字面量
      • 2. 注入属性-外部 bean
      • 3. 注入属性-内部 bean
      • 4. 注入属性-级联赋值
    • 四、xml 注入集合属性
      • 1. 注入数组类型属性
      • 2. 注入 List 集合类型属性
      • 3. 注入 Map 集合类型属性
      • 4. 在集合里面设置对象类型值
      • 5. 把集合注入部分提取出来
    • 五、bean作用域
    • 六、bean 生命周期
    • 七、xml 自动装配
    • 八、外部属性文件
    • 九、FactoryBean



前言

本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,欢迎关注!

一、基于 xml 方式创建对象

在这里插入图片描述

⭕在 spring 配置文件中,使用 bean 标签,标签里面添加对应属性,就可以实现对象创建

⭕在 bean 标签有很多属性,介绍常用的属性

  • id 属性:唯一标识
  • class 属性:类全路径(包类路径)
  • name属性:作用与id属性一致,区别是name属性里面可以用特殊字符,但现在很少用name属性了

⭕创建对象时候,默认也是执行无参数构造方法完成对象创建,如果在类里用有参构造器覆盖无参构造器,运行时则会报错。

二、基于 xml 方式注入属性

DI:依赖注入,就是注入属性

1. 使用 set 方法进行属性注入

① 创建类,定义属性和对应的 set 方法

//演示使用 set 方法进行注入属性
public class Person {private String name;private String food;public void setName(String name) {this.name = name;}public void setFood(String food) {this.food = food;}public void eat(){System.out.println(this.name+"吃"+this.food);}}

② 在 spring 配置文件配置对象创建,配置属性注入


property标签中的属性name是相应的类中的属性名,value是指要赋予属性的值

③ 测试代码:

 @Test                                                                                      public void testEat(){                                                                     //1.加载spring配置文件                                                                       ApplicationContext context = new ClassPathXmlApplicationContext("person1.xml");        //2. 获取配置创建的对象                                                                         Person person = context.getBean("person_ir",Person.class);                             //3. 测试                                                                                System.out.println(person);//com.ir.spring5.Person@1b26f7b2                            person.eat(); //[小老师ir]吃java                                                           }                                                                                          

2. 使用有参数构造进行属性注入

① 创建类,定义属性,创建属性对应有参数构造方法

package com.ir.spring5;public class Car {private String number;private String speed;public Car(String number, String speed) {this.number = number;this.speed = speed;}public void run(){System.out.println(number+"::"+speed);}
}

② 在 spring 配置文件中进行配置

 


测试:

  @Test                                                                                      public void testCar(){                                                                     //1.加载配置文件                                                                             ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");          //2.获取配置文件创建的对象                                                                        Car car = context.getBean("car_ir",Car.class);                                         //3.测试                                                                                 System.out.println(car);//com.ir.spring5.Car@a74868d                                   car.run();//01::200                                                                    }                                                                                                                                                       

3. p 名称空间注入简化操作(了解)

使用 p 名称空间注入,可以简化基于 xml 配置方式

① 添加 p 名称空间在配置文件中
在这里插入图片描述

② 进行属性注入,在 bean 标签里面进行操作



三、xml 注入其它类型属性

1. 字面量

⭕ null 值

    
@Test                                                                            
public void testEat(){                                                                                                                  ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");                                                         Person person = context.getBean("person_ir",Person.class);                                                                                      System.out.println(person);//com.ir.spring5.Person@1b26f7b2                  person.eat(); //[null]吃java                                                  

⭕ 属性值包含特殊符号

● 方法一:把<>进行转义 < >

 
@Test                                                                            
public void testEat(){                                                                                                                 ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");                                                            Person person = context.getBean("person_ir",Person.class);                                                                                System.out.println(person);//com.ir.spring5.Person@a74868d              person.eat(); //<小老师ir>吃java                                                  

● 方法二:把带特殊符号内容写到 CDATA

   >]]>
@Test                                                                            
public void testEat(){                                                           //1.加载spring配置文件                                                             ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");//2. 获取配置创建的对象                                                               Person person = context.getBean("person_ir",Person.class);                   //3. 测试                                                                      System.out.println(person);//com.ir.spring5.Person@a74868d                   person.eat(); //[<<小老师ir>>]吃java                                             

2. 注入属性-外部 bean

演示步骤:
① 创建两个类 service 类和 dao 类

② 在 service 调用 dao 里面的方法

UserDao

package Dao;/*** @author shkstart* @create 2022-05-07 23:08*/
public interface UserDao {public void update();
}

UserService

package Service;import Dao.UserDao;/*** @author shkstart* @create 2022-05-07 23:08*/
public class UserService {//创建 UserDao 类型属性,生成 set 方法private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void add() {System.out.println("service add...............");userDao.update();}
}

UserDaoImpl

package Dao;/*** @author shkstart* @create 2022-05-07 23:08*/
public class UserDaoImpl implements UserDao{@Overridepublic void update() {System.out.println("dao update...........");}
}

③ 在 spring 配置文件中进行配置



测试:

@Testpublic void testBean(){ApplicationContext context1 = new ClassPathXmlApplicationContext("bean2.xml");UserService userService = (UserService)context1.getBean("userservice");System.out.println(userService);//Service.UserService@eafc191userService.add();
//       service add...............
//       dao update...........}

3. 注入属性-内部 bean

① 一对多关系:部门和员工,一个部门有多个员工,一个员工属于一个部门,部门是一,员工是多
② 在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示

部门类

package Bean;
public class Dept {private String dname;public void setDname(String dname) {this.dname = dname;}@Overridepublic String toString() {return "Dept{" +"dname='" + dname + '\'' +'}';}
}

员工类

package Bean;public class Emp {private String ename;private String gender;//员工属于某一个部门,使用对象形式表示private Dept dept;public void setDept(Dept dept) {this.dept = dept;}public void setEname(String ename) {this.ename = ename;}public void setGender(String gender) {this.gender = gender;}public void add() {System.out.println(ename+"::"+gender+"::"+dept);}
}

③ 在 spring 配置文件中进行配置


测试

   @Testpublic void testEmp(){ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");Emp emp = (Emp)context.getBean("emp");System.out.println(emp);//Bean.Emp@69b0fd6femp.add();//小老师ir::女::Dept{dname='安保部'}}

4. 注入属性-级联赋值

方式一:

在 spring 配置文件bean4.xml中进行配置

测试:

@Testpublic void testEmp2(){ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");Emp emp = (Emp)context.getBean("emp");System.out.println(emp);//Bean.Emp@462d5aeeemp.add();//小老师ir::女::Dept{dname='技术部'}}

方式二:员工属于某一个部门,使用对象形式表示

 

测试:

   @Testpublic void testEmp3(){ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");Emp emp = (Emp)context.getBean("emp");System.out.println(emp);//Bean.Emp@757942a1emp.add();//小老师ir::女::Dept{dname='技术部'}}

注意:此种方法中,Emp类中必须有getDept( )方法

在这里插入图片描述

四、xml 注入集合属性

1. 注入数组类型属性

2. 注入 List 集合类型属性

3. 注入 Map 集合类型属性

步骤:

① 创建类,定义数组、list、map、set 类型属性,生成对应 set 方法

Stu类

public class Stu {//1 数组类型属性private String[] courses;//2 list集合类型属性private List list;//3 map集合类型属性private Map maps;//4 set集合类型属性private Set sets;public void setSets(Set sets) {this.sets = sets;}public void setCourses(String[] courses) {this.courses = courses;}public void setList(List list) {this.list = list;}public void setMaps(Map maps) {this.maps = maps;}@Overridepublic String toString() {return "Stu{" +"courses=" + Arrays.toString(courses) +", list=" + list +", maps=" + maps +", sets=" + sets +               '}';}
}

② 在 spring 配置文件进行配置

  	JavaC++PythonGo喜羊羊美羊羊

测试:

  @Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");Stu student = context.getBean("student",Stu.class);System.out.println(student);//Stu{courses=[Java, C++], list=[Python, Go], maps={小老师ir=C++}, sets=[喜羊羊, 美羊羊]}}

4. 在集合里面设置对象类型值

Stu类

public class Stu {//1 数组类型属性private String[] courses;//2 list集合类型属性private List list;//3 map集合类型属性private Map maps;//4 set集合类型属性private Set sets;//学生所学多门课程private List courseList;public void setCourseList(List courseList) {this.courseList = courseList;}public void setSets(Set sets) {this.sets = sets;}public void setCourses(String[] courses) {this.courses = courses;}public void setList(List list) {this.list = list;}public void setMaps(Map maps) {this.maps = maps;}@Overridepublic String toString() {return "Stu{" +"courses=" + Arrays.toString(courses) +", list=" + list +", maps=" + maps +", sets=" + sets +", courseList=" + courseList +'}';}
}

Course类

//课程类
public class Course {private String cname; //课程名称public void setCname(String cname) {this.cname = cname;}@Overridepublic String toString() {return "Course{" +"cname='" + cname + '\'' +'}';}
}

在 spring 配置文件进行配置


测试

    @Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");Stu student = context.getBean("student1",Stu.class);System.out.println(student);//Stu{courses=null, list=null, maps=null, sets=null, courseList=[Course{cname='英语课'}, Course{cname='语文课'}, Course{cname='数学课'}]}}

5. 把集合注入部分提取出来

Book类·

public class Book {private List list;public void setList(List list) {this.list = list;}@Overridepublic String toString() {return "Book{" +"list=" + list +'}';}
}

步骤:

① 在 spring 配置文件中引入名称空间 util

在这里插入图片描述

② 在 spring 配置文件进行配置,使用 util 标签完成 list 集合注入提取

javac++python

测试

    @Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");Book book= context.getBean("book", Book.class);System.out.println(book);//Book{list=[java, c++, python]}}

五、bean作用域

⭕ 在 Spring 里面,设置创建 bean 实例是单实例还是多实例 ?
⭕在 Spring 里面,默认情况下,bean 是单实例对象

Book类

public class Book {private List list;public void setList(List list) {this.list = list;}
}

在 spring 配置文件进行配置

javac++python

测试:

 @Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");Book book1= context.getBean("book", Book.class);Book book2= context.getBean("book", Book.class);System.out.println(book1);//collectiontest.Book@27d415d9System.out.println(book2);//collectiontest.Book@27d415d9}

由以上测试输出结果可知,创建的两个book对象地址相同,即为其实是同一个对象

⭕如何设置单实例还是多实例
● 在 spring 配置文件 bean 标签里面有属性(scope)用于设置单实例还是多实例
● scope 属性值,其中有两个常见的词

  1. 第一个值,默认值,singleton,表示是单实例对象
  2. 第二个值prototype,表示是多实例对象 Book类与如上相同

在 spring 配置文件进行配置

    javac++pythony

测试:

    @Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");Book book1= context.getBean("book", Book.class);Book book2= context.getBean("book", Book.class);System.out.println(book1);//collectiontest.Book@27d415d9System.out.println(book2);//collectiontest.Book@5c18298f}

由以上测试输出结果可知,创建的两个book对象地址不相同,即为是两个对象

⭕ singleton 和 prototype 区别

● singleton 单实例,prototype 多实例

● 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象
● 设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,而是在调用getBean 方法时候创建多实例对象

六、bean 生命周期

⭕ 生命周期:从对象创建到对象销毁的过程

⭕ bean 生命周期
(1)通过构造器创建 bean 实例(无参数构造)
(2)为 bean 的属性设置值和对其他 bean 引用(调用set 方法)
(3)调用 bean 的初始化的方法(需要进行配置初始化的方法)
(4)bean 可以使用了(对象获取到了)
(5)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)

⭕ 演示 bean 生命周期

Order类

public class Order {private String name;public Order() {System.out.println("第一步:执行无参构造器创建对象");}public void setName(String name) {this.name = name;System.out.println("第二步:调用set()方法设置属性值");}public void initMethod(){System.out.println("第三步:执行初始化方法");}public void destroyMethod(){System.out.println("第五步:执行销毁的方法");}}

在 spring 配置文件进行配置



测试:

@Testpublic void test(){ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");Order order= context.getBean("order", Order.class);System.out.println("第四步:获取创建 bean 实例对象");System.out.println(order);context.close();
//        第一步:执行无参构造器创建对象
//        第二步:调用set()方法设置属性值
//        第三步:执行初始化方法
//        第四步:获取创建 bean 实例对象
//        collectiontest.Order@4a87761d
//        第五步:执行销毁的方法}

⭕ bean 的后置处理器,bean 生命周期有七步

(1)通过构造器创建 bean 实例(无参数构造)
(2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
(3)把bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization
(4)调用 bean 的初始化的方法(需要进行配置初始化的方法)
(5)把 bean 实例传递 bean 后置处理器的方法postProcessAfterInitialization
(6)bean 可以使用了(对象获取到了)
(7)当容器关闭时候,调用bean 的销毁的方法(需要进行配置销毁的方法)

⭕ 演示添加后置处理器效果

(1)创建类,实现接口 BeanPostProcessor,创建后置处理器

public class MyBeanPost implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("在初始化之前执行的方法");return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("在初始化之后执行的方法");return bean;}
}

在 spring 配置文件进行配置




测试:

 @Testpublic void test(){ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");Order order= context.getBean("order", Order.class);System.out.println("第四步:获取对象");System.out.println(order);context.close();
//        第一步:执行无参构造器创建对象
//        第二步:调用set()方法设置属性值
//        在初始化之前执行的方法
//        第三步:执行初始化方法
//        在初始化之后执行的方法
//        第四步:获取对象
//        bean.Order@37374a5e
//        第五步:执行销毁的方法}

七、xml 自动装配

⭕ 什么是自动装配?

根据指定装配规则(属性名称或者属性类型),Spring 自动将匹配的属性值进行注入

① bean 标签属性 autowire,配置自动装配
② autowire 属性常用两个值:

  1. byName:根据属性名称注入 ,注入值 bean 的 id 值和类属性名称一样
  2. byType :根据属性类型注入

⭕演示自动装配过程
● 根据属性名称自动注入
Dept类

public class Dept {private String name;public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Dept{" +"name='" + name + '\'' +'}';}
}

Emp类

public class Emp {private Dept dept;public void setDept(Dept dept) {this.dept = dept;}@Overridepublic String toString() {return "Emp{" +"dept=" + dept +'}';}
}

在 spring 配置文件进行配置



测试:

 @Testpublic void test() {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean5.xml");Emp emp = context.getBean("emp", Emp.class);System.out.println(emp);//Emp{dept=Dept{name='技术部'}}}

● 根据属性类型自动注入

 

测试:

 @Testpublic void test() {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean5.xml");Emp emp = context.getBean("emp", Emp.class);System.out.println(emp);//Emp{dept=Dept{name='技术部'}}}

注意:通过属性类型的方式自动装配时,同一类型不能有多个bean对象,否则会报错

八、外部属性文件

⭕ 直接配置数据库信息

① 引入德鲁伊连接池依赖 jar 包
② 配置德鲁伊连接池


⭕ 引入外部属性文件配置数据库连接池
(1)创建外部属性文件,properties 格式文件,写数据库信息

jdbc.properties

prop.driverClass=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/userDb
prop.userName=root
prop.password=root

(2)把外部 properties 属性文件引入到 spring 配置文件中

① 引入 context 名称空间
在这里插入图片描述
② 在 spring 配置文件使用标签引入外部属性文件


九、FactoryBean

Spring 有两种类型 bean,一种普通 bean,另外一种工厂 bean(FactoryBean)

  1. 普通 bean:在配置文件中定义 bean 类型就是返回类型
  2. 工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样

步骤:

① 创建类,让这个类作为工厂 bean,实现接口 FactoryBean
② 实现口里面的方法,在实现的方法中定义返回的bean 类型

Course类

public class Course {private String cname; //课程名称public void setCname(String cname) {this.cname = cname;}public String getCname(){return this.cname;}@Overridepublic String toString() {return "Course{" +"cname='" + cname + '\'' +'}';}
}
public class MyBean implements FactoryBean {@Overridepublic Course getObject() throws Exception {Course course = new Course();course.setCname("Java");return course;}@Overridepublic Class getObjectType() {return null;}
}

③ 在 spring 配置文件进行配置


测试:

    @Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");Course course= context.getBean("mybean", Course.class);System.out.println(course.getCname());//Java}

相关内容

热门资讯

扫房神器2安卓系统,打造洁净家... 你有没有发现,家里的灰尘就像小精灵一样,总是悄悄地在你不注意的时候跳出来?别急,今天我要给你介绍一个...
安卓完整的系统设置,全面掌控手... 亲爱的手机控们,是不是觉得你的安卓手机用久了,功能越来越强大,但设置却越来越复杂?别急,今天就来带你...
电视安卓系统是几代机子,揭秘新... 你有没有想过,家里的电视是不是已经升级到了最新的安卓系统呢?别小看了这个小小的系统升级,它可是能让你...
安卓系统隐私有经常去,系统级防... 你知道吗?在咱们这个数字化时代,手机可是我们生活中不可或缺的好伙伴。但是,你知道吗?这个好伙伴有时候...
安卓10系统断网软件,轻松实现... 你有没有遇到过这种情况?手机突然断网了,明明信号满格,却连不上网,急得你团团转。别急,今天就来给你揭...
安卓可以改什么系统版本,体验全... 你有没有想过,你的安卓手机其实可以像换衣服一样,换一个全新的“系统版本”呢?没错,这就是今天我们要聊...
最好的平板游戏安卓系统,畅享指... 亲爱的游戏迷们,你是否在寻找一款能够让你在安卓平板上畅玩无忧的游戏神器?别急,今天我就要给你揭秘,究...
华为安卓系统卡顿解决,华为安卓... 你是不是也遇到了华为安卓系统卡顿的问题?别急,今天就来给你支几招,让你的华为手机重新焕发活力!一、清...
安卓建议升级鸿蒙系统吗,探讨鸿... 亲爱的安卓用户们,最近是不是被鸿蒙系统的新鲜劲儿给吸引了?是不是在犹豫要不要把你的安卓手机升级成鸿蒙...
安卓如何变苹果系统桌面,桌面系... 你有没有想过,把你的安卓手机变成苹果系统桌面,是不是瞬间高大上了呢?想象那流畅的动画效果,那简洁的界...
windows平板安卓系统升级... 你有没有发现,最近你的Windows平板电脑突然变得有些不一样了?没错,就是那个一直默默陪伴你的小家...
安卓系统扩大运行内存,解锁更大... 你知道吗?在科技飞速发展的今天,手机已经成为了我们生活中不可或缺的好伙伴。而手机中,安卓系统更是以其...
安卓系统怎么改变zenly,探... 你有没有发现,你的安卓手机上的Zenly应用最近好像变得不一样了?没错,安卓系统的大手笔更新,让Ze...
英特尔安卓子系统,引领高效移动... 你有没有想过,手机里的安卓系统竟然也能和电脑上的英特尔处理器完美结合呢?这可不是天方夜谭,而是科技发...
永远会用安卓系统的手机,探索安... 亲爱的手机控们,你是否也有那么一款手机,它陪伴你度过了无数个日夜,成为了你生活中不可或缺的一部分?没...
有哪些安卓手机系统好用,好用系... 你有没有发现,现在手机市场上安卓手机的品牌和型号真是琳琅满目,让人挑花了眼?不过别急,今天我就来给你...
卡片记账安卓系统有吗,便捷财务... 你有没有想过,用手机记账是不是比拿着小本本记录来得方便多了?现在,手机上的应用层出不穷,那么,有没有...
武汉摩尔影城安卓系统APP,便... 你有没有想过,一部手机就能带你走进电影的世界,享受大屏幕带来的震撼?今天,就让我带你详细了解武汉摩尔...
联想刷安卓p系统,畅享智能新体... 你有没有发现,最近联想的安卓P系统刷机热潮可是席卷了整个互联网圈呢!这不,我就迫不及待地来和你聊聊这...
mac从安卓系统改成双系统,双... 你有没有想过,你的Mac电脑从安卓系统改成双系统后,生活会有哪些翻天覆地的变化呢?想象一边是流畅的苹...