bean.xml的书写方式:
<bean id="service" class="wwx.service.Service"><!-- 被代理者,可以是java普通的类,也可以是java实现接口的普通的类-->
<property name="name" value="wwx" />
</bean>
<bean id="serviceAdvice" class="wwx.advice.ServiceAdvice" /><!-- 俗名拦截者,学名通知 -->
<bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean"><!-- 代理者 -->
<property name="target" ref="service" /><!-- 被代理者注入 -->
<property name="interceptorNames">
<list>
<value>serviceAdvice</value><!-- 拦截者列表 -->
</list>
</property>
</bean>
ProxyFactoryBean是spring自己的一个普通的类,
public class ProxyFactoryBean extends ProxyCreatorSupport
implements FactoryBean, BeanClassLoaderAware, BeanFactoryAware
他实现了FactoryBean接口。
public interface FactoryBean {
public abstract Object getObject() throws Exception;
public abstract Class getObjectType();
public abstract boolean isSingleton();
}
其实这个类可以理解为就是一个工厂,这个工厂会返回一个被自己想返回的类,通过getObject()返回。
案例1:假如被代理者是普通类,没有实现接口,会使用cglib技术生成代理者。
案例2:假如被代理者是普通类,实现接口,会使用jdk动态代理技术生成代理者。
案例1:生成的代理者 继承Service,也就是被代理者(cglib惯用伎俩)
并实现了三个接口
org.springframework.aop.SpringProxy 这个接口为标记接口,标记这个类是spring生成的代理者
org.springframework.aop.framework.Advised 这个接口的实现为了配置一些代理信息
org.springframework.cglib.proxy.Factory 这个接口是cglib的接口,最重要方法newInstance
所以你要这样获取
Service s =(Service) appContext.getBean("serviceProxy");
案例2:生成的代理者 继承了java.lang.reflect.Proxy该类,目测可能会用到其中的方法
并实现了三个接口
wwx.service.ServiceHandler 这个我自己的接口
org.springframework.aop.SpringProxy 这个同上
org.springframework.aop.framework.Advised 这个同上
所以你要这样获取
ServiceHandler s =(ServiceHandler) appContext.getBean("serviceProxy");