Spring AOP前置通知实例说明AOP相关概念

今天又看了下韩顺平的SpringAOP的讲解,讲解的很透彻。仿照视频自己使用下前置通知。

一、引出问题

  有个接口TestServiceInter,有两个实现方法TestService和Test2Service。他们都有sayHello();我们的需求是在调用这两个方法之前,要先完成写日志的功能;

二、菜鸟的想法

  我在各个实现类的sayHello()方法里面写上写日志的功能就是了。

  这样实现存在的问题:代码冗余。当所有实现类都要加上日志功能的时候,需要写很多重复代码

三、利用AOP前置通知实现此功能

3.1 第一步:我们需要定义一个接口  

package com.jdc.aop;

/**
 * @author DEllComputer
 * @Title: TestService
 * @ProjectName SpringAop
 * @Description:
 * @date 2018/12/251:38 PM
 */
public interface TestService {

    /**
      * @Description:
      * @param ${tags}
      * @return ${return_type}
      * @throws
      * @author jdc
      * @date 2018/12/25 1:39 PM
      */
    void sayHi(String name);

}

3.2 第二步:实现接口

public class TestServiceImpl implements TestService {

    private String name;

    /**
      * @Description: say hi
      * @param ${tags}
      * @return ${return_type}
      * @throws
      * @author jdc
      * @date 2018/12/25 1:40 PM
      */
    @Override
    public void sayHi(String name ) {
        System.out.println("hi:" + name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3.3 第三步:实现前置通知(AOP中通知的概念就是实现增强代码逻辑的,比如这里的记录日志)

/**
 * @author DEllComputer
 * @Title: MyBeforeAdvice
 * @ProjectName SpringAop
 * @Description: 写日志前置通知
 * @date 2018/12/251:42 PM
 */
public class MyBeforeAdvice implements MethodBeforeAdvice {

    /**
      * @Description: 写日志的功能
      * @param ${tags}
      * @return ${return_type}
      * @throws
      * @author jdc
      * @date 2018/12/25 1:44 PM
      */
    @Override
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println("我是写日志的功能。");
    }
}

前置通知需要实现MethodBeforeAdvice接口,前置通知是在目标方法调用之前调用;

3.4 第四步:在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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 配置前置通知 -->
    <bean id="myBeforeAdvice" class="com.jdc.aop.advice.MyBeforeAdvice"/>

    <!-- 配置被代理对象 -->
    <bean id="logTestServiceImpl" class="com.jdc.aop.TestServiceImpl">
        <property name="name" value="Test"></property>
    </bean>

    <!-- 配置代理对象 -->
    <bean id="proxyFactoryBean"   class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- 代理接口集 配置哪些接口要被代理 -->
        <property name="proxyInterfaces">
            <list>
                <value>com.jdc.aop.TestService</value>
            </list>
        </property>

        <!-- 把通知织入代理对象 -->
        <property name="interceptorNames">
            <value>myBeforeAdvice</value>
        </property>

        <!-- 配置被代理的对象 -->
        <property name="target" ref="logTestServiceImpl"/>

    </bean>

</beans>
ProxyFactoryBean是一个代理对象,如果我们被代理的对象实现了接口,Spring使用的是jdk动态代理技术实现的动态代理;所以我们要告诉代理对象,我们的哪些接口需要被代理,然后哪个对象需要被代理,我的增强实现应该怎么被织入到代理对象(前置,后置,环绕....)

3.5 第五步:写测试代码测试

public class TestMain {

    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
        //获取代理对象
        TestService log = (TestService) ac.getBean("proxyFactoryBean");
        log.sayHi("哈哈");

    }
}

注意这里,我们需要获取代理对象,而不是目标对象,不然不能调用前置通知的代码。

原文地址:https://www.cnblogs.com/softjiang/p/10177139.html

时间: 2024-11-03 12:37:38

Spring AOP前置通知实例说明AOP相关概念的相关文章

Spring AOP前置通知实例讲解与AOP详细解析

一.引出问题 有个接口TestServiceInter,有两个实现方法TestService和Test2Service.他们都有sayHello():我们的需求是在调用这两个方法之前,要先完成写日志的功能:二.菜鸟的想法 我在各个实现类的sayHello()方法里面写上写日志的功能就是了. 这样实现存在的问题:代码冗余.当所有实现类都要加上日志功能的时候,需要写很多重复代码三.利用AOP前置通知实现此功能3.1 第一步:我们需要定义一个接口 package com.jdc.aop; /** @a

Spring AOP前置通知和后置通知

Spring AOP AspectJ:Java社区里最完整最流行的AOP框架 在Spring2.0以上的版本中,可以使用基于AspectJ注解或基于XML配置的AOP 在Spring中启用AspectJ注解支持 要在Spring应用中使用AspectJ注解,必须在classpath下包含AspectJ类库:aopalliance.jar.aspectj.weaver.jar和spring-aspects.jar 将aop Schema添加到<beans>根元素中. 要在Spring IOC容器

Spring初学之annotation实现AOP前置通知和后置通知

实现两个整数的加减乘除,并在每个计算前后打印出日志. ArithmeticCalculator.java: package spring.aop.impl; public interface ArithmeticCalculator { int add(int i,int j); int sub(int i,int j); int mul(int i,int j); int div(int i,int j); } ArithmeticCalculatorImpl.java: package sp

Spring AOP 前置通知和后置通知

加入JAR包: 在配置文件中加入AOP 的命名空间 基于注解的注解的方式,配置文件如下: beans-aop-helloworld.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema

Spring aop 前置通知

一.首先在项目中加入aop所需要的jar aopalliance-1.0.jaraspectjweaver-1.6.11.jarcommons-logging-1.1.1.jarspring-aop-3.0.5.RELEASE.jarspring-aspects-3.0.5.RELEASE.jarspring-beans-3.0.5.RELEASE.jarspring-context-3.0.5.RELEASE.jarspring-context-support-3.0.5.RELEASE.ja

Spring初学之annotation实现AOP前置通知、后置通知、返回通知、异常通知。

实现两个整数的加减乘除.在执行每个方法之前打印日志. ArithmeticCalculator.java: package spring.aop.impl; public interface ArithmeticCalculator { int add(int i,int j); int sub(int i,int j); int mul(int i,int j); int div(int i,int j); } ArithmeticCalculatorImpl.java: package sp

Spring初学之xml实现AOP前置通知、后置通知、返回通知、异常通知等

实现两个整数的加减乘除,在每个方法执行前后打印日志. ArithmeticCalculator.java: package spring.aop.impl.xml; public interface ArithmeticCalculator { int add(int i,int j); int sub(int i,int j); int mul(int i,int j); int div(int i,int j); } ArithmeticCalculatorImpl.java: packag

spring AOP和通知

1.  spring的通知 1.1.  AOP的概念 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象.事务管理是J2EE应用中一个关于横切关注点的很好的例子.在Spring AOP中,切面可以使用基于模式或者基于注解的方式来实现. 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候.在Spring AOP中,一个连接点总是表示一个方法的执行. 通知(Advice):在切面的某个特定的连接点上执行的动作.其中包括了"aroun

Spring AOP 之 通知、连接点、切点、切面。

1:知识背景 软件系统可以看成是由一组关注点组成的,其中,直接的业务关注点,是直切关注点.而为直切关注点提供服务的,就是横切关注点. 2:面向切面的基本原理 什么是面向切面编程 横切关注点:影响应用多处的功能(安全.事务.日志) 切面: 横切关注点被模块化为特殊的类,这些类称为切面 优点: 每个关注点现在都集中于一处,而不是分散到多处代码中 服务模块更简洁,服务模块只需关注核心代码. AOP 术语 通知: 定义:切面也需要完成工作.在 AOP 术语中,切面的工作被称为通知. 工作内容:通知定义了