如何在不同的地方自动装配 Singleton bean spring boot

在这一点上我很困惑,我知道所有的 Spring Boot 应用程序 bean 都是单例的,根据我的理解,如果我们用@Service注释注释了 bean 只能@Autowired在一个类中(如果我错了,请纠正我)这里是代码工作正常,但我想了解它是如何工作的?一个bean如何@Autowired在两个不同的类中?


如何SampleService豆可以@Autowired在SampleController2和SampleController3在同一时间?


这是推荐的方法吗?在这种情况下,两个线程可以并行更改 bean 中的数据吗?


SampleController2


@RestController

@RequestMapping(value="samplemock")

public class SampleController2 {


@Autowired

private SampleService2 sampleservice2;


@RequestMapping(value="/mock1",method=RequestMethod.GET)

public void mockCall1() {

    sampleservice2.m1();

   }


}

SampleController3


@RestController

@RequestMapping(value="samplemock2")

public class SampleController3 {


@Autowired

private SampleService2 sampleservice2;


@RequestMapping(value="/mock1",method=RequestMethod.GET)

public void mockCall1() {

    sampleservice2.m1();


   }

 }

SampleService2


@Service

 public class SampleService2 {


public void m1() {

    System.out.println("bean is autowired");

    }

 }


哈士奇WWW
浏览 160回答 3
3回答

紫衣仙女

这是Spring 在启动时所做的事情的简化视图:// Create bean: sampleService2SampleService2 sampleService2 = new SampleService2();// Create bean: sampleController2SampleController2 sampleController2 = new SampleController2();sampleController2.sampleservice2 = sampleService2; // because @Autowired// Create bean: sampleController3SampleController3 sampleController3 = new SampleController3();sampleController3.sampleservice2 = sampleService2; // because @Autowired如您所见,单例 beansampleService2自动装配到sampleController2和 中sampleController3。这些 bean 被添加到存储库中,因此您可以在以后的任何时间点按名称或类型查找它们。

达令说

默认情况下,正如您提到的,所有 Spring bean 都是单例,但您的第二个假设是错误的:同一个 bean 可以在许多其他 bean 中自动装配。事实上,这就是他们成为单身人士的全部意义所在。这也意味着两个不同的线程确实可以改变同一个 bean 的状态。出于这个原因,您大部分时间都希望保持您的 bean 无状态。如果您真的需要为每个自动装配的位置拥有一个不同的 bean 实例,您可以将该 bean 的范围更改为prototype. 请参阅Spring bean 范围文档。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java