Spring Boot - создание компонента в виде синглтона в контейнере IOC - PullRequest
0 голосов
/ 08 октября 2019

Предполагается, что создание бина будет синглтоном в контейнере пружины, правильно? Я переношу конфигурационный файл Spring в Spring Boot с аннотациями. У меня есть приведенный ниже код, но он, похоже, вызывает mySingletonBean () каждый раз, когда он используется в другом создании бина. Насколько я понимаю, аннотация @Bean по умолчанию считается синглтоном. Правильно ли я создаю свои Бобы?

@Bean
public SomeBean mySingletonBean() {
  SomeBean mybean = new SomeBean();
  mybean.setName = "Name";
  return mybean;
}

@Bean 
public Bean1 bean1() {
  Bean1 bean1 = new Bean1();
  bean1.setBean(mySingletonBean());
  return bean1;
}

@Bean 
public Bean2 bean2() {
  Bean2 bean2 = new Bean2();
  bean2.setBean(mySingletonBean());
  return bean2;
}


Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Spring проксирует класс контекста вашего приложения и заботится обо всех связанных с контекстом вещах, таких как создание экземпляров, кэширование и т. Д. Bean-компонентов.

Запустите этот небольшой тест, не стесняйтесь отлаживать, чтобы увидеть, какой класскласс конфигурации стал:

package stackoverflow;

import java.util.Arrays;
import java.util.Date;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import static org.junit.Assert.assertTrue;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Test.MyContext.class)
public class Test {

    @Autowired
    private ApplicationContext applicationContext;
    @Autowired
    @Qualifier("myStringBean")
    private String myStringBean;
    @Autowired
    private SomeBean someBean;

    @Configuration
    static class MyContext {

        @Bean
        public String myStringBean() {
            return String.valueOf(new Date().getTime());
        }

        @Bean
        public SomeBean mySomeBean() {
            return new SomeBean(myStringBean());
        }

    }

    @org.junit.Test
    public void test() {
        assertTrue(myStringBean == applicationContext.getBean("myStringBean"));
        assertTrue(myStringBean == someBean.getValue());
        System.out.println(Arrays.asList(applicationContext.getBean("myStringBean"), myStringBean, someBean.getValue()));
    }

    static class SomeBean {

        private String value;

        public SomeBean(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }
    }

}
0 голосов
/ 08 октября 2019

Spring Boot - это интеллектуальный фреймворк, и метод mySingletonBean() запускается только один раз, не беспокойтесь об этом. Вы можете запустить режим отладки и посмотреть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...