码迷,mamicode.com
首页 > 编程语言 > 详细

spring实现AOP

时间:2017-10-12 20:29:56      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:win   tor   XML   happy   生成   dos   logs   user   mapped   

一、.默认advisor自动代理生成器(实现前置增强)

    1.编写接口类

public interface ISomeService {
    public void doSome();
    public void add();
}

 2.实现接口类中的方法

public class SomeService implements ISomeService {
    public void doSome() {
        System.out.println("code  ok");
    }

    public void add() {
        System.out.println("=========log===============");
    }
}

 3.编写增强类

  

public class MyBeforeAdvice implements MethodBeforeAdvice {
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println("执行前置增强");
    }
}

 4.写配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:p="http://www.springframework.org/schema/p"
       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
         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
">
    <!--目标对象-->
    <bean id="SomeService" class="cn.happy.service.SomeService"></bean>

    <!--增强  通知-->
    <bean  id="beforeAdvice" class="cn.happy.service.MyBeforeAdvice"></bean><!--前置增强-->
    
      <!-- 使用名称匹配方法切入点顾问NameMatchMethodPointcutAdvisor-->
 <bean  id="beforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
       <!-- <!–顾问 Advisor 包装通知, 那个方法需要增强–>-->
        <property name="advice" ref="beforeAdvice"></property>
        <property name="mappedNames" value="doSome"></property>
    </bean>

    <!--默认advisor自动代理生成器  有几个目标方法都会增强,但是只能对顾问自动代理,不能自动代理通知-->
    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>

</beans>

 5.测试方法

 

public class test01 {
    // AspectJ 
    @Test
    public void testAspect(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        ISomeService someService= (ISomeService)context.getBean("SomeService");
        someService.add();
        someService.doSome();
    }

 6.测试结果

技术分享

二、Aspectj实现前置增强

AspectJ:是一个面向切面的框架,它扩展了Java语言。

AspectJ表达式:
    语法:execution(表达式) 通过execution函数,可以定义切点的方法切入

      execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)      

         例如

               execution(public * *(..))                             匹配所有类public方法

               execution(* cn.study.dao..*(..))                  匹配指定包下所有类方法,不包含子包

     execution(* cn.study.dao..*(..))                  ..*表示包、子孙包下所有类

     execution(* cn.study.service.UserService.*(..))  匹配指定类所有方法

     execution(* cn.study.dao.GenericDAO+.*(..))   匹配实现特定接口所有类方法

     execution(* save*(..))                                     匹配所有save开头的方法

  AspectJ增强
    @Before 前置通知,相当于BeforeAdvice
    @AfterReturning 后置通知,相当于AfterReturningAdvice
    @Around 环绕通知,相当于MethodInterceptor
    @AfterThrowing抛出通知,相当于ThrowAdvice
    @After 最终final通知,不管是否异常,该通知都会执行

1.基本的方法不变,只改一下xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:p="http://www.springframework.org/schema/p"
       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
         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
">
    <!--目标对象-->
    <bean id="SomeService" class="cn.happy.serviceXML.SomeService"></bean>

  <!--  <!–增强  通知–>  注解
    <bean id="beforeAdvice" class="cn.happy.service.MyAspect"></bean>

    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>-->

    <!--增强类-->
    <bean id="aspect" class="cn.happy.serviceXML.MyAspect"></bean>

    <!--aop-->
    <aop:config>
        <!--设置一个切点-->
        <aop:pointcut id="mycut" expression="execution(* *..serviceXML.*.*(..))"></aop:pointcut>
       <aop:aspect ref="aspect">
           <aop:before method="myBefore" pointcut-ref="mycut"></aop:before>
           <!--<aop:after-returning method="after" pointcut-ref="mycut"></aop:after-returning>-->
           <!--<aop:around method="myArround" pointcut-ref="mycut"></aop:around>-->
       </aop:aspect>
    </aop:config>
</beans>

2.运行后结果  

 技术分享

spring实现AOP

标签:win   tor   XML   happy   生成   dos   logs   user   mapped   

原文地址:http://www.cnblogs.com/cn-930621/p/7657715.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!