为什么在测试方法中接收类型必须要使用接口类型,而不能使用具体的实现类?在配置ProxyFactoryBean的时候不是指定了具体的target了么?
代理类代理的应该是接口,而不是接口的具体实现类。接口指的是一类的事情,所以代理接口才有意义。比如中介代理的表面上是某个房东,其实是代理出租一类的事情。
试了一下,是这样的,如果 BizLogicImpl 实现了接口,就必须使用接口类型,否则可以不用
貌似确实必须使用接口
知道为什么了吗?
<bean id="bizLogicImplTarget" class="com.imooc.aop.api.BizLogicImpl"></bean>
<bean id="bizLogicImpl" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.imooc.aop.api.BizLogic</value>
</property>
<property name="target">
<!-- <bean class="com.imooc.aop.api.BizLogicImpl"></bean> -->
<ref bean="bizLogicImplTarget"/>
</property>
<property name="interceptorNames">
<list>
<value>moocBeforeAdvice</value>
<value>moocAfterReturningAdvice</value>
<value>moocMethodInterceptor</value>
<value>moocThrowsAdvice</value>
</list>
</property>
</bean>
如上述在XML文件中所示,为BizLogicImpl创建代理。那么在测试方法中得到的就是一个代理类,而这个代理类的类型是<property name="proxyInterfaces">
<value>com.imooc.aop.api.BizLogic</value>
</property>里面设置的接口的类型。
就是说得到的JDK代理类型是BizLogic类型的,而你在测试方法中用BizLogic的实现类BizLogicImpl来接受这个代理,显然类型不能从父类转换成子类,所以报了ClassCastException。
我在尝试使用具体类的时候异常了。
可以使用具体实现类。
至于为什么使用接口类型,这是面向对象的思想。这个要你理解了面向对象的设计原则及其好处,才能理解为何常用接口。