spring有两种类型的bean,一个是普通的bean,一个是工厂bean。
普通bean:在配置文件中定义bean就是返回的类型
工厂bean:在配置文件中定义bean可以和返回的类型不一样
步骤:1创建类,让这个类作为工厂bean实现接口FactoryBean
2.实现接口里面的方法,在实现的方法中定义返回的bean类型
1 package com.me.zhuru; 2 3 import org.springframework.beans.factory.FactoryBean; 4 5 /** 6 * @author sbr 7 * @create 2020-11-09 22:23 8 */ 9 public class MyBean implements FactoryBean<Course> { 10 11 //设置返回bean的对象 12 public Course getObject() throws Exception { 13 Course course=new Course(); 14 course.setCourseName("haha"); 15 return course; 16 } 17 18 public Class<?> getObjectType() { 19 return null; 20 } 21 22 public boolean isSingleton() { 23 return false; 24 } 25 }
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:util="http://www.springframework.org/schema/util" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 6 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> 7 <bean id="myBean" class="com.me.zhuru.MyBean"></bean> 8 </beans>
@Test public void test8(){ ApplicationContext context = new ClassPathXmlApplicationContext("bean7.xml"); Course Course = context.getBean("myBean",Course.class); System.out.println(Course); }
需要注意的是在这里设置返回的对象
在测试类中也要相应的进行更改
bean默认为单实例对象,也可以修改为多实例对象,例如不做特殊操作:
在最先的代码中可以实例化两个对象并输出发现地址是一样的,因此默认为单实例对象。
设置为多实例
这个scope不写默认为singleton,写了prototype就为多实例对象,测试:
运行相同的代码发现地址已经改变
另外singleton和prototype的区别:singleton在加载spring配置文件的时候就会创建单实例对象,而prototype,不是在加载spring配置文件的时候创建对象,在调用getBean方法的时候创建多实例对象。
6