Spring 中有两种类型的 Bean, 一种是普通Bean, 另一种是工厂Bean, 即FactoryBean.
工厂 Bean 跟普通Bean不同, 其返回的对象不是指定类的一个实例, 其返回的是该工厂 Bean 的 getObject 方法所返回的对象
1)普通 bean:在配置文件中定义 bean 类型就是返回类型
2)工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样
1)创建类,让这个类作为工厂 bean,实现接口 FactoryBean
package com.dianchou.spring.bean; import com.dianchou.spring.dao.Course; import org.springframework.beans.factory.FactoryBean; /** * @author lawrence * @create 2020-07-07 16:29 */ public class MyBean implements FactoryBean<Course> { //定义返回 bean @Override public Course getObject() throws Exception { Course course = new Course(); course.setName("Math"); return course; } @Override public Class<?> getObjectType() { return null; } @Override public boolean isSingleton() { return false; } }
2)spring配置文件配置
<bean id="myBean" class="com.dianchou.spring.bean.MyBean"></bean>
3)测试
@Test public void testMyBean(){ ApplicationContext ctx = new ClassPathXmlApplicationContext("bean3.xml"); Course course = ctx.getBean("myBean", Course.class); System.out.println(course); }
1)在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域.
2)默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域
3)singleton 和 prototype 区别
①singleton 单实例,prototype 多实例
②设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象 ;设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用 getBean 方法时候创建多实例对象
从对象创建到对象销毁的过程
(1)通过构造器创建 bean 实例(无参数构造)
(2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
(3)调用 bean 的初始化的方法(需要进行配置初始化的方法)
(4)bean 可以使用了(对象获取到了)
(5)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)
1)创建实体类
package com.dianchou.spring.bean; /** * @author lawrence * @create 2020-07-07 17:18 */ public class Person { private String Name; public Person() { System.out.println("第一步: 执行无参构造器创建Bean对象"); } public void setName(String name) { Name = name; System.out.println("第二步: 调用set方法设置属性值"); } public void initMethod(){ System.out.println("第三步: 执行初始化方法"); } public void destroyMethod(){ System.out.println("第五步: 执行销毁方法"); } }
2)spring配置文件
<bean id="person" class="com.dianchou.spring.bean.Person" init-method="initMethod" destroy-method="destroyMethod"> <property name="name" value="lawrence"></property> </bean>
3)测试
@Test public void testBean() { // ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml"); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml"); Person person = context.getBean("person", Person.class); System.out.println("第四步 获取创建 bean 实例对象"); System.out.println(person); //手动让 bean 实例销毁 context.close(); }
原文:https://www.cnblogs.com/hujinzhong/p/13261567.html