《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
我们用例子来认清singleton和prototype的区别:
1.singleton
由于singleton是默认属性,故不需要怎么配置:
测试:
@Test
public void test3(){
//解析bean3.xml文件 , 生成管理相应的Bean对象
ApplicationContext context = new ClassPathXmlApplicationContext(“bean3.xml”);
//getBean : 参数即为spring配置文件中bean的id .
Blog blog=context.getBean(“blogBean”,Blog.class);
Blog blog2=context.getBean(“blogBean”,Blog.class);
System.out.println(blog);
System.out.println(blog2);
}
输出:
可以看出两者是同一个对象。
2、prototype
测试:
@Test
public void test3(){
//解析bean3.xml文件 , 生成管理相应的Bean对象
ApplicationContext context = new ClassPathXmlApplicationContext(“bean3.xml”);
//getBean : 参数即为spring配置文件中bean的id .
Blog blog=context.getBean(“blogBean”,Blog.class);
Blog blog2=context.getBean(“blogBean”,Blog.class);
System.out.println(blog);
System.out.println(blog2);
}
输出:
可以看出在调用getBean方法时候会创建多实例对象。
根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
2 Bean的生命周期
===========
生命周期:从对象的创建到对象的销毁过程。
2.1 bean的生命周期
Bean的生命周期主要分为七步:
(1)通过构造器创建bean实例(无参数构造)
(2)为bean的属性设置值和对其他bean引用(调用set方法)
(3)把bean实例传递bean后置处理器的方法postProcessBeforeInitialization
(4)调用bean的初始化的方法(需要进行配置初始化的方法)
(5)把bean实例传递bean后置处理器的方法 postProcessAfterInitialization
(6)bean可以使用了(对象获取到了)
(7)当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)
2.2 演示生命周期
接下来我们通过代码来演示Bean的生命周期:
(1)创建类,实现接口BeanPostProcessor,创建后置处理器
package com.yixin.post;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPost implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println(“第三步:在初始化之前执行的方法”);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(“第五步:在初始化之后执行的方法”);
return bean;
}
}
(2)在XML文件中进行配置自定义的后置处理器
(3)编写实体类进行测试
package com.yixin.dao;
public class Book {
private int id;
private String name;
public Book(){
System.out.println(“第一步:执行无参构造方法创建bean实例”);
}
public Book(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
System.out.println(“第二步:调用set方法设置属性值”);
}
//创建执行的初始化的方法
public void initMethod() {
System.out.println(“第四步:执行初始化的方法”);
}
//创建执行的销毁的方法
public void destroyMethod() {
System.out.println(“第七步:执行销毁的方法”);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
(4)编写XML,并绑定该实体类的初始化方法和销毁方法。
(5)测试
@Test
public void test4(){
//解析bean4.xml文件 , 生成管理相应的Bean对象
ApplicationContext context = new ClassPathXmlApplicationContext(“bean4.xml”);
//getBean : 参数即为spring配置文件中bean的id .
Book book=context.getBean(“bookBean”,Book.class);
System.out.println(“第六步:获取创建bean实例对象”);
}
运行结果:
通过这样的演示,就可以很直观的看到Bean的生命周期了。
最后
面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典
- Java核心知识整理
Java核心知识
- Spring全家桶(实战系列)
- 其他电子书资料
Step3:刷题
既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。
以下是我私藏的面试题库:
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
心知识
- Spring全家桶(实战系列)
[外链图片转存中…(img-25TG1oyR-1714662606743)]
- 其他电子书资料
[外链图片转存中…(img-vhxc9HmZ-1714662606743)]
Step3:刷题
既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。
以下是我私藏的面试题库:
[外链图片转存中…(img-ve0nAQ6V-1714662606743)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!