spring aop 经典代理方式解析

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

所以你要这样获取

扫描二维码关注公众号,回复: 4292027 查看本文章
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");




















猜你喜欢

转载自blog.csdn.net/qq_32771571/article/details/79935853
今日推荐