我是否应该在 spring 个单例 bean 中完全使用 static
Should I use static at all in spring singleton beans
正如我刚刚读到的,默认 我创建的 spring bean 是单例。我目前正在为我的记录器、重用变量和一些我希望只存在一次的列表使用静态关键字。
但是因为所有 bean 都是单例,所以我正在考虑从所有内容中删除 static。
private static final Logger LOGGER = LoggerFactory.getLogger(MatchmakingService.class);
private static final List<Lobby> QUEUE_BLOCKED = new ArrayList<>();
到
private final Logger logger = LoggerFactory.getLogger(MatchmakingService.class);
private final List<Lobby> queueBlocked = new ArrayList<>();
我的问题是,我是否应该在 spring 上下文中使用“static”?如果是,为什么?
在 class 中使用静态记录器通常是有意义的,如果它记录到相同的文件或输出流(例如 System.out
),无论哪个实例记录一些东西。代码片段中的队列是否应该是静态的取决于它的用途,没有更多细节无法回答。
Spring 旨在让您在绝大多数情况下都可以避免使用静态字段。
拥有一个静态最终的记录器是完全可以的。记录器是线程安全的,旨在以这种方式使用。
拥有静态最终常量是可以的。
除记录器外,应避免任何非不可变的静态内容。
也不要将实例变量用于会话状态(与服务调用者执行的操作相关的状态),因为其他调用者可以访问和更改该状态。
如果您使用实例或静态变量进行缓存,请删除它们并改为配置缓存管理器。
如果您的代码将配置数据存储在静态字段中,请将它们设为实例字段并使用 spring 读取配置数据。
好问题。在我看来,如果您的业务场景始终处于相同的 spring 上下文中,则不应使用静态。原因是spring bean在一个spring上下文中是单一的。但是bean在不同的spring上下文中有不同的实例。下面是示例代码:
// The first Spring Bean Context
ApplicationContext context1 = new FileSystemXmlApplicationContext("classpath:/ApplicationContext.xml");
Biz b1 = context1.getBean("myBean", Biz.class);
// The second Spring Bean Context
ApplicationContext context2 = new FileSystemXmlApplicationContext("classpath:/ApplicationContext.xml");
Biz b2 = context2.getBean("myBean", Biz.class);
// The result is false, because of creating two instances of Biz
System.out.println(b1 == b2);
但是静态变量在一个JVM中只有一个实例。所以为了性能和健壮性,你应该更频繁地使用静态。换句话说,你不能在程序中将所有 class 作为 bean。
正如我刚刚读到的,默认 我创建的 spring bean 是单例。我目前正在为我的记录器、重用变量和一些我希望只存在一次的列表使用静态关键字。
但是因为所有 bean 都是单例,所以我正在考虑从所有内容中删除 static。
private static final Logger LOGGER = LoggerFactory.getLogger(MatchmakingService.class);
private static final List<Lobby> QUEUE_BLOCKED = new ArrayList<>();
到
private final Logger logger = LoggerFactory.getLogger(MatchmakingService.class);
private final List<Lobby> queueBlocked = new ArrayList<>();
我的问题是,我是否应该在 spring 上下文中使用“static”?如果是,为什么?
在 class 中使用静态记录器通常是有意义的,如果它记录到相同的文件或输出流(例如 System.out
),无论哪个实例记录一些东西。代码片段中的队列是否应该是静态的取决于它的用途,没有更多细节无法回答。
Spring 旨在让您在绝大多数情况下都可以避免使用静态字段。
拥有一个静态最终的记录器是完全可以的。记录器是线程安全的,旨在以这种方式使用。
拥有静态最终常量是可以的。
除记录器外,应避免任何非不可变的静态内容。
也不要将实例变量用于会话状态(与服务调用者执行的操作相关的状态),因为其他调用者可以访问和更改该状态。
如果您使用实例或静态变量进行缓存,请删除它们并改为配置缓存管理器。
如果您的代码将配置数据存储在静态字段中,请将它们设为实例字段并使用 spring 读取配置数据。
好问题。在我看来,如果您的业务场景始终处于相同的 spring 上下文中,则不应使用静态。原因是spring bean在一个spring上下文中是单一的。但是bean在不同的spring上下文中有不同的实例。下面是示例代码:
// The first Spring Bean Context
ApplicationContext context1 = new FileSystemXmlApplicationContext("classpath:/ApplicationContext.xml");
Biz b1 = context1.getBean("myBean", Biz.class);
// The second Spring Bean Context
ApplicationContext context2 = new FileSystemXmlApplicationContext("classpath:/ApplicationContext.xml");
Biz b2 = context2.getBean("myBean", Biz.class);
// The result is false, because of creating two instances of Biz
System.out.println(b1 == b2);
但是静态变量在一个JVM中只有一个实例。所以为了性能和健壮性,你应该更频繁地使用静态。换句话说,你不能在程序中将所有 class 作为 bean。