到这里我要思考一下,我们可以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对象,具体应用的话,比如可以添加调用日志,做事务控制等。