1.依赖注入:
IOC的作用:降低程序之间的耦合(依赖关系)
概念:依赖关系的管理交给spring维护,在当前类需要用到其他类的对象,由spring为我们提供,只需在配置文件中说明关系的维护;
2.问题
平时使用spring 框架的时候,我们知道从前端传递参数,后端可以用@RequestBody,来创建并将参数注入到对象当中,突然某一时刻,前端不传递参数,但是我们想拿一个对象使用,比如 用户的登录信息。前端只传递了一个token,我们想通过在控制类写一个类似于 User 的对象,他就能自动返回当前操作的用户是谁,那该怎么做呢?
3.解决
这里需要实现一个类:
HandlerMethodArgumentResolver 处理函数参数的分解器,用来处理用户信息
@Component
public class UserInfoMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
IRedisService redisService;
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getParameterType().equals(ZfUser.class);
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
String token = nativeWebRequest.getParameter("token");
if(StringUtils.isNotEmpty(token)){
return redisService.queryUserByToken(token);
}
return null;
}
}
将解析器添加到解析链路中:
WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Autowired
UserInfoMethodArgumentResolver userInfoMethodArgumentResolver;
@Override
public void addInterceptors(InterceptorRegistry registry) {
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(userInfoMethodArgumentResolver);
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
本文介绍如何在Spring框架中实现用户信息的自动注入。通过创建自定义的HandlerMethodArgumentResolver,可以在控制器方法中直接获取到当前操作的用户信息,而无需前端传递完整的用户数据。
1218

被折叠的 条评论
为什么被折叠?



