5、创建代理

protected Object createProxy(

Class beanClass, String beanName, Object[] specificInterceptors, TargetSource targetSource) {

if (this.beanFactory instanceof ConfigurableListableBeanFactory) {

AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory) this.beanFactory, beanName, beanClass);

}

ProxyFactory proxyFactory = new ProxyFactory();

proxyFactory.copyFrom(this);

//是接口代理

if (!proxyFactory.isProxyTargetClass()) {

//应该使用cglib创建代理对象

if (shouldProxyTargetClass(beanClass, beanName)) {

proxyFactory.setProxyTargetClass(true);

}

else {

//若没有实现的接口,则使用cglib代理

evaluateProxyInterfaces(beanClass, proxyFactory);

}

}

Advisor[] advisors = buildAdvisors(beanName, specificInterceptors);

for (Advisor advisor : advisors) {

//设置增强器

proxyFactory.addAdvisor(advisor);

}

//set目标对象

proxyFactory.setTargetSource(targetSource);

customizeProxyFactory(proxyFactory);

//代理被配置之后,不允许再修改

proxyFactory.setFrozen(this.freezeProxy);

if (advisorsPreFiltered()) {

proxyFactory.setPreFiltered(true);

}

//返回代理对象

return proxyFactory.getProxy(getProxyClassLoader());

}

@Override

public Advisor wrap(Object adviceObject) throws UnknownAdviceTypeException {

if (adviceObject instanceof Advisor) {

return (Advisor) adviceObject;

}

if (!(adviceObject instanceof Advice)) {

throw new UnknownAdviceTypeException(adviceObject);

}

Advice advice = (Advice) adviceObject;

if (advice instanceof MethodInterceptor) {

// So well-known it doesn't even need an adapter.

return new DefaultPointcutAdvisor(advice);

}

for (AdvisorAdapter adapter : this.adapters) {

// Check that it is supported.

if (adapter.supportsAdvice(advice)) {

return new DefaultPointcutAdvisor(advice);

}

}

throw new UnknownAdviceTypeException(advice);

}

buildAdvisors方法 将所有拦截器、增强器、增强方法统一封装advisors 


public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {

if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {

Class targetClass = config.getTargetClass();

if (targetClass == null) {

throw new AopConfigException("TargetSource cannot determine target class: " +

"Either an interface or a target is required for proxy creation.");

}

if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {

return new JdkDynamicAopProxy(config);

}

return new ObjenesisCglibAopProxy(config);

}

else {

return new JdkDynamicAopProxy(config);

}

}


上面主要讨论是创建jdk代理还是cglib代理。isOptimize仅仅对cglib起作用,isProxyTargetClass 为false强制使用cglib。

isProxyTargetClass为true,如果有接口代理,则使用jdk,若没有实现接口,则使用cglib。会自动在jdk和cglib切换。

你可能感兴趣的:(5、创建代理)