课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > java程序:AspectJ对AOP的实现
  • java程序:AspectJ对AOP的实现

    发布:昆明Java培训      来源:达内新闻      时间:2016-10-19

  • 昆明达内Java培训的老师这一期讲的额知识点AspectJ对AOP的实现

    一:你应该明白的知识

    1.对于AOP这种编程思想,很多框架都进行了实现。Spring就是其中之一,可以完成面向切面编程。然而,AspectJ也实现了AOP的功能,且实现方式更为简捷,使用更加方便,而且还支持注解式开发。所以,Spring又将AspectJ对于AOP的实现 引入到了自己的框架中。在Spring中使用AOP开发时,一般使用AspectJ的实现方式。

    2.Spring的经典AOP配置方案

    01.使用的是Aspectj第三方框架,实现了AOP思想

    02.注解配置的AOP

    03.纯POJO <aop:config>

    3..切入点表达式

    execution(【modifiers-pattern?】访问修饰符

    ret-type-pattern返回值类型

    【declaring-type-pattern?】全限定性类名

    name-pattern(param-pattern)方法名(参数名)

    【throws-pattern?】)抛出异常类型

    切入点表达式要匹配的对象就是目标方法的方法名。所以,execution表达式中明显就是方法的签名。注意:表达式中加[]的部分表示可省略部分,各部分间用空格分开。在其中可以使用以下符号:

    符号      意义

    *     0至多个任意字符

    ..    用在方法参数中,表示任意多个参数

    用在包名后,表示当前包及其子包路径

    +   用在类名后,表示当前类及其子类

    用在接口后,表示当前接口及其实现类

    案例:

    execution(public * *(..))指定切入点为:任意公共方法

    execution(* set*(..))指定切入点为:任何一个以"set"开始的方法

    二.使用的是Aspectj第三方框架注解配置的AOP增强

    源码介绍:

    1.ISomeService.java

    package entity;

    //业务接口

    public interface ISomeService {

    //1.1 执行事务

    public void doTransaction();

    //1.2书写日志

    public String doLog();

    }

    2.SomeServiceImpl.java

    package entity;

    //接口的实现类

    public class SomeServiceImpl implements ISomeService {

    //实现接口中的方法

    @Override

    public void doTransaction() {

    System.out.println("----开启事务----");

    }

    @Override

    public String doLog() {

    //int i=5/0;//制造一个错误,用于测试异常增强

    System.out.println("---书写日志-----");

    return "abc";

    }

    }

    3.MyAspect.java(使用的是Aspectj第三方框架注解配置的AOP增强)

    package aop;

    //aspectj注解实现aop增强

    import org.aspectj.lang.ProceedingJoinPoint;

    import org.aspectj.lang.annotation.After;

    import org.aspectj.lang.annotation.AfterReturning;

    import org.aspectj.lang.annotation.AfterThrowing;

    import org.aspectj.lang.annotation.Around;

    import org.aspectj.lang.annotation.Aspect;

    import org.aspectj.lang.annotation.Before;

    //该类为切面

    @Aspect

    public class MyAspect {

    //前置通知

    @Before(value = "execution(public * *..ISomeService.doLog(..))")

    public void myBefore() {

    System.out.println("这是前置增强");

    }

    //后置通知

    @AfterReturning(value = "execution(public * *..ISomeService.doLog(..))")

    public void myAfterReturning() {

    System.out.println("这是后置增强");

    }

    //环绕增强

    @Around(value = "execution(public * *..ISomeService.doLog(..))")

    public void myAround(ProceedingJoinPoint pjp) throws Throwable {

    System.out.println("这是环绕前置增强");

    pjp.proceed();

    System.out.println("这是环绕后置增强");

    }

    //异常增强

    @AfterThrowing(value = "execution(public * *..ISomeService.doLog(..))")

    public void myAfterThrowing() {

    System.out.println("这是异常增强");

    }

    //最终增强

    @After(value = "execution(public * *..ISomeService.doLog(..))")

    public void myAfter() {

    System.out.println("这是最终增强");

    }

    }

    4.applicationContext.xml(Spring的配置文件)

    <?xml version="1.0" encoding="UTF-8"?>

    <beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:aop="http://www.springframework.org/schema/aop"

    xsi:schemaLocation="

    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--目标对象-->

    <bean id="someService" class="entity.SomeServiceImpl"></bean>

    <!--切面:-->

    <bean id="myAspect" class="aop.MyAspect"></bean>

    <!--自动代理-->

    <aop:aspectj-autoproxy/>

    </beans>

    5.MyTest.java

    package test;

    //测试类

    import org.springframework.context.ApplicationContext;

    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import entity.ISomeService;

    public class MyTest {

    public static void main(String[] args) {

    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

    ISomeService biz=(ISomeService)ctx.getBean("someService");

    biz.doLog();

    biz.doTransaction();

    System.out.println("success!");

    }

    }

    6.log4j.properties(日志配置文件)

    ### direct log messages to stdout ###

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender

    log4j.appender.stdout.Target=System.out

    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

    log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

    ### direct messages to file mylog.log ###

    log4j.appender.file=org.apache.log4j.FileAppender

    log4j.appender.file.File=c\:mylog.log

    log4j.appender.file.layout=org.apache.log4j.PatternLayout

    log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

    ### set log levels - for more verbose logging change 'info' to 'debug' ###

    log4j.rootLogger=info, stdout

    7.当然,同志们别忘了引入jar包啊!

    8.其测试结果展示:

    三:使用的是Aspectj第三方框架纯POJO基于Schema配置(<aop:config>)

    源码介绍:

    1.MyAspect.java

    package aop;

    import org.aspectj.lang.JoinPoint;

    import org.aspectj.lang.ProceedingJoinPoint;

    public class MyAspect {

    //前置通知

    public void myBefore() {

    System.out.println("这是前置增强");

    }

    public void before(JoinPoint jp) {

    System.out.println("前置通知方法before() jp = " + jp);

    }

    //后置通知

    public void myAfterReturning() {

    System.out.println("这是后置增强");

    }

    //带参数

    public void afterReturing(String result) {

    System.out.println("后置通知方法result = " + result);

    }

    //环绕通知

    public Object around(ProceedingJoinPoint pjp) throws Throwable {

    System.out.println("环绕通知方法,目标方法执行之前");

    //执行目标方法

    Object result = pjp.proceed();

    System.out.println("环绕通知方法,目标方法执行之后");

    return ((String) result).toUpperCase();

    }

    //异常通知

    public void afterThrowing() {

    System.out.println("异常通知方法");

    }

    public void afterThrowing(Exception ex) {

    System.out.println("异常通知方法ex = " + ex.getMessage());

    }

    //最终通知

    public void after() {

    System.out.println("最终通知方法");

    }

    }

    2.applicationContext.xml(Spring的配置文件)

    <?xml version="1.0" encoding="UTF-8"?>

    <beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"

    xmlns:aop="http://www.springframework.org/schema/aop"

    xsi:schemaLocation="

    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--目标对象-->

    <bean id="someService" class="entity.SomeServiceImpl"></bean>

    <!--切面:-->

    <bean id="myAspect" class="aop.MyAspect"></bean>

    <aop:config>

    <!--expression:切入点表达式-->

    <aop:pointcut expression="execution(public * *..ISomeService.doLog(..))"

    id="beforePointcut" />

    <aop:aspect ref="myAspect"><!-- ref:指定切面-->

    <!-- method:指定切面类中的方法;pointcut-ref:指定定义的切点-->

    <!--前置增强-->

    <aop:before method="myBefore" pointcut-ref="beforePointcut" />

    <!--前置增强带参-->

    <aop:before method="before(org.aspectj.lang.JoinPoint)"

    pointcut-ref="beforePointcut" />

    <!--后置增强-->

    <aop:after-returning method="myAfterReturning"

    pointcut-ref="beforePointcut" />

    <!--后置增强带参-->

    <aop:after-returning method="afterReturing(java.lang.String)"

    pointcut-ref="beforePointcut" returning="result" />

    <!--环绕增强-->

    <aop:around method="around" pointcut-ref="beforePointcut" />

    <!--异常增强-->

    <aop:after-throwing method="afterThrowing"

    pointcut-ref="beforePointcut" />

    <!--异常增强带参-->

    <aop:after-throwing method="afterThrowing(java.lang.Exception)"

    pointcut-ref="beforePointcut" throwing="ex" />

    <!--最终增强-->

    <aop:after method="after" pointcut-ref="beforePointcut" />

    </aop:aspect>

    </aop:config>

    </beans>

    其中昆明达内Java培训的老师发现,其他的类和文件和上面的例子中完全相同。

    推荐文章

上一篇:nginx反向代理配置及优化

下一篇:【昆明Java培训机构】简述抽象和封装

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56