spring 策略模式
九曜 人气:0 @Autowired注解可以帮我们自动注入我们想要的 Bean。
如果只是简单使用@Autowired会遇到spring IOC容器中一个接口有多个实现的情况,spring无法识别具体的实现类,如果不是策略模式,我们可以进行具体的指定@Qualifier和@primary来避免bean冲突的情况。但在策略模式中是不行的。
而除了这个基本功能之外, @Autowired 还有更加强大的功能,还可以注入指定类型的数组,List/Set 集合,甚至还可以是 Map 对象。
为每个具体的实现类添加了一个编号,方便识别,具体可以根据场景选择,这里只是模拟。
登录service
@Service public class LoginService { @Autowired Set<Login> loginSet;//使用了Set Map<Integer,Login> loginMap; public User login(User userLogin) { Login login=loginMap.get(userLogin.getChannelNo()); return login.login(userLogin); } @PostConstruct public void init() { loginMap = new HashMap<>(); for (Login login : loginSet) { loginMap.put(login.channel(), login); } } }
源码策略接口
@Component public interface Login { User login(User userLogin); Integer channel(); }
具体实现类---用户密码登录
@Component public class PasswordLogin implements Login { @Autowired LoginDao loginDao; @Override public User login(User userLogin) { return loginDao.PasswordLogin(userLogin.getUsername(),userLogin.getPassword()); } @Override public Integer channel() { return 2; } }
具体实现类---邮箱登录
@Component public class EmailLogin implements Login { @Autowired LoginDao loginDao; @Override public User login(User userLogin) { return loginDao.EmailLogin(userLogin.getEmail(),userLogin.getPassword()); } @Override public Integer channel() { return 3; } }
具体实现类---邮箱登录
@Component public class PhoneLogin implements Login { @Autowired LoginDao loginDao; @Override public User login(User userLogin) { return loginDao.PhoneLogin(userLogin.getPhone(),userLogin.getPassword()); } @Override public Integer channel() { return 1; } }
简单模拟登录SQL
@Mapper @Repository public interface LoginDao { @Select("select * from user where phone=#{phone} and password=#{password}") User PhoneLogin(String phone,String password); @Select("select * from user where username=#{username} and password=#{password}") User PasswordLogin(String username,String password); @Select("select * from user where email=#{email} and password=#{password}") User EmailLogin(String email,String password); }
加载全部内容