0

У меня есть абстрактный класс для функциональности входаАбстрактный класс Dependency Injection в Spring MVC

@Component 
public abstract class SignIn {  

    public abstract LogInOperationToken signin(User user, HttpServletRequest request); 


} 

который реализуется двумя конкретными классами FacebookSignInImpl и NormalSignInImpl, которые оба annoted в @Component, а также.

Теперь у меня есть класс обслуживания следующим образом:

@Service 
public class SignInService { 

    @Autowired(required = true) 
    private SignIn signIn;  


    public SignInService(@Qualifier("signIn") SignIn signin) { 
    this.signIn = signin; 
    } 


    public LogInOperationToken signin(User user, HttpServletRequest request) { 
     return signIn.signin(user,request); 
    } 
} 

Как вы можете видеть, он принимает абстрактный класс в качестве параметра конструктора.

Из класса контроллера то, что я пытаюсь достичь, - это проверить некоторый флаг и на его основе присвоить абстрактному классу правильную реализацию: нормальный или facebook signin. Без инъекций Spring зависимостей Я хотел бы сделать что-то вроде:

SignIn signIn = null; 

if(flag.equals("facebook")){ 
    signIn = new FacebookSignInImpl(); 
} 
else{ 
    signIn = new NormalSignInImpl(); 
} 

SignInService signInService = new SignInService(signIn); 
signInService.signIn(user, request); 

С SignIn это абстрактный класс, как я могу @Autowire его так, что он назначен конструктором в SignInService. Прошу прокомментировать, если вам нужно больше разъяснений. Благодарю.

+0

См [профилей пружины] (http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-definition-profiles-java). – manish

ответ

3

Вы не можете создать @Component абстрактного класса и ваш дизайн приложения не идеален. Пожалуйста, следуйте приведенным ниже шаблон

public abstract class SignIn { 
    public abstract LogInOperationToken signin(User user, HttpServletRequest request); 
} 

@Component("fcaebookSignIn") 
public class FcaebookSignIn { 
    public LogInOperationToken signin(User user, HttpServletRequest request) { 
     // implementation code 
    } 
} 

@Component("normalSignIn") 
public class NormalSignIn { 
    public LogInOperationToken signin(User user, HttpServletRequest request) { 
     // implementation code 
    } 
} 

И тогда я настоятельно рекомендую вам создать различные контроллеры или отдыха конечных точек для различных типов входа в аккаунт

@Controller 
public class SignInController { 

    @Autowired 
    @Qualifier(value="fcaebookSignIn") 
    private SignIn fcaebookSignIn; 

    @Autowired 
    @Qualifier(value="normalSignIn") 
    private SignIn normalSignIn; 

    @RequestMapping (method = RequestMethod.POST, path = '/normal/signIn') 
    public User normalSignIn(@RequestBody User user, HttpServletRequest request) { 
     normalSignIn.signIn(user, request); 
    } 

    @RequestMapping (method = RequestMethod.POST, path = '/facebook/signIn') 
    public User facebookSignIn(@RequestBody User user, HttpServletRequest request) { 
     fcaebookSignIn.signIn(user, request); 
    } 
} 

Но если вы должны использовать одну конечную точку, то следующий должен работа

@Controller 
public class SignInController { 

    @Autowired 
    private ApplicationContext context; 

    private SignIn signIn; 

    @RequestMapping (method = RequestMethod.POST, path = '/signIn') 
    public User normalSignIn(@RequestBody User user, HttpServletRequest request) { 
     String flag = request.getParameter("flag"); // populate this from wherever you are getting this flag 

     if(flag.equals("facebook")) { 
      signIn = context.getBean(FcaebookSignIn.class) 
     } 
     else{ 
      signIn = context.getBean(NormalSignIn.class) 
     } 

     signIn.signIn(user, request); 
    } 
} 
+0

Проблема заключается в конструкторе класса SignInService, где я пытаюсь передать абстрактный класс в качестве параметра ... Как вы предлагаете сопоставление? –

+0

Сделайте то же самое в классе обслуживания, что и в классе контроллера, не передайте параметр в конструкторе. – Avinash

 Смежные вопросы

  • Нет связанных вопросов^_^