Spring中的对象实例化策略包括三种:单例模式、原型模式和会话作用域模式。
Spring中对象实例化策略有三种:单例模式(Singleton)、原型模式(Prototype)和会话作用域模式(Session-scope)。
- 单例模式(Singleton)
当Spring容器实例化一个bean时,将创建该bean的唯一实例。以后如果需要这个bean,容器中就会创建该bean的引用。单例模式是Spring默认使用的实例化策略。优点是:内存消耗小,程序运行速度快。缺点是:当同时有多个线程使用该bean时,可能会出现线程安全问题。
- 原型模式(Prototype)
当Spring容器实例化一个bean时,将创建该bean的新实例。每次获取bean时都会创建一个新的实例。每个实例之间相互¥¥。优点是:避免了单例模式的线程安全问题,每个对象状态都是¥¥的,更容易写出高质量的代码。缺点是:实例化的时间较长,内存占用大,程序运行速度慢。
- 会话作用域模式(Session-scope)
当Spring容器实例化一个bean时,将创建该bean的唯一实例,并将其绑定到当前会话上下文中。在同一session内获取该bean的引用时,返回的都是同一个实例。新会话将触发新的实例创建。优点是:保证同一session内使用的对象是同一个实例,线程安全性得到保证。缺点是:容易造成内存泄漏,当session被销毁之前,Bean所占用的空间不能够GC回收。 下面是具体代码实例:
-
单例模式: @Service public class MyService {
private String message = "Hello, World!";
public void printMessage() { System.out.println(message); }
}
在该代码中,@Service 注释表示将 MyService 类注册为 Spring 应用程序上下文中的 bean,并且默认情况下,该 bean 将以单例模式进行实例化。因此,在应用程序中的任何位置自动注入 MyService 时,它将始终引用相同的实例。 2. 原型模式: @Component @Scope("prototype") public class MyBean {
public MyBean() {
System.out.println("MyBean instance created.");
}
public void doSomething() {
System.out.println("MyBean is doing something.");
}
} 在该代码中,@Component 注释被用于将 MyBean 类注册为 Spring 应用程序上下文中的 bean,并且 @Scope("prototype") 表示该 bean 将以原型模式进行实例化。因此,在应用程序中的任何位置自动注入 MyBean 时,每次都会创建新的实例。 3. 会话作用域模式: 4. @Component @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) public class ShoppingCart {
private List<Item> items = new ArrayList<>();
public void addItem(Item item) {
items.add(item);
}
public List<Item> getItems() {
return items;
}
} 在该代码中,@Component 注释用于将 ShoppingCart 类注册为 Spring 应用程序上下文中的 bean,并且 @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 表示该 bean 将以会话作用域模式进行实例化。因此,在同一用户会话期间自动注入 ShoppingCart 时,它始终引用