package com.qianwen.core.tenant.dynamic; import org.aopalliance.aop.Advice; import org.springframework.aop.Pointcut; import org.springframework.aop.aspectj.AspectJExpressionPointcut; import org.springframework.aop.support.AbstractPointcutAdvisor; import org.springframework.aop.support.ComposablePointcut; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.lang.NonNull; public class TenantDataSourceGlobalAdvisor extends AbstractPointcutAdvisor implements BeanFactoryAware { private final Advice advice; private final Pointcut pointcut = buildPointcut(); public TenantDataSourceGlobalAdvisor(@NonNull TenantDataSourceGlobalInterceptor tenantDataSourceGlobalInterceptor) { this.advice = tenantDataSourceGlobalInterceptor; } @NonNull public Pointcut getPointcut() { return this.pointcut; } @NonNull public Advice getAdvice() { return this.advice; } public void setBeanFactory(@NonNull BeanFactory beanFactory) throws BeansException { if (this.advice instanceof BeanFactoryAware) { ((BeanFactoryAware)this.advice).setBeanFactory(beanFactory); } } private Pointcut buildPointcut() { AspectJExpressionPointcut cut = new AspectJExpressionPointcut(); cut.setExpression("(@within(org.springframework.stereotype.Controller) || @within(org.springframework.web.bind.annotation.RestController)) && (!@annotation(org.springblade.core.tenant.annotation.NonDS) && !@within(org.springblade.core.tenant.annotation.NonDS))"); return (Pointcut)new ComposablePointcut((Pointcut)cut); } }