<!-- 创建目标类 -->
<bean id="userServiceId" class="com.mjr.b_factory_bean.UserServiceImpl"></bean>
<!-- 创建切面类 -->
<bean id="myAspectId" class="com.mjr.b_factory_bean.MyAspect"></bean>
<!-- 创建代理类
使用工厂bean FactoryBean,底层调用getObject()返回特殊bean
ProxyFactoryBean 用于创建代理工厂bean,生成特殊代理对象
interfaces:确定接口们
通过<array>可以设置多个值
只有一个值时,value=""
target:确定目标类
interceptorNames:通知切面类的名称,类型是String[],如果设置一个值value=""
optimize:强制使用cglib
<property name="optimize" value="true"></property>
底层机制
如果目标类有接口,采用jdk动态代理
如果没有接口,采用cglib字节码增强
如果声明optimize = true,无论是否有接口,都采用cglib
-->
<bean id="proxyServiceId" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="interfaces">
<array>
<value>com.mjr.b_factory_bean.UserService</value>
</array>
</property>
<property name="target" ref="userServiceId"></property>
<property name="interceptorNames"> <!-- value="myAspectId" -->
<list><!--使用array-->
<!-- 出错 -->
<!-- <ref bean="myAspectId"/> -->
<value>myAspectId</value>
</list>
</property>
<property name="optimize" value="true"></property>
</bean>
针对interceptorNames后面为什么使用value的解释:
proxyInterfaces(底层传值类型Class[])通过<array>可以设置多个值,只有一个值时,value=""
底层:
proxyInterfaces-ProxyFactoryBean.setProxyInterfaces(Class[] proxyInterfaces)
//.xml文件中给不了class,只能给全限定名
target(底层传值类型Object target)
底层:
target-Advised.setTarget(Object object)//Object所以使用ref传对象
interceptorNames:通知切面类的名称,类型是String[],如果设置一个值value=""
底层:
interceptorNames-ProxyFactoryBean.setInterceptorNames(String[] interceptorNames)
所以interceptorNames后面使用value传值,如果是多个值,则加一个<array>或者<list>