今天又看了下韩顺平的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("哈哈"); }
}

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

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

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

    一.引出问题 有个接口TestServiceInter,有两个实现方法TestService和Test2Service.他们都有sayHello():我们的需求是在调用这两个方法之前,要先完成写日志的 ...

  2. Spring AOP前置通知和后置通知

    Spring AOP AspectJ:Java社区里最完整最流行的AOP框架 在Spring2.0以上的版本中,可以使用基于AspectJ注解或基于XML配置的AOP 在Spring中启用Aspect ...

  3. Spring AOP 前置通知

    我们使用AspectJ对Spring进行AOP操作,有两种方式,注解和XML配置方式,先在pom.xml中声明jar包 <dependencies> <dependency> ...

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

    实现两个整数的加减乘除,并在每个计算前后打印出日志. ArithmeticCalculator.java: package spring.aop.impl; public interface Arit ...

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

    实现两个整数的加减乘除,在每个方法执行前后打印日志. ArithmeticCalculator.java: package spring.aop.impl.xml; public interface ...

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

    实现两个整数的加减乘除.在执行每个方法之前打印日志. ArithmeticCalculator.java: package spring.aop.impl; public interface Arit ...

  7. 利用Spring AOP的通知类型以及创建通知

    写在最前端 1.SpringAOP中共有六种通知类型,只要我们自定义一个类实现对应的接口,它们全都是org.springframework.aop包中的. 2.AOP的连接点可以是方法调用.方法调用本 ...

  8. Spring详解(五)------AOP

    这章我们接着讲 Spring 的核心概念---AOP,这也是 Spring 框架中最为核心的一个概念. PS:本篇博客源码下载链接:http://pan.baidu.com/s/1skZjg7r 密码 ...

  9. Spring学习4-面向切面(AOP)之aspectj注解方式

    一.简介    1.AOP用在哪些方面:AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理.日志管理.权限控制,异常处理等,封装起来,便于减少系统的重复代码,降低模块间的耦合 ...

随机推荐

  1. 【Node.js】通过mongoose得到模型,不能新添字段的问题

    问题描述 通过node.js为查询到的json对象添加新的字段,对象成功保存到数据库中,但新增字段却没保存. 前几天用vue+node.js+mongodb技术做一个购物车功能的网页,发现node.j ...

  2. Jenkins结合.net平台综合之完整示例项目

    前面每一个部分我们都是介绍的单个功能,这里介绍一个完整项目,本文中所用到的命令都放在了github示例代码仓库中 https://github.com/mrtylerzhou/netdevops 命令 ...

  3. 用meterpreter实现跳板机

      meterpreter跳板机 背景:渗透测试者A拿到了B主机的控制权,但没有拿到ssh密码(不能打ssh隧道).现需横向移动渗透内网主机C,为了避免动作过大不便直接在B上对C进行渗透,其中C不能出 ...

  4. ROS笔记3 理解nodes

    http://wiki.ros.org/ROS/Tutorials/UnderstandingNodes 介绍几个命令行工具用法 roscore rosnode rosrun A node reall ...

  5. EF三种编程方式的区别Database first ,Model first ,code first

    首先对于EF中先出现的datebase  first和model first两种编程方式,其的区别根据字面意思很容易能够理解. datebase  first就是代表数据库优先,那么前提就是先创建数据 ...

  6. MySQL高级特性——绑定变量

    从MySQL 4.1 版本开始,就支持服务器端的绑定变量,这大大提高了客户端和服务器端数据传输的效率 介绍 当创建一个绑定变量 SQL 时,客户端会向服务器发送一个SQL语句的原型.服务器端收到这个S ...

  7. java三大版本和核心优势

    javaSE(java standard Edition):标准版,定位在个人计算机上的应用. javaEE(java Enterprise Edition):企业版,定位在服务器端的应用.***** ...

  8. Java多线程编程实战读书笔记(一)

    多线程的基础概念本人在学习多线程的时候发现一本书——java多线程编程实战指南.整理了一下书中的概念制作成了思维导图的形式.按照书中的章节整理,并添加一些个人的理解.

  9. 【Java千问】你了解代理模式吗?

    代理模式详解 1 什么是代理模式? 一句话描述:代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 详细描述: 1.理论基础-代理模式是设计原则中的“开闭原则 ...

  10. MySQL基础、主从复制、优化

    MySQL apache公司 开源共享 免费 mysql [-hlocalhost] -uroot -p 以超级管理员的身份登录 use demo; 查看 DCL(数据库控制语言): DDL(数据库定 ...