package jnpf.database.plugins; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import jnpf.database.util.LogicDeleteHelper; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.framework.ProxyFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Configuration; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; /** * MybatisPlus删除方法拦截, 若调用删除方法标记当前为删除操作, MybatisPlusMetaObjectHandler 自动填充删除时间、删除人员 */ @Configuration @ConditionalOnProperty(prefix = "config", name = "EnableLogicDelete", havingValue = "true", matchIfMissing = false) public class MyLogicServiceBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { Object obj = BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName); if(obj != null && BaseMapper.class.isAssignableFrom(obj.getClass())){ ProxyFactory factory = new ProxyFactory(); factory.setTarget(obj); factory.addAdvice(new MethodInterceptor() { @Nullable @Override public Object invoke(@Nonnull MethodInvocation invocation) throws Throwable { if(invocation.getMethod().getName().startsWith("delete")){ LogicDeleteHelper.setDeleteAction(); } try { return invocation.proceed(); } finally { LogicDeleteHelper.clearDeleteAction(); } } }); return factory.getProxy(); } return obj; } }