一、使用代理工厂完成声明式增强

1.创建业务接口

public interface IdoSomeService {
    public void doSomething();
}

2.创建接口实现类

public class IdoSomeServiceImpl implements  IdoSomeService{
    @Override
    public void doSomething() {
        System.out.println("真实业务");
    }
}

3.创建切面类

/**
 * 切面
 */
public class MyBeforeAdvice implements MethodBeforeAdvice {
    @Override
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println("前置增强");
    }
}

4.编写applicationContext.xml配置文件

<!--注入业务Bean-->
    <bean id="idoSomeService" class="cn.spring.proxyfactory.IdoSomeServiceImpl"></bean>
    <!--增强:切面-->
    <bean id="myBeforeAdvice" class="cn.spring.proxyfactory.MyBeforeAdvice"></bean>
    <!--使用代理工厂实现增强-->
    <bean id="proxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!--将增强和业务织入 到一起 -->
        <property name="target" ref="idoSomeService"></property>
        <!--拦截增强类-->
        <property name="interceptorNames" value="myBeforeAdvice"></property>
     </bean>

5.创建测试类

    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取代理工厂
        IdoSomeService  idoSomeService=(IdoSomeService)context.getBean("proxyFactory");
        idoSomeService.doSomething();
    }
}

二、使用代理工厂完成环绕增强

1.创建业务接口

public interface IdoSomeService {
    public void doSomething();
}

2.创建业务接口实现类

public class IdoSomeServiceImpl implements  IdoSomeService{
    @Override
    public void doSomething() {
        System.out.println("真实业务");
    }
}

3.创建切面类

public class MyAroundAdvice implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        System.out.println("环绕前");

        //调用核心业务方法也可以获取方法内的参数 也可以获取目标对象
        Object proceed = methodInvocation.proceed();
        Object aThis = methodInvocation.getThis();
        System.out.println(aThis);

        System.out.println("环绕后");
        return proceed;
    }
}

4.编写applicationContext.xml配置文件

    环绕增强
    <bean id="idoSomeService"  class="cn.spring.around.IdoSomeServiceImpl"></bean>
    <bean id="myAroundAdvice"  class="cn.spring.around.MyAroundAdvice"></bean>
    <bean id="proxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!--将增强和业务织入到一起-->
        <property name="target" ref="idoSomeService"></property>
        <property name="interceptorNames" value="myAroundAdvice"></property>
        <!--更换代理方式    proxyTargetClass默认值为false   默认是jdk动态代理,但是当目标对象没有接口时,自动改为cglib-->
        <property name="proxyTargetClass" value="true"></property>
     </bean>

4.创建测试类

public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取代理工厂
        IdoSomeService idoSomeService=(IdoSomeService)context.getBean("proxyFactory");
        idoSomeService.doSomething();
    }

三、使用工厂代理工厂完成异常增强

1.创建业务接口

public interface IdoSomeService {
    public void doSomething() throws Exception;
}

2.创建业务接口实现类

public class IdoSomeServiceImpl implements IdoSomeService {
    @Override
    public void doSomething() throws Exception{
        int result=5/0;
        System.out.println("真实业务");
    }
}

3.创建切面类

public class MyThrowAdvice{
   public void afterThrowing(Exception ex){
       System.out.println("=====发生了异常,执行增强操作===============");
   }
}

4.编写applicationContext.xml配置文件

<!--环绕增强-->
    <bean id="idoSomeService"  class="cn.spring.around.IdoSomeServiceImpl"></bean>
    <bean id="myAroundAdvice"  class="cn.spring.around.MyAroundAdvice"></bean>
    <bean id="proxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!--将增强和业务织入到一起-->
        <property name="target" ref="idoSomeService"></property>
        <property name="interceptorNames" value="myAroundAdvice"></property>
        <!--更换代理方式    proxyTargetClass默认值为false   默认是jdk动态代理,但是当目标对象没有接口时,自动改为cglib-->
        <property name="proxyTargetClass" value="true"></property>
     </bean>

5.创建测试类

 public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取代理工厂
        IdoSomeService idoSomeService=(IdoSomeService)context.getBean("idoSomeService");
        try{
            idoSomeService.doSomething();

        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("2222222222222");
    }

四、使用代理工厂实现最终增强

1.创建业务接口

public interface IdoSomeService {
    public void doSomething() throws Exception;
}

2.创建业务接口实现类

public class IdoSomeServiceImpl implements IdoSomeService {
    @Override
    public void doSomething() throws Exception{
        int result=5/0;
        System.out.println("真实业务");
    }
}

3.创建切面类

public class MyThrowAdvice{
    public void afterAdvice(){
        System.out.println("======执行最终异常===============");
    }
}

4.编写applicationContext.xml配置文件

<bean id="idoSomeService" class="cn.spring.throwadvice.IdoSomeServiceImpl"></bean>
    <bean id="myAdvice" class="cn.spring.throwadvice.MyThrowAdvice"></bean>
    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* *..throwadvice.*.*(..))"/>
        <aop:aspect ref="myAdvice">
            <aop:after-throwing method="afterThrowing" throwing="ex" pointcut-ref="pointcut"></aop:after-throwing>
            <aop:after method="afterAdvice" pointcut-ref="pointcut"></aop:after>
        </aop:aspect>
    </aop:config>

5.创建测试类

public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取代理工厂
        IdoSomeService idoSomeService=(IdoSomeService)context.getBean("idoSomeService");
        try{
            idoSomeService.doSomething();

        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("2222222222222");
    }

多种方式实现AOP的更多相关文章

  1. 特性attribute,声明和使用attribute,应用attribute,AOP面向切面,多种方式实现AOP

    1 特性attribute,和注释有什么区别2 声明和使用attribute3 应用attribute4 AOP面向切面5 多种方式实现AOP ---------------------------- ...

  2. IOC和AOP使用扩展 多种方式实现依赖注入

    多种方式实现依赖注入 1.Spring 使用setter访问器实现对属性的赋值, 2.Spring 构造constructor方法赋值, 3.接口注入 4.Spring P命名空间注入直接量 sett ...

  3. Spring学习总结(一)——Spring实现IoC的多种方式

    控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...

  4. idea打包jar的多种方式

    这里总结出用IDEA打包jar包的多种方式,以后的项目打包Jar包可以参考如下形式: 用IDEA自带的打包形式 用Maven插件maven-shade-plugin打包 用Maven插件maven-a ...

  5. Java中测试异常的多种方式

    使用JUnit来测试Java代码中的异常有很多种方式,你知道几种? 给定这样一个class. Person.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  6. PDO多种方式取得查询结果

    PDO多种方式取得查询结果 01 December 2009 1:26 Tuesday by Sjolzy PDO最大的特点之一是它的灵活性,本节将介绍如何取得查询结果,包括: 数组(数值或关联数组) ...

  7. java 获取classpath下文件多种方式

    java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...

  8. sql语句分页多种方式ROW_NUMBER()OVER

    sql语句分页多种方式ROW_NUMBER()OVER 摘自: http://www.cnblogs.com/CodingArt/articles/1692468.html 方式一 select to ...

  9. JavaScript中判断为整数的多种方式

    之前记录过JavaScript中判断为数字类型的多种方式,这篇看看如何判断为整数类型(Integer). JavaScript中不区分整数和浮点数,所有数字内部都采用64位浮点格式表示,和Java的d ...

随机推荐

  1. 校园网打开IEEE 显示未登录

    校园网访问IEEE 显示未登录,如图 解决办法 1.打开网络和共享中心 2.如图 3.把ipv6的钩去掉 4.把host文件(在C:\Windows\System32\drivers\etc)复制到桌 ...

  2. Appium+python自动化(三十八) - Appium自动化测试框架综合实践 - 框架简介-助你冲击高薪,迎娶白富美(超详解)

    简介 好久没有更新博客了,博友们是不是有点等不及了.不好意思啊,中秋节过后太忙了,这篇是好不容易抽点零碎时间写的.从这一篇开始小伙伴或者童鞋们,就跟随宏哥的脚步,一步步的从无到有,从0到1的搭建一个完 ...

  3. SpringMVC 图片上传虚拟目录

    可以直接在tomcat的server.xml文件中进行设置,位置在Host中 添加内容为:<Context docBase="G:\JAVAtest\temp" path=& ...

  4. 第六届蓝桥杯java b组第四题

    第四题 两个整数做除法,有时会产生循环小数,其循环部分称为:循环节. 比如,11/13=6=>0.846153846153….. 其循环节为[846153] 共有6位. 下面的方法,可以求出循环 ...

  5. Java的EOF标识?

     这篇是关于JAVA中EOF标识的讲解,之前在工作上碰到过一个问题,有人问过,不能通过判断EOF来知道文件有没有读取完毕吗?其实,还真不能.  直接从JDK接口文档入手,以FileInputStrea ...

  6. Tomcat+Nginx+Linux+Mysql部署豆瓣TOP250的项目到腾讯云服务器

    写在前面 因为前面有写过一篇关于豆瓣的top250的电影的可视化展示项目,你可以移步http://blog.csdn.net/liuge36/article/details/78607955了解这个项 ...

  7. 基于Coravel定时任务之物联网设备数量统计

    目录 基于Coravel定时任务之物联网设备数量统计 1 应用背景 2 对比各家定时库 2.1 TaskScheduler 2.2 Fluent Scheduler 2.3 Quartz.net 2. ...

  8. 升级@Scheduled-分布式定时任务

    最近我在对项目的定时任务服务升级,希望改造成分布式,原本是利用@Scheduled注解实现,然而它并不支持分布式,如果改成quartz或者Spring Cloud Task,感觉对于自己这个简单的项目 ...

  9. package.json详解

    1.概念 Node.js项目遵循模块化的架构,当我们创建了一个Node.js项目,意味着创建了一个模块,这个模块的描述文件,被称为package.json 亦即:模块的描述文件 = package.j ...

  10. MyBatis详解 一篇就够啦

    第1章MyBatis框架配置文件详解 1.1 typeHandlers类型转换器 每当MyBatis 设置参数到PreparedStatement 或者从ResultSet 结果集中取得值时,就会使用 ...