- bean的两种类型:普通和工厂(FactoryBean)
(b站弹幕:病有两种,普通病和工厂病hhh) - 普通bean:在配置文件中定义bean类型就是返回类型
- 工厂bean:在配置文件中定义bean类型可以和返回类型不一样
第一步:创建类,让这个类作为工厂bean,实现接口FactoryBean
第二步:实现接口里面的方法,在实现的方法中定义返回的bean类型
public class MyBean implements FactoryBeanBean的作用域{ @Override public boolean isSingleton() { return FactoryBean.super.isSingleton(); } //定义返回bean(Course类型) @Override public Course getObject() throws Exception { Course course=new Course(); course.setCname("我病里的课程"); return course; } @Override public Class> getObjectType() { return null; } }
- 在spring里面,设置创建bean实例是单实例还是多实例
- 在spring里面,默认情况下,bean是单实例对象
结果,两个book地址相同,即单实例对象
- 如何设置单实例还是多实例?
(1)在spring配置文件bean标签里面scope属性用于设置单实例还是多实例
(2)scope属性值:默认singleton,表示单实例对象;prototype,表示多实例对象
结果,两个book地址不同,即多实例对象
(3)singleton和prototype区别
第一,singleton单实例,prototype多实例
第二,设置scope值是singleton时,加载spring配置文件时就会创建单实例对象;设置scope值是prototype时,不是在加载spring配置文件时创建对象,而是在调用getBean方法时创建多实例对象
- 声明周期:从对象创建到对象销毁的过程
- bean的生命周期
(1)通过构造器创建bean实例(无参数构造)
(2)为bean的属性设置值和对其他bean引用(调用set方法)
(3)调用bean的初始化方法(需要进行配置)
(4)bean可以使用了(对象获取到了)
(5)当容器关闭的时候,调用bean销毁的方法(需要进行配置销毁的方法) - bean生命周期演示
//配置文件(初始化和销毁方法需要配置)//1. public Orders() { System.out.println("第一步 执行无参数构造创建bean实例"); } //2. public void setOname(String oname) { this.oname = oname; System.out.println("第二步 调用set方法 注入属性的值"); } //3. public void initMethod(){ System.out.println("第三步 执行初始化方法"); } //4. @Test public void testAdd(){ ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml"); Orders orders =context.getBean("orders", Orders.class); System.out.println("第四步 获取创建bean实例对象"); System.out.println(orders); ((ClassPathXmlApplicationContext)context).close();//手动让bean销毁 } //5. public void destroyMethod() { System.out.println("第五步 执行销毁方法"); }
- bean的后置处理器,bean生命周期有七步
(1)通过构造器创建bean实例(无参数构造)
(2)为bean的属性设置值和对其他bean引用(调用set方法)
(3)把bean实例传递bean后置处理器的方法:postProcessBeforeInitialization()
(4)调用bean的初始化方法(需要进行配置)
(5)把bean实例传递bean后置处理器的方法:postProcessAfterInitialization()
(6)bean可以使用了(对象获取到了)
(7)当容器关闭的时候,调用bean销毁的方法(需要进行配置销毁的方法) - 添加后置处理器效果演示
创建类,实现接口BeanPostProcessor,创建后置处理器
public class MyBeanPost implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化之前执行的方法");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化之后执行的方法");
return bean;
}
}
七步运行结果:
- 什么是自动装配?
根据指定装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入 - 自动装配过程演示
- 注意:一般不懂XML方式进行自动装配,而是注解方式自动装配



