代码之家  ›  专栏  ›  技术社区  ›  Ryuzaki L

singletonbean如何在spring boot的不同地方自动连接

  •  0
  • Ryuzaki L  · 技术社区  · 6 年前

    @Service bean可以是的注释 @Autowired 只有一个类(如果我错了,请纠正我)中的代码可以正常工作,但我试图理解它是如何工作的?一颗豆子怎么可能 @自动连线 在两个不同的班级?

    怎么 SampleService @自动连线 在里面 SampleController2 SampleController3 一次?

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

    样本控制器2

    @RestController
    @RequestMapping(value="samplemock")
    public class SampleController2 {
    
    @Autowired
    private SampleService2 sampleservice2;
    
    @RequestMapping(value="/mock1",method=RequestMethod.GET)
    public void mockCall1() {
        sampleservice2.m1();
       }
    
    }
    

    样本控制器3

    @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");
        }
     }
    
    3 回复  |  直到 6 年前
        1
  •  4
  •   Andreas dfa    6 年前

    这是一个 简化 查看Spring在启动时的作用:

    // Create bean: sampleService2
    SampleService2 sampleService2 = new SampleService2();
    
    // Create bean: sampleController2
    SampleController2 sampleController2 = new SampleController2();
    sampleController2.sampleservice2 = sampleService2; // because @Autowired
    
    // Create bean: sampleController3
    SampleController3 sampleController3 = new SampleController3();
    sampleController3.sampleservice2 = sampleService2; // because @Autowired
    

    正如你所看到的,独生子豆子 sampleService2 自动连接到两个 sampleController2 sampleController3 .

        2
  •  4
  •   Gustavo Passini    6 年前

    默认情况下,正如您所提到的,所有springbean都是单例的,但是您的第二个假设是错误的:同一个bean可以在许多其他bean中自动连接。

    事实上,这就是他们成为独生子女的意义所在。

    这也意味着两个不同的线程可以改变同一个bean的状态。由于这个原因,您大多数时候都希望保持bean无状态。

    prototype . 看到了吗 Spring bean scopes docs .

        3
  •  0
  •   Makoto    6 年前

    依赖注入和控制反转背后的意图很简单:

    • 你定义你的注射剂(比如服务) 一旦 ,他们是 实例化一次 (除非您另有说明)。
    • 那些注射剂是

    在这一点上,您可以使用bean优先级、限定符和应用程序概要文件来获得有趣和令人兴奋的内容,但这只是一般的想法。

    举个具体的例子: javax.sql.DataSource 是一个由许多JDBC支持的解决方案(如MySQL、Postgres、Oracle和其他)实现的接口。如果希望有两个不同的bean与两个不同的数据库对话,但是您希望能够互换地使用这些bean,那么您定义了一个类型的bean DataSource 使用和配置 哪一个 创建数据源。同样,这也涉及到 @Qualifier 以确保在最适当的时间连接最特定的bean。

    另外,最后一点对于回答您的这部分问题非常重要:

    它是 创建具有自身固有状态的可注入bean是不明智的。也就是说,如果你有 SampleService 将自身附加到某种缓存状态,其中包含一个集合,这基本上违反了预期,因为您不知道该集合何时或多久会有元素添加到其中或从中移除。