DefaultAdvisorAutoProxyCreator.java 4.0 KB
Newer Older
1 2 3
package cn.noexception.container.aop.framework.autoproxy;

import cn.noexception.container.BeansException;
4
import cn.noexception.container.PropertyValues;
5 6 7 8 9 10 11 12 13 14 15 16
import cn.noexception.container.aop.*;
import cn.noexception.container.aop.aspectj.AspectJExpressionPointcutAdvisor;
import cn.noexception.container.aop.framework.ProxyFactory;
import cn.noexception.container.factory.BeanFactory;
import cn.noexception.container.factory.BeanFactoryAware;
import cn.noexception.container.factory.config.InstantiationAwareBeanPostProcessor;
import cn.noexception.container.factory.support.DefaultListableBeanFactory;
import org.aopalliance.aop.Advice;
import org.aopalliance.intercept.MethodInterceptor;

import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
希川's avatar
希川 已提交
17 18 19
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
20 21 22 23 24 25 26 27 28 29 30 31

/**
 * DefaultAdvisorAutoProxyCreator
 * <p>加入 Bean 生命周期的自动代理创建者</p>
 *
 * @author 吕滔
 * @Date 2021/11/4 16:53
 */
public class DefaultAdvisorAutoProxyCreator implements InstantiationAwareBeanPostProcessor, BeanFactoryAware {

    private DefaultListableBeanFactory beanFactory;

希川's avatar
希川 已提交
32 33
    private final Set<Object> earlyProxyReferences = Collections.synchronizedSet(new HashSet<>());

34 35 36 37 38 39 40
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = (DefaultListableBeanFactory) beanFactory;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
41
        return bean;
42 43 44 45
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
希川's avatar
希川 已提交
46 47 48 49 50
        if (!earlyProxyReferences.contains(beanName)) {
            return wrapIfNecessary(bean, beanName);
        }
        return bean;
    }
51

希川's avatar
希川 已提交
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        return null;
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        return true;
    }

    /**
     * 检测/感知 bean 是否是切点 <p>按需拦截
     */
    private boolean isInfrastructureClass(Class<?> beanClass) {
        return Advice.class.isAssignableFrom(beanClass) || Pointcut.class.isAssignableFrom(beanClass) || Advisor.class.isAssignableFrom(beanClass);
    }

    @Override
    public PropertyValues postProcessPropertyValues(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        return pvs;
    }
73

希川's avatar
希川 已提交
74 75 76 77 78 79 80 81 82 83 84
    @Override
    public Object getEarlyBeanReference(Object exposedObject, String beanName) {
        earlyProxyReferences.add(beanName);
        return wrapIfNecessary(exposedObject, beanName);
    }

    protected Object wrapIfNecessary(Object bean, String beanName) {
        if (isInfrastructureClass(bean.getClass())) {
            return bean;
        }
        Collection<AspectJExpressionPointcutAdvisor> advisors = beanFactory.getBeansOfType(AspectJExpressionPointcutAdvisor.class).values();
85 86
        for (AspectJExpressionPointcutAdvisor advisor : advisors) {
            ClassFilter classFilter = advisor.getPointcut().getClassFilter();
87 88
            // 过滤匹配类
            if (!classFilter.matches(bean.getClass())) continue;
89 90

            AdvisedSupport advisedSupport = new AdvisedSupport();
91 92

            TargetSource targetSource = new TargetSource(bean);
93 94 95 96 97 98 99
            // 设置目标对象
            advisedSupport.setTargetSource(targetSource);
            // 设置拦截方法
            advisedSupport.setMethodInterceptor((MethodInterceptor) advisor.getAdvice());
            // 设置匹配器
            advisedSupport.setMethodMatcher(advisor.getPointcut().getMethodMatcher());
            // 设置选择使用的代理方法
希川's avatar
希川 已提交
100
            advisedSupport.setProxyTargetClass(true);
101

102
            // 返回代理对象
103 104
            return new ProxyFactory(advisedSupport).getProxy();
        }
105 106
        return bean;
    }
希川's avatar
希川 已提交
107
}
108

109

110

111