Spring的IOC和AOP之深剖(6)

到这里我要思考一下,我们可以applicationContext.xml里面的bean组件修改修改,我们用了顾问(Advisor)要包装通知(Advice),比较灵活,可以只针对某一个方法进行处理。

对于环绕增强:

<bean/>
<!--环绕增强  -->
<bean/>

<!-- 方式一 -->
<!-- <aop:config>
切点
<aop:pointcut expression="execution(public void delete())"/>
 异常抛出增强
<aop:advisor advice-ref="around" pointcut-ref="pointcut"/>
</aop:config> -->

<!--顾问(Advisor)要包装通知(Advice),比较灵活,可以只针对某一个方法进行处理  -->
<bean>
<property ref="around"></property>
<property value="delete"></property>
</bean>

<!--方式二  -->
 <!-- 代理对象 ProxyFactoryBean 代理工厂bean-->
    <bean>
    <property ref="service"></property>
    <property value="advisor"></property>
    </bean>
</beans>

还有一个知识点,我们可以更方便的写bean组件,正则表达式

<bean/>
<!--环绕增强  -->
<bean/>

<!-- 方式一 -->
<!-- <aop:config>
切点
<aop:pointcut expression="execution(public void delete())"/>
 异常抛出增强
<aop:advisor advice-ref="around" pointcut-ref="pointcut"/>
</aop:config> -->

<bean>
<property ref="around"></property>
<property value=".*do.*"></property>

</bean>

<!--方式二  -->
 <!-- 代理对象 ProxyFactoryBean 代理工厂bean-->
    <!-- <bean>
    <property ref="service"></property>
    <property value="regex"></property>
    </bean> -->
    <!-- 默认 -->
    <!--  <bean></bean>-->
  <bean>
  <property value="service"></property>
  <property value="regex"></property>
  </bean>

到这里呢,算是差不多了,但是我们缺少了分析下源代码

我们知道,实现aop,其实源代码里面通过了动态代理来实现

我们来了解一下    代理模式的定义:

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式使用代理对象完成用户请求,屏蔽用户对真实对象的访问。

在软件设计中,使用代理模式的意图也很多,比如因为安全原因需要屏蔽客户端直接访问真实对象,或者在远程调用中需要使用代理类处理远程方法调用的技术细节 (如 RMI),也可能为了提升系统性能,对真实对象进行封装,从而达到延迟加载的目的。

代理模式角色分为 4 种:

主题接口:定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法;

真实主题:真正实现业务逻辑的类;

代理类:用来代理和封装真实主题;

Main:客户端,使用代理类和主题接口完成一些工作。

1.什么是动态代理?

答:动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实。代理一般会实现它所表示的实际对象的接口。代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际对象实现系统的实际功能,代理对象对客户隐藏了实际对象。客户不知道它是与代理打交道还是与实际对象打交道。
2.为什么使用动态代理?

答:因为动态代理可以对请求进行任何处理

3.哪些地方需要动态代理?

答:不允许直接访问某些类;对访问要做特殊处理等

JAVA 动态代理的作用是什么?

主要用来做方法的增强,让你可以在不修改源码的情况下,增强一些方法,在方法执行前后做任何你想做的事情(甚至根本不去执行这个方法),因为在InvocationHandler的invoke方法中,你可以直接获取正在调用方法对应的Method对象,具体应用的话,比如可以添加调用日志,做事务控制等。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d0a66771283e2103c6bdc01c098f5a37.html