Должен ли я никогда не использовать ключевое слово «new» в проекте весенней загрузки? - PullRequest
0 голосов
/ 11 сентября 2018

Я работаю над Spring Boot Rest API, и в итоге я использовал ключевое слово new здесь и там.

Мне интересно, сделал ли я что-то не так, когда использовал новое ключевое слово для своей программы.И если абсолютно запрещено использовать новое ключевое слово в реальном проекте.

Если ответ положительный, я должен аннотировать каждый класс, который я написал, с аннотацией @component, чтобы я мог создать экземпляр объекта, используя @autowired.

Если ответ отрицательный, когда мы можем разорвать этотправило?

Ответы [ 5 ]

0 голосов
/ 11 сентября 2018

Посмотрите на следующий код; здесь, как вы видите, исходя из условия, необходимо динамически загружать рекламные объявления по запросу. так что здесь вы не можете @autowire этой группы элементов, потому что вся информация загружается из БД или внешней системы, поэтому вам просто нужно заполнить вашу модель соответственно.

if (customer.getType() == CustomerType.INTERNET) {
    List < Advertisement > adList = new ArrayList < Advertisement > ();
    for (Product product: internetProductList) {
        Advertisement advertisement = new Advertisement();
        advertisement.setProduct(product);
        adList.add(advertisement);
    }
}

Обратите внимание, что для управления внешними зависимостями целесообразно использовать Spring *1006*. как подключение JDBC-соединения в DAO или конфигурации, такие как указание типа используемой базы данных.

0 голосов
/ 11 сентября 2018

Вы можете создавать объекты с помощью ключевого слова new в приложении Spring.

Но эти объекты выходят за рамки контекста приложения Spring и, следовательно, не управляются Spring.

Так как онине управляются пружиной, любые вложенные уровни зависимости (например, ваш класс Service, имеющий ссылку на ваш класс Repository и т. д.) не будут разрешены.

Поэтому, если вы попытаетесь вызвать метод в своем классе обслуживания, выможет привести к получению NullPointer для хранилища.

@Service
public class GreetingService {
    @Autowired
    private GreetingRepository greetingRepository;
    public String greet(String userid) {
       return greetingRepository.greet(userid); 
    }
}

@RestController
public class GreetingController {
    @Autowired
    private GreetingService greetingService;
    @RequestMapping("/greeting")
    public String greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
        return String.format("Hello %s", greetingService.greet(name));
    }
    @RequestMapping("/greeting2")
    public String greeting2(@RequestParam(value = "name", defaultValue = "World") String name) {
      GreetingService newGreetingService = new GreetingService();
      return String.format("Hello %s", newGreetingService.greet(name));
    }
}

В приведенном выше примере /greeting будет работать, но /greeting2 не удастся, потому что вложенные зависимости не разрешены.

Так что еслиВы хотите, чтобы ваш объект управлялся пружиной, а затем вы должны автоматически связать их.Вообще говоря, для pojos слоя представления и пользовательских конфигураций bean вы будете использовать ключевое слово new.

0 голосов
/ 11 сентября 2018

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * new * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * *1004*
0 голосов
/ 11 сентября 2018

Я думаю, что можно использовать ключевое слово new, но вы должны узнать разницу между различными стереотипами (Контроллер, Сервис, Репозиторий)

Вы можете следовать этому вопросу, чтобы получить некоторую ясность:

В чем разница между аннотациями @Component, @Repository & @Service в Spring?

Использование соответствующей аннотации позволит вам правильно использовать DI (внедрение зависимостей), что поможет при написаниинарезанные тесты для вашего приложения весенней загрузки.Также компоненты Service, Controller и Repository создаются как Singleton, что снижает издержки GC.Более того, компоненты, которые вы создаете с помощью ключевого слова new, не управляются Spring, и по умолчанию Spring никогда не внедряет зависимости в объект, созданный с помощью new.

Официальная документация Spring: https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-spring-beans-and-dependency-injection.html

0 голосов
/ 11 сентября 2018

Нет правила использования или не использования new

Вам решать, хотите ли вы, чтобы Spring управлял вашим объектом, или вы хотите позаботиться об этом самостоятельно.

Spring упрощает создание объектов, управление зависимостями и автоматическую разводку, однако, если вы не хотите ни одного в своем классе, вы можете создать его экземпляр, используя new

...