day39-Spring 06-Spring的AOP:带有切点的切面
环绕增强功能是最强的,它相当于前置增强和后置增强.
这就是带有切点的切面
package cn.itcast.spring3.demo4; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; //import org.springframework.cglib.proxy.MethodInterceptor; /** * 增强的类: * 使用的是环绕增强 * @author zhongzh * */ /** * 环绕增强功能是最强的,它相当于前置增强和后置增强. * @author zhongzh * */ public class MyAroundAdvice implements MethodInterceptor{ public Object invoke(MethodInvocation methodInvocation) throws Throwable { // TODO Auto-generated method stub System.out.println("环绕前增强....."); Object result = methodInvocation.proceed();//放行,相当于执行你目标对象的方法. 执行目标对象的方法 System.out.println("环绕后增强....."); return result; } }
package cn.itcast.spring3.demo4; /** * 目标对象 * @author zhongzh * */ public class OrderDao { public void add(){ System.out.println("添加订单"); } public void update(){ System.out.println("修改订单"); } public void delete(){ System.out.println("删除订单"); } public void find(){ System.out.println("查询订单"); } }
package cn.itcast.spring3.demo4; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class SpringTest4 { @Autowired //@Qualifier("orderDao") @Qualifier("orderDaoProxy") private OrderDao orderDao; @Test public void demo1(){ orderDao.add(); orderDao.delete(); orderDao.update(); orderDao.find(); } }
<?xml version="1.0" encoding="UTF-8"?> <!-- 引入beans的头 --> <beans xmlns="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.xsd"> <!-- 不带有切点的切面 --> <!-- 定义目标对象 --> <bean id="customerDao" class="cn.itcast.spring3.demo3.CustomerDaoImpl"> </bean> <!-- 定义增强 增强对象--> <bean id="beforeAdvice" class="cn.itcast.spring3.demo3.MyBeforeAdvice"> </bean> <!-- 手动生成代理太麻烦了.Spring支持配置生成代理: --> <!-- 代理对象 --> <bean id="customerDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <!-- 设置目标对象 --> <property name="target" ref="customerDao"></property> <!-- 设置实现的接口,value中写接口的全路径 --> <!-- 类实现的接口的全路径 --> <property name="proxyInterfaces" value="cn.itcast.spring3.demo3.CustomerDao"></property> <!-- 需要使用value:要的名称 使用beforeAdvice对它进行增强 --> <property name="interceptorNames" value="beforeAdvice"></property><!--interceptorNames要拦截的名称 --> <!-- 这个是针对类的所有方法进行拦截的,你还没到配置方法的那一步呢 --> </bean> <!-- 带有切点的切面 --> <!-- 定义目标对象 --> <bean id="orderDao" class="cn.itcast.spring3.demo4.OrderDao"></bean> <!-- 定义增强 --> <bean id="aroundAdvice" class="cn.itcast.spring3.demo4.MyAroundAdvice"></bean> <!-- 定义切点切面: --><!-- 正则的方法切点切面 --> <bean id="mypointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <!-- 要写一个正则规定它里面哪些方法吧 --><!--定义正则表达式,规定哪些方法执行拦截 --> <!-- .任意字符 * 任意个 --> <!-- <property name="pattern" value=".*"></property> --> <!-- <property name="pattern" value="cn\.itcast\.spring3\.demo4\.OrderDao\.add\.*"></property> --> <property name="patterns" value=".*add.*,.*find.*"></property> <!-- 应用增强 --> <property name="advice" ref="aroundAdvice"></property><!-- 把定义的增强应用上了 --> </bean> <!-- 定义生成代理对象 --> <bean id="orderDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <!-- 配置目标 --> <property name="target" ref="orderDao"></property> <!-- 针对类的代理 --> <property name="proxyTargetClass" value="true"></property> <!-- 在目标上应用增强 --> <property name="interceptorNames" value="mypointcutAdvisor"></property> </bean> </beans>