我的应用程序中有三个类(Class A ,Class B ,Class C )。
我是初学者。尝试使用@Autowired
注释在类 A 中注入类 B 的bean。我想利用spring bean的Singleton行为,以便只有Class B 的实例,无论从 A 类调用多少次。
Class B 中有一种方法,我想使用Class B 这个bean从Class A 调用它。我怎样才能做到这一点?
我知道如何在Java中实现单例类,然后获得唯一的实例来调用它的方法,但不知道如何使用spring singleton bean来实现它。
答案 0 :(得分:2)
Spring singleton被定义为"每个bean的每个容器"
如果你想在每个弹簧容器中使用单例,那么你需要在bean定义
中完成<bean id="myBean" class="MyBean"/>
如果你想要每个整个应用程序而不是每个容器的单例,那么我相信你能做到的唯一方法是实现一个Singleton模式有一个私有构造函数,从其静态方法如getInstance访问/检索它。你可以做的是让spring调用一个方法来反过来返回一个对象
<bean id="myBean" class="MyBean" factory-method="getInstance"></bean>
答案 1 :(得分:0)
标记为@Component
,@Service
,@Repository
等的每个类都是单身,但仅限于弹簧容器内。所以最好说它们在single scope。
@Component
public class MyBean {
[...]
}
在单例范围内定义bean的另一个选项是将方法标记为@Bean
。返回类型将被缓存,因此如果您调用此方法,则将始终使用相同的实例:
@Service
public class MyService {
[...]
@Bean
@Scope("singleton")
public MyOtherBean myOtherBean() { // singleton factory method
return [...];
}
}
但@Bean
只应在@Configuration
- bean中使用。在@Service
bean中,您可以注入所需的bean(@Autowired
)。