❤️❤️❤️Spring专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️
Spring_冷兮雪的博客-CSDN博客
前面我们讲完了Spring中有关Bean的读和取,我们还没有好好去了解了解Bean对象,这篇 就是对Bean的深入学习。
Singleton 单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供该实例的全局访问点。
使用 Singleton 模式的主要目的是确保在一个应用程序中,某个类的对象只有一个,这样可以节省系统资源,避免对同一数据的多重处理等问题。在实现时,我们需要注意线程安全、延迟初始化、序列化和反射等方面的问题。
一般来说,Singleton 模式适用于那些需要频繁访问的对象,例如日志记录器、数据库连接池、线程池等等。
@Component public class Users { @Bean public User user1() { User user = new User(); user.setId(1); user.setName("Java"); // 【重点:名称是 Java】 return user; } }A 用户使用时,进行了修改操作:
@Controller public class BeanScopesController { @Autowired private User user1; public User getUser1() { User user = user1; System.out.println("Bean 原 Name:" + user.getName()); user.setName("悟空"); // 【重点:进⾏了修改操作】 return user; } }B 用户再去使用公共 Bean 的时候:
@Controller public class BeanScopesController2 { @Autowired private User user1; public User getUser1() { User user = user1; return user; } }打印 A 用户和 B 用户公共 Bean 的值:
public class App { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); BeanScopesController beanScopesController = context.getBean("beanScopesController",BeanScopesController.class); System.out.println("A 对象修改之后 " + beanScopesController.getUser1().toString()); BeanScopesController2 beanScopesController2 = context.getBean("beanScopesController2",BeanScopesController2.class); System.out.println("B 对象读取到的 " + beanScopesController2.getUser1().toString()); } }
运行结果:
其中前两种是 spring 核心作用域,而后 4 种是 spring mvc 中的作用域。
Spring 框架默认采用 Singleton 单例模式,主要是因为以下几点原因:
资源消耗较少:使用单例模式可以避免频繁创建对象,节约系统资源,提升系统性能。
对象复用:当多个组件需要使用同一个对象时,采用单例模式可以确保这些组件使用的是同一个对象,保证了对象的一致性和正确性。
统一管理:采用单例模式可以方便地对对象进行统一管理,例如设置各种属性、初始化等操作。
易于扩展:当需要增加或修改某个类的实现时,只需要修改该类的单例实例即可,无需修改其他代码。
想了解或者复习单例模式可以看这篇文章:
面试突击50:单例模式有几种写法? - 掘金 (juejin.cn)
设置作用域有两种方法:
Ⅰ、直接设置值:@Scope("prototype")🍓
还是前面的代码,我们给user1设置prototype作用域 (也可以设置成其他作用域)
运行:
通过@Scope(ConfigurableListableBeanFactory.SCOPE_PROTOTYPE)修改作用域
我们运行代码也可以可以得到与 前一方法 相同的结果:
实例化:当Spring容器接收到一个Bean的定义时,会根据该定义创建一个Bean的实例。
属性赋值:创建Bean的实例后,Spring通过反射机制将Bean属性设置为相应的值。通常情况下,这些 Bean 属性的值来自于配置文件或注解等方式。
初始化:在Bean实例化并设置好所有属性之后,Spring容器将调用特定的方法对Bean进行初始化,例如执行自定义的初始化方法或BeanPostProcessor接口中的回调方法等。
使用:当Bean初始化完成后,它可以被Spring容器使用了。在此阶段,Bean可以响应容器中的请求,执行相应的业务逻辑。
销毁:当应用程序关闭或者Spring容器销毁时,会调用已注册的bean的销毁方法,以释放资源。这个销毁方法也可以是自定义的,需要实现DisposableBean接口或者添加@PreDestroy注解。
实例化和初始化是Bean生命周期中的两个不同阶段。
实例化:指根据配置文件或注解等方式,创建一个对象实例的过程。在Spring容器启动时,会根据定义的Bean定义信息创建相应的Bean实例,并将其添加到容器中进行管理。这个过程可以通过构造函数、工厂方法或者其他方式来实现。
初始化:指在Bean实例化后,进行必要的属性设置、调用接口方法以及执行自定义初始化方法等操作,使得Bean达到可以使用的状态。在Spring容器创建了Bean实例之后,会根据配置信息和需要执行一定的初始化操作,例如调用BeanPostProcessor接口中的回调方法、执行自定义的初始化方法等等。
总之,Bean的实例化和初始化是在Spring容器中管理Bean的重要环节,它们各自都有着不同的作用和实现方式。
上一篇:mysql核心知识整理