mybatisplus生成的mapper和bean,后置处理器实现根据bean获取mapper
package cc.ct.business.service.processor;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.mapper.MapperFactoryBean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author congrihe
* @date 2023年02月21日 15:01
*/
@Component
@Slf4j
public class MyBatisCommonMapper implements BeanPostProcessor {
private final static Map<String, BaseMapper<?>> MAPPER_INTERFACE = new ConcurrentHashMap<>();
private final static Map<String,String> FACTORY_NANE = new ConcurrentHashMap<>();
@SuppressWarnings("unchecked")
public static <T> BaseMapper<T> getMapper(Class<T> t){
return (BaseMapper<T>) MAPPER_INTERFACE.get(t.getName());
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof BaseMapper){
String mapperInterface = FACTORY_NANE.get(beanName);
MAPPER_INTERFACE.put(mapperInterface,(BaseMapper<?>) bean);
}
return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof MapperFactoryBean){
Class<?> mapperInterface = ((MapperFactoryBean<?>) bean).getMapperInterface();
Type[] actualTypeArguments = ((ParameterizedType) (mapperInterface.getGenericInterfaces())[0])
.getActualTypeArguments();
String typeName = actualTypeArguments[0].getTypeName();
FACTORY_NANE.put(beanName,typeName);
}
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
}
调用方式
BaseMapper<?> mapper = MyBatisCommonMapper.getMapper(Bean.class);