Spring 配置实现AOP?
AOP面向切面编程
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
在程序运行过程中,动态的切入到程序的指定位置。
第一个例子:AOP
2. 编写业务接口与目标类:
publicinterface UserService{ publicvoid add(String name); publicvoid select(String name); } publicclass UserServiceImpl implements UserService{ publicvoid add (String name) { System.out.println("增加 "+name+"..."); } publicvoid select(String name){ System.out.println("查询"+name+"..."); String name1 = null; } } } |
3. 编写方法执行前后处理:
//前置增强:表示在目标方法执行前实施增强 publicclass BeforeAdvice implements MethodBeforeAdvice { @Override publicvoid before(Method arg0, Object[] arg1, Object arg2) throws Throwable { String clientName = (String)arg1[0]; System.out.println("在执行方法之前加入切点....."+arg1); } } |
Springaop提供前后置异常通知处理类:
通知分为:前置通知、后置通知、异常通知、最终、环绕通知
MethodBeforeAdvice(前置通知)
AfterReturningAdvice(后置通知)
MethodInterceptor(前后通知)
ThrowsAdvice(异常通知)
4. Spring aop配置:
<?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!-- 目标类 --> <beanid="target_1"class="com.aop.Waiter"/> <!-- 后置通知 --> <beanid="after"class="com.aop.AfterAdvice"></bean> <!-- 前置通知 --> <beanid="proxybean"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="proxyInterfaces"> <!-- 接口接入 注入使用了接口,则使用JDK动态代理-> <value>com.aop.IWaiter</value> </property> <!-- 默认false使用jdk动态代理 <property name="proxyTargetClass" value="true"/> --> <propertyname="interceptorNames"> <list> <!-- 通知类引入 --> <value>before</value> <value>after</value> </list> </property> <!-- 注入要通知的目标类 --> <propertyname="target"ref="target_1"/> </bean> </beans>
|
Spring aop提供代理工厂bean,不用自己写,但是要指定属性注入要执行通知实现类。
<propertyname="proxyInterfaces"> 注入目标接口
<propertyname="interceptorNames"> 注入要通知的实现类列表
<propertyname="target"ref="target"/> 注入要通知的目标类
<propertyname="proxyTargetClass"value="true"/>默认jdk代理
Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理。
如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理。
如果该目标对象没有实现任何接口,则创建一个CGLIB代理。