最近问了很多个spring相关的问题,好像满意答案的真心没有几个,今天问最后一个关于aop的问题,请高手指点。
通过查看源码发现,代理对象的生成是在getBean的时,代码如下
try {
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
Object bean = resolveBeforeInstantiation(beanName, mbd);
if (bean != null) {
return bean;
}
}
catch (Throwable ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"BeanPostProcessor before instantiation of bean failed", ex);
}
Object beanInstance = doCreateBean(beanName, mbd, args);
如果是生成代理对象,就不会调用后面的doCreateBean了,但是在resolveBeforeInstantiation中我晕呼了,
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
// Make sure bean class is actually resolved at this point.
if (mbd.hasBeanClass() && !mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
bean = applyBeanPostProcessorsBeforeInstantiation(mbd.getBeanClass(), beanName);
if (bean != null) {
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
在上面的代码中那两个if里面判断的那些值是什么时候设置进去的,分别代表什么意思?
比如我现在我配置如下:
<bean id="123" class="xxx"></bean>
<aop:config>
<aop:aspect ref="123" id="as">
<aop:before point-cut="....">
</aop:aspect>
</aop:config>
然后我调用getBean(“123”),spring是怎么知道这个123是需要返回代理对象的,从源码的角度说下,期待。。。。。
个人理解。
resolveBeforeInstantiation可以理解为Spring给BeanPostProcessors开放的一个回调,即可以配置BeanPostProcessor,然后在postProcessBeforeInitialization或者postProcessAfterInitialization方法中直接实例化一个对象并返回,这样当Spring调用这个方法时发现已经生成了对象,就不会再调用doCreate进行生成了。
你说的代理对象就是对BeanPostProcessor的一个具体实现,比如如果你希望对A Bean进行代理,那么可以配置一个BeanPostProcessor,在其中的postProcessBeforeInitialization方法中直接返回一个A 类的代理对象。
spring aop:aspect 标签就指定了啊。spring读取到aop标签会把bean通过Proxyfactory转化为动态代理对象
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。