@Service и @Scope ("прототип") вместе

У меня есть класс обслуживания с @Service и @Scope ("protoype"). Я хочу, чтобы эта служба вела себя как прототип в классе контроллера. Вот как я его использую:

@Controller
@RequestMapping(value = "/")
public class LoginController {
  @Autowired
  private EmailService emailService;

  @RequestMapping(value = "/register", method = RequestMethod.POST)
  public String register(){
    System.out.println(emailService);
    emailService.sendConfirmationKey();
  }
  @RequestMapping(value = "/resetKey", method = RequestMethod.POST)
    System.out.println(emailService);
    emailService.sendResetKey();
}

Вот класс обслуживания:

@Service
@Scope("prototype")
public class EmailService {
    @Autowired
    private JavaMailSender mailSender;

    public void sendConfirmationKey(){
    ...
    }
    public void sendResetKey(){
    ...
    }
}

Я запускаю весеннюю загрузку, используя свойство автоконфигурации. Я сравниваю, является ли объект emailService таким же или нет, и получаю то же самое один объект. Это означает, что @Scope ("прототип") не работает должным образом с @Service. Вы видите здесь что-то не так? Я забыл добавить еще несколько кодов?

Редактировать: Отвечая на @Janar, я не хочу использовать дополнительные коды для его работы, такие как свойство WebApplicationContext и дополнительный метод для создания. Я знаю, что есть более короткий способ, использующий только аннотацию.

Я уже видел этот пост, и да, возможно, вы правы, но я не хочу использовать context.getBean ("beanName") и WebApplicationContext в контроллере.

Eric 30.03.2018 15:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
5 236
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны указать режим прокси в аннотации scope.

Это должно помочь:

@Service 
@Scope(value = "prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)  
public class EmailService {}

В качестве альтернативы вы также можете определить LoginController как прототип.

Я думал, что тоже пробовал это решение, но оно не сработало. Я попробовал сейчас, и он работает. Спасибо. Вы знаете, что он устарел? Использую самые свежие версии spring.

Eric 30.03.2018 15:42

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

M. Prokhorov 30.03.2018 15:46
docs.spring.io/spring/docs/current/javadoc-api/org/… это последняя стабильная версия (5.0.4.RELEASE), и она не устарела
db80 30.03.2018 16:27

Другие вопросы по теме