0


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

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



前言

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

一、基于 xml 方式创建对象

在这里插入图片描述

⭕在

spring

配置文件中,使用

bean

标签,标签里面添加对应属性,就可以实现对象创建

⭕在

bean

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

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

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

二、基于 xml 方式注入属性

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

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

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

//演示使用 set 方法进行注入属性publicclassPerson{privateString name;privateString food;publicvoidsetName(String name){this.name = name;}publicvoidsetFood(String food){this.food = food;}publicvoideat(){System.out.println(this.name+"吃"+this.food);}}

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

<!--配置 Person 对象创建--><beanid="person_ir"class="com.ir.spring5.Person"><!--使用 property 完成属性注入
            name:类里面属性名称
            value:向属性注入的值
        --><propertyname="name"value="小老师ir"></property><propertyname="food"value="java"></property></bean>

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

③ 测试代码:

@TestpublicvoidtestEat(){//1.加载spring配置文件                                                                       ApplicationContext context =newClassPathXmlApplicationContext("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. 使用有参数构造进行属性注入

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

packagecom.ir.spring5;publicclassCar{privateString number;privateString speed;publicCar(String number,String speed){this.number = number;this.speed = speed;}publicvoidrun(){System.out.println(number+"::"+speed);}}

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

<!--配置 Car 对象创建--><beanid="car_ir"class="com.ir.spring5.Car"><!--有参数构造注入属性--><!--方式1:通过name属性来确定类中的属性名--><constructor-argname="number"value="01"></constructor-arg><constructor-argname="speed"value="200"></constructor-arg><!--方式2:通过索引来确定属性名--><!--  <constructor-arg index="0" value="01"></constructor-arg>--><!--  <constructor-arg index="1" value="200"></constructor-arg>--></bean>

测试:

@TestpublicvoidtestCar(){//1.加载配置文件                                                                             ApplicationContext context =newClassPathXmlApplicationContext("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 标签里面进行操作

<beanid="person_ir"class="com.ir.spring5.Person"p:name="小老师ir"p:food="c++"></bean>

三、xml 注入其它类型属性

1. 字面量

⭕ null 值

<beanid="person_ir"class="com.ir.spring5.Person"><propertyname="name"><null/></property><propertyname="food"value="java"></property></bean>
@TestpublicvoidtestEat(){ApplicationContext context =newClassPathXmlApplicationContext("bean1.xml");Person person = context.getBean("person_ir",Person.class);System.out.println(person);//com.ir.spring5.Person@1b26f7b2                  
    person.eat();//[null]吃java                                                  

⭕ 属性值包含特殊符号

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

&lt;
&gt;
<beanid="person_ir"class="com.ir.spring5.Person"><propertyname="name"value="&lt;小老师ir&gt;"></property><propertyname="food"value="java"></property></bean>
@TestpublicvoidtestEat(){ApplicationContext context =newClassPathXmlApplicationContext("bean1.xml");Person person = context.getBean("person_ir",Person.class);System.out.println(person);//com.ir.spring5.Person@a74868d              
    person.eat();//<小老师ir>吃java                                                  

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

<beanid="person_ir"class="com.ir.spring5.Person"><propertyname="name"><value><![CDATA[<<小老师ir>>]]></value></property><propertyname="food"value="java"></property></bean>
@TestpublicvoidtestEat(){//1.加载spring配置文件                                                             ApplicationContext context =newClassPathXmlApplicationContext("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

packageDao;/**
 * @author shkstart
 * @create 2022-05-07 23:08
 */publicinterfaceUserDao{publicvoidupdate();}

UserService

packageService;importDao.UserDao;/**
 * @author shkstart
 * @create 2022-05-07 23:08
 */publicclassUserService{//创建 UserDao 类型属性,生成 set 方法privateUserDao userDao;publicvoidsetUserDao(UserDao userDao){this.userDao = userDao;}publicvoidadd(){System.out.println("service add...............");
        userDao.update();}}

UserDaoImpl

packageDao;/**
 * @author shkstart
 * @create 2022-05-07 23:08
 */publicclassUserDaoImplimplementsUserDao{@Overridepublicvoidupdate(){System.out.println("dao update...........");}}

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

<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd"><!--创建 UserService 对象--><beanid="userservice"class="Service.UserService"><!--注入 userDao 对象
           name 属性:类里面属性名称
           ref 属性:创建 userDao 对象 bean 标签 id 值
        --><propertyname="userDao"ref="userdaoimpl"></property></bean><!--创建 UserDaoImpl 对象--><beanid="userdaoimpl"class="Dao.UserDaoImpl"></bean></beans>

测试:

@TestpublicvoidtestBean(){ApplicationContext context1 =newClassPathXmlApplicationContext("bean2.xml");UserService userService =(UserService)context1.getBean("userservice");System.out.println(userService);//Service.UserService@eafc191
       userService.add();//       service add...............//       dao update...........}

3. 注入属性-内部 bean

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

部门类

packageBean;publicclassDept{privateString dname;publicvoidsetDname(String dname){this.dname = dname;}@OverridepublicStringtoString(){return"Dept{"+"dname='"+ dname +'\''+'}';}}

员工类

packageBean;publicclassEmp{privateString ename;privateString gender;//员工属于某一个部门,使用对象形式表示privateDept dept;publicvoidsetDept(Dept dept){this.dept = dept;}publicvoidsetEname(String ename){this.ename = ename;}publicvoidsetGender(String gender){this.gender = gender;}publicvoidadd(){System.out.println(ename+"::"+gender+"::"+dept);}}

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

<!--内部bean--><beanid="emp"class="Bean.Emp"><!--设置两个属性--><propertyname="ename"value="小老师ir"></property><propertyname="gender"value="女"></property><!--设置对象类型属性--><propertyname="dept"><beanid="dept"class="Bean.Dept"><propertyname="dname"value="安保部"></property></bean></property></bean>

测试

@TestpublicvoidtestEmp(){ApplicationContext context =newClassPathXmlApplicationContext("bean3.xml");Emp emp =(Emp)context.getBean("emp");System.out.println(emp);//Bean.Emp@69b0fd6f
       emp.add();//小老师ir::女::Dept{dname='安保部'}}

4. 注入属性-级联赋值

方式一:

在 spring 配置文件

bean4.xml

中进行配置

<!--级联赋值--><beanid="emp"class="Bean.Emp"><!--设置两个普通属性--><propertyname="ename"value="小老师ir"></property><propertyname="gender"value="女"></property><!--级联赋值--><propertyname="dept"ref="dept"></property></bean><beanid="dept"class="Bean.Dept"><propertyname="dname"value="技术部"></property></bean>

测试:

@TestpublicvoidtestEmp2(){ApplicationContext context =newClassPathXmlApplicationContext("bean4.xml");Emp emp =(Emp)context.getBean("emp");System.out.println(emp);//Bean.Emp@462d5aee
       emp.add();//小老师ir::女::Dept{dname='技术部'}}

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

<!--级联赋值--><beanid="emp"class="Bean.Emp"><!--设置两个普通属性--><propertyname="ename"value="小老师ir"></property><propertyname="gender"value="女"></property><!--级联赋值--><propertyname="dept"ref="dept"></property><propertyname="dept.dname"value="技术部"></property></bean><beanid="dept"class="Bean.Dept"></bean>

测试:

@TestpublicvoidtestEmp3(){ApplicationContext context =newClassPathXmlApplicationContext("bean4.xml");Emp emp =(Emp)context.getBean("emp");System.out.println(emp);//Bean.Emp@757942a1
       emp.add();//小老师ir::女::Dept{dname='技术部'}}

注意:此种方法中,

Emp

类中必须有

getDept( )

方法

在这里插入图片描述

四、xml 注入集合属性

1. 注入数组类型属性

2. 注入 List 集合类型属性

3. 注入 Map 集合类型属性

步骤:

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

Stu类

publicclassStu{//1 数组类型属性privateString[] courses;//2 list集合类型属性privateList<String> list;//3 map集合类型属性privateMap<String,String> maps;//4 set集合类型属性privateSet<String> sets;publicvoidsetSets(Set<String> sets){this.sets = sets;}publicvoidsetCourses(String[] courses){this.courses = courses;}publicvoidsetList(List<String> list){this.list = list;}publicvoidsetMaps(Map<String,String> maps){this.maps = maps;}@OverridepublicStringtoString(){return"Stu{"+"courses="+Arrays.toString(courses)+", list="+ list +", maps="+ maps +", sets="+ sets +'}';}}

② 在 spring 配置文件进行配置

<beanid="student"class="collectiontest.Stu"><!--注入数组属性--><propertyname="courses"><array><value>Java</value><value>C++</value></array></property><!--注入list属性--><propertyname="list"><list><value>Python</value><value>Go</value></list></property><!--注入map属性--><propertyname="maps"><map><entrykey="小老师ir"value="Java"></entry><entrykey="小老师ir"value="C++"></entry></map></property><!--注入set属性--><propertyname="sets"><set><value>喜羊羊</value><value>美羊羊</value></set></property></bean>

测试:

@Testpublicvoidtest(){ApplicationContext context =newClassPathXmlApplicationContext("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类

publicclassStu{//1 数组类型属性privateString[] courses;//2 list集合类型属性privateList<String> list;//3 map集合类型属性privateMap<String,String> maps;//4 set集合类型属性privateSet<String> sets;//学生所学多门课程privateList<Course> courseList;publicvoidsetCourseList(List<Course> courseList){this.courseList = courseList;}publicvoidsetSets(Set<String> sets){this.sets = sets;}publicvoidsetCourses(String[] courses){this.courses = courses;}publicvoidsetList(List<String> list){this.list = list;}publicvoidsetMaps(Map<String,String> maps){this.maps = maps;}@OverridepublicStringtoString(){return"Stu{"+"courses="+Arrays.toString(courses)+", list="+ list +", maps="+ maps +", sets="+ sets +", courseList="+ courseList +'}';}}

Course类

//课程类publicclassCourse{privateString cname;//课程名称publicvoidsetCname(String cname){this.cname = cname;}@OverridepublicStringtoString(){return"Course{"+"cname='"+ cname +'\''+'}';}}

在 spring 配置文件进行配置

<!--创建多个 course 对象--><beanid="course1"class="collectiontest.Course"><propertyname="cname"value="英语课"></property></bean><beanid="course2"class="collectiontest.Course"><propertyname="cname"value="语文课"></property></bean><beanid="course3"class="collectiontest.Course"><propertyname="cname"value="数学课"></property></bean><!--创建Stu对象--><beanid="student1"class="collectiontest.Stu"><!--注入 list 集合类型,值是对象--><propertyname="courseList"><list><refbean="course1"></ref><refbean="course2"></ref><refbean="course3"></ref></list></property></bean>

测试

@Testpublicvoidtest(){ApplicationContext context =newClassPathXmlApplicationContext("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类·

publicclassBook{privateList<String> list;publicvoidsetList(List<String> list){this.list = list;}@OverridepublicStringtoString(){return"Book{"+"list="+ list +'}';}}

步骤:

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

在这里插入图片描述

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

<!--1 提取list集合类型属性注入--><util:listid="bookList"><value>java</value><value>c++</value><value>python</value></util:list><!--2 提取list集合类型属性注入使用--><beanid="book"class="collectiontest.Book"scope="prototype"><propertyname="list"ref="bookList"></property></bean>

测试

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

五、bean作用域

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

Book类

publicclassBook{privateList<String> list;publicvoidsetList(List<String> list){this.list = list;}}

在 spring 配置文件进行配置

<!--1 提取list集合类型属性注入--><util:listid="bookList"><value>java</value><value>c++</value><value>python</value></util:list><!--2 提取list集合类型属性注入使用--><beanid="book"class="collectiontest.Book"><propertyname="list"ref="bookList"></property></bean>

测试:

@Testpublicvoidtest(){ApplicationContext context =newClassPathXmlApplicationContext("bean2.xml");Book book1= context.getBean("book",Book.class);Book book2= context.getBean("book",Book.class);System.out.println(book1);//[email protected](book2);//collectiontest.Book@27d415d9}

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

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

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

在 spring 配置文件进行配置

<!--1 提取list集合类型属性注入--><util:listid="bookList"><value>java</value><value>c++</value><value>python</value></util:list><!--2 提取list集合类型属性注入使用--><beanid="book"class="collectiontest.Book"scope="prototype"><propertyname="list"ref="bookList"></property>y
    </bean>

测试:

@Testpublicvoidtest(){ApplicationContext context =newClassPathXmlApplicationContext("bean2.xml");Book book1= context.getBean("book",Book.class);Book book2= context.getBean("book",Book.class);System.out.println(book1);//[email protected](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类

publicclassOrder{privateString name;publicOrder(){System.out.println("第一步:执行无参构造器创建对象");}publicvoidsetName(String name){this.name = name;System.out.println("第二步:调用set()方法设置属性值");}publicvoidinitMethod(){System.out.println("第三步:执行初始化方法");}publicvoiddestroyMethod(){System.out.println("第五步:执行销毁的方法");}}

在 spring 配置文件进行配置

<beanid="order"class="collectiontest.Order"init-method="initMethod"destroy-method="destroyMethod"><propertyname="name"value="电脑订单"></property></bean>

测试:

@Testpublicvoidtest(){ClassPathXmlApplicationContext context =newClassPathXmlApplicationContext("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,创建后置处理器

publicclassMyBeanPostimplementsBeanPostProcessor{@OverridepublicObjectpostProcessBeforeInitialization(Object bean,String beanName)throwsBeansException{System.out.println("在初始化之前执行的方法");return bean;}@OverridepublicObjectpostProcessAfterInitialization(Object bean,String beanName)throwsBeansException{System.out.println("在初始化之后执行的方法");return bean;}}

在 spring 配置文件进行配置

<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置order对象--><beanid="order"class="bean.Order"init-method="initMethod"destroy-method="destroyMethod"><propertyname="name"value="电脑订单"></property></bean><!--配置后置处理器--><beanid="mybeanpost"class="bean.MyBeanPost"></bean></beans>

测试:

@Testpublicvoidtest(){ClassPathXmlApplicationContext context =newClassPathXmlApplicationContext("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类

publicclassDept{privateString name;publicvoidsetName(String name){this.name = name;}@OverridepublicStringtoString(){return"Dept{"+"name='"+ name +'\''+'}';}}

Emp类

publicclassEmp{privateDept dept;publicvoidsetDept(Dept dept){this.dept = dept;}@OverridepublicStringtoString(){return"Emp{"+"dept="+ dept +'}';}}

在 spring 配置文件进行配置

<!--创建emp对象--><!--使用自动装配方式注入属性:通过属性名的方式--><beanid="emp"class="bean.Emp"autowire="byName"><!--使用手动方式注入属性--><!--        <property name="dept" ref="dept"></property>--></bean><!--创建dept对象--><beanid="dept"class="bean.Dept"><propertyname="name"value="技术部"></property></bean>

测试:

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

● 根据属性类型自动注入

<!--创建emp对象--><!--使用自动装配方式注入属性:通过属性类型的方式--><beanid="emp"class="bean.Emp"autowire="byType"><!--使用手动方式注入属性--><!--        <property name="dept" ref="dept"></property>--></bean><!--创建dept对象--><beanid="dept"class="bean.Dept"><propertyname="name"value="技术部"></property></bean>

测试:

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

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

八、外部属性文件

⭕ 直接配置数据库信息

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

<!--创建数据库连接池对象--><beanid="dataSource"class="com.alibaba.druid.pool.DruidDataSource"><!--直接对连接池进行属性配置--><propertyname="driverClassName"value="com.mysql.jdbc.Driver"></property><propertyname="url"value="jdbc:mysql://localhost:3306/userDb"></property><propertyname="username"value="root"></property><propertyname="password"value="root"></property></bean>

⭕ 引入外部属性文件配置数据库连接池
(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 配置文件使用标签引入外部属性文件

<!--引入外部属性文件--><context:property-placeholderlocation="classpath:jdbc.properties"/><!--创建数据库连接池对象--><beanid="dataSource"class="com.alibaba.druid.pool.DruidDataSource"><!--对连接池进行属性配置--><propertyname="driverClassName"value="com.mysql.jdbc.Driver"></property><propertyname="url"value="jdbc:mysql://localhost:3306/userDb"></property><propertyname="username"value="root"></property><propertyname="password"value="root"></property></bean>

九、FactoryBean

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

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

步骤:

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

Course类

publicclassCourse{privateString cname;//课程名称publicvoidsetCname(String cname){this.cname = cname;}publicStringgetCname(){returnthis.cname;}@OverridepublicStringtoString(){return"Course{"+"cname='"+ cname +'\''+'}';}}
publicclassMyBeanimplementsFactoryBean<Course>{@OverridepublicCoursegetObject()throwsException{Course course =newCourse();
        course.setCname("Java");return course;}@OverridepublicClass<?>getObjectType(){returnnull;}}

③ 在 spring 配置文件进行配置

<!--创建MyBean对象--><beanid="mybean"class="factorybean.MyBean"></bean>

测试:

@Testpublicvoidtest(){ApplicationContext context =newClassPathXmlApplicationContext("bean3.xml");Course course= context.getBean("mybean",Course.class);System.out.println(course.getCname());//Java}
标签: xml java spring

本文转载自: https://blog.csdn.net/weixin_52533007/article/details/124617862
版权归原作者 _GGBond_ 所有, 如有侵权,请联系我们删除。

“spring5(三):IOC操作Bean管理(基于xml方式)”的评论:

还没有评论