package com.king.demo;
import com.king.demo.AuthorityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.condition.*;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import javax.annotation.PostConstruct;
import java.lang.reflect.Method;
/**
* @Description
* @Author HHJ
* @Date 2019-06-13 9:09
*/
@Component
public class SpringMappingConfig {
@Autowired
RequestMappingHandlerMapping requestMappingHanderMapping;
@Autowired
AutowiredAnnotationBeanPostProcessor autowiredAnnotationBeanPostProcessor;
@Autowired
ConfigurableListableBeanFactory factory;
@Autowired
TestMapping test;
@PostConstruct
public void config() throws Exception {
String url = "/test110";
String clazTargetMethod = "test10086";
Class clazz = TestMapping.class;
MediaType mediaType = MediaType.APPLICATION_JSON_UTF8;
RequestMethod requestMethod = RequestMethod.POST;
Class[] paramClazz = new Class[]{AuthorityService.class};
PatternsRequestCondition patternsRequestCondition = new PatternsRequestCondition(url);
//请求类型
RequestMethodsRequestCondition requestMethodsRequestCondition = new RequestMethodsRequestCondition(requestMethod);
ParamsRequestCondition paramsRequestCondition = new ParamsRequestCondition();
HeadersRequestCondition headersRequestCondition = new HeadersRequestCondition();
ConsumesRequestCondition consumesRequestCondition = new ConsumesRequestCondition();
ProducesRequestCondition producesRequestCondition = new ProducesRequestCondition();
MediaTypeExpression mediaTypeExpression = new MediaTypeExpression() {
@Override
public MediaType getMediaType() {
return mediaType;
}
@Override
public boolean isNegated() {
return false;
}
};
producesRequestCondition.getExpressions().add(mediaTypeExpression);
RequestMappingInfo requestMappingInfo = new RequestMappingInfo("test",
patternsRequestCondition,
requestMethodsRequestCondition,
paramsRequestCondition,
headersRequestCondition,
consumesRequestCondition,
producesRequestCondition,
null);
/*
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) factory;
autowiredAnnotationBeanPostProcessor.processInjection(test);
// ((DefaultListableBeanFactory) factory).registerBeanDefinition("test", test);
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
defaultListableBeanFactory.registerBeanDefinition(clazz.getName(), beanDefinitionBuilder.getBeanDefinition());
// Test jobCaller = factory.getBean("test", Test.class);
// defaultListableBeanFactory.destroySingleton("test");
Class<? extends RequestMappingHandlerMapping> aClass = requestMappingHanderMapping.getClass();
Class<?> superclass = aClass.getSuperclass().getSuperclass();
Method detectHandlerMethods = superclass.getDeclaredMethod("detectHandlerMethods", Object.class);
detectHandlerMethods.setAccessible(true);
detectHandlerMethods.invoke(requestMappingHanderMapping, clazz.getName());*/
Method targetMethod = ReflectionUtils.findMethod(clazz, clazTargetMethod, paramClazz); // 找到处理该路由的方法
requestMappingHanderMapping.registerMapping(requestMappingInfo, test, targetMethod);
}
}
import com.king.demo.AuthorityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @Description
* @Author HHJ
* @Date 2019-06-13 11:06
*/
@Component
public class TestMapping {
@Autowired
private AuthorityService authorityService;
@ResponseBody
public String test10086(AuthorityService service) {
System.out.println("this is TestDTO:" + (authorityService == null));
return "this is TestDTO:" + (service == null);
}
}
原文 https://blog.csdn.net/x369201170/article/details/85054217