项目结构图

aaarticlea/png;base64,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" alt="" />aaarticlea/png;base64,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" alt="" />

注意事项:我原来用的JDK1.7匹配的是aspectjrt.1.6和aspectjweaver.1.6,因此会报错。

  如果要使用AspectJ完成注解切面需要注意下面的JDK与AspectJ的匹配:

  JDK1.6 —— aspectJ1.6

  JDK1.7 —— aspectJ1.7.3+

1,Bean的配文件。

<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd" > <aop:aspectj-autoproxy></aop:aspectj-autoproxy> <bean id="userManager" class="com.tgb.spring.UserManagerImpl"></bean> <bean id="aspectJAdvice" class="com.tgb.spring.AspectJAdvice"></bean> </beans>

2.UserManager的接口实现

package com.tgb.spring;

public interface UserManager {

    public abstract void addUser(String userName,String password);  

    public abstract void delUser(int userId);  

    public abstract String findUserById(int userId);  

    public abstract void modifyUser(int userId,String userName,String password);
}

3.继承UserManager接口实现UserManagerImpl

package com.tgb.spring;

public class UserManagerImpl implements UserManager {

    @Override
public void addUser(String userName, String password) {
// TODO Auto-generated method stub
System.out.println("----tianjia.delUser()----");
}
@Override
public void delUser(int userId) {
// TODO Auto-generated method stub
System.out.println("----shanchu.delUser()----");
}
@Override
public String findUserById(int userId) { System.out.println("----UserManagerImpl.findUserById()----"); if(userId <= ){
throw new IllegalArgumentException("该用户不存在");
}
return "jiuqiyuliang";
}
@Override
public void modifyUser(int userId, String userName, String password) {
// TODO Auto-generated method stub
System.out.println("----xiugai.delUser()----");
}
}

4.切面实现

package com.tgb.spring;

import org.aspectj.lang.JoinPoint;
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;
import org.aspectj.lang.annotation.Pointcut; @Aspect
public class AspectJAdvice { /**
* Pointcut
* 定义Pointcut,Pointcut的名称为aspectjMethod(),此方法没有返回值和参数
* 该方法就是一个标识,不进行调用
*/
@Pointcut("execution(* find*(..))")
private void aspectjMethod(){}; /**
* Before
* 在核心业务执行前执行,不能阻止核心业务的调用。
* @param joinPoint
*/
@Before("aspectjMethod()")
public void doBefore(JoinPoint joinPoint) {
System.out.println("-----doBefore.invoke-----");
System.out.println(" 此处意在执行核心业务逻辑前,做一些安全性的判断等等");
System.out.println(" 可通过joinPoint来获取所需要的内容");
System.out.println("-----End of doBefore()------");
} /**
* Around
* 手动控制调用核心业务逻辑,以及调用前和调用后的处理,
*
* 注意:当核心业务抛异常后,立即退出,转向AfterAdvice
* 执行完AfterAdvice,再转到ThrowingAdvice
* @param pjp
* @return
* @throws Throwable
*/
@Around(value = "aspectjMethod()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("-----doAround.invoke-----");
System.out.println(" 此处可以做类似于Before的事情"); //调用核心逻辑
Object retVal = pjp.proceed();
System.out.println(" 此处可以做类似于After的事情");
System.out.println("-----End of doAround()------");
return retVal;
} /**
* After
* 核心业务逻辑退出后(包括正常执行结束和异常退出),执行此Advice
* @param joinPoint
*/
@After(value = "aspectjMethod()")
public void doAfter(JoinPoint joinPoint) {
System.out.println("-----doAfter.invoke-----");
System.out.println(" 此处意在执行核心业务逻辑之后,做一些日志记录操作等等");
System.out.println(" 可通过joinPoint来获取所需要的内容");
System.out.println("-----End of doAfter()------");
} /**
* AfterReturning
* 核心业务逻辑调用正常退出后,不管是否有返回值,正常退出后,均执行此Advice
* @param joinPoint
*/
@AfterReturning(value = "aspectjMethod()", returning = "retVal")
public void doReturn(JoinPoint joinPoint, String retVal) {
System.out.println("-----doReturn().invoke-----");
System.out.println("Return Value: " + retVal);
System.out.println(" 此处可以对返回值做进一步处理");
System.out.println(" 可通过joinPoint来获取所需要的内容");
System.out.println("-----End of doReturn()------");
} /**
* 核心业务逻辑调用异常退出后,执行此Advice,处理错误信息
*
* 注意:执行顺序在Around Advice之后
* @param joinPoint
* @param ex
*/
@AfterThrowing(value = "aspectjMethod()", throwing = "ex")
public void doThrowing(JoinPoint joinPoint, Exception ex) {
System.out.println("-----doThrowing().invoke-----");
System.out.println(" 错误信息:"+ex.getMessage());
System.out.println(" 此处意在执行核心业务逻辑出错时,捕获异常,并可做一些日志记录操作等等");
System.out.println(" 可通过joinPoint来获取所需要的内容");
System.out.println("-----End of doThrowing()------");
}
}

5.Client端实现

package com.tgb.spring.client;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.tgb.spring.UserManager;
import com.tgb.spring.UserManagerImpl;
public class Client { public static void main(String[] args) {
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml"); UserManager userManager = (UserManager) factory.getBean("userManager");
//可以查找张三
userManager.findUserById(); System.out.println("=====我==是==分==割==线====="); try {
// 查不到数据,会抛异常,异常会被AfterThrowingAdvice捕获
userManager.findUserById();
} catch (IllegalArgumentException e) {
}
}
}

spring注解实现AOP的更多相关文章

  1. Spring注解(AOP)

    底层动态代理 程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 导入aop的相关模块 <!-- https://mvnrepository.com/artifact/org. ...

  2. spring注解开发-AOP(含原理)

    一:AOP基本使用 AOP指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式: 步骤一:导入aop模块:Spring AOP:(spring-aspects) <depen ...

  3. spring注解、aop(二)

    使用注解配置spring 1.导入 spring-aop-5.0.6.RELEASE.jar包 2.为主配置文件引入新的命名空间 xmlns:context="http://www.spri ...

  4. spring 注解 之 AOP基于@Aspect的AOP配置

    Spring AOP面向切面编程,可以用来配置事务.做日志.权限验证.在用户请求时做一些处理等等.用@Aspect做一个切面,就可以直接实现. 1.首先定义一个切面类,加上@Component  @A ...

  5. Spring注解配置Aop

    之前学习了SpringAop的基本原理.http://www.cnblogs.com/expiator/p/7977975.html 现在尝试使用注解来配置SpringAop. Aop,面向切面编程. ...

  6. Spring注解式AOP面向切面编程.

    1.AOP指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式.aop底层是动态代理. package com.bie.config; import org.aspectj.lan ...

  7. Spring 注解形式AOP

    AOP 面向切面编程,通过预编译的方式,在运行期通过动态代理实现一种技术,AOP可实现业务与切面的逻辑分离,降低耦合度 一.注解形式的AOP Aspect:切面 Joinpoint:连接点,要拦截的方 ...

  8. Spring 注解式Aop 入门

    首先在spring配置文件中加上 xmlns:aop="http://www.springframework.org/schema/aop" http://www.springfr ...

  9. Spring注解开发系列专栏

    这个系列主要是讲Spring注解的使用,可以为后面SpringBoot的学习带来一定的帮助.我觉得从Spring直接过度到SpringBoot还是有点快,还是得需要一个演变的过程.从Spring开发, ...

随机推荐

  1. 学习linux内核时常碰到的汇编指令(2)

    转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvh.html JNGE∶指令助记符——(有符号数比较)不大于且不等于转移(等价于JL).当SF和OF异 ...

  2. Tomcat不输入项目名进入自己项目(根目录指向自己的项目)

    <Host name="localhost" appBase="webapps" unpackWARs="true" autoDepl ...

  3. CentOS VMware 配置IP小结 静态 配置 桥接 NAT

    系统启动后可先ping下外网或局域网内其它机器. 如果配置虚拟机时选择的NAT上网方式,后面需要配置固定IP,请先参见VMware NAT方式下设置静态IP获得可用的IP范围和网关等信息. 先将ifc ...

  4. JQ学习(二)

    jQuery 效果 jQuery hide() 和 show() 语法: $(selector).hide(speed,callback); $(selector).show(speed,callba ...

  5. 2016.9.1 JavaScript入门之五

    1.数据类型:对象:也可以被认为是一个键/值存储,像一个字典.可以取代switch{case:case:}或者if else 例如: function phoneticLookup(val) { va ...

  6. SQL初级第二课

    随着我们数据库越来越复杂 我们要掌握的姿势也要也来越多.... 首先建立个表 create table shop(code int primary key identity (1,1),name va ...

  7. Django学习笔记之一

    一.Windows下安装 Django 1.下载安装包解压后放到本地目录如C:\Django-1.7.2 官网地址:https://www.djangoproject.com/download/ 2. ...

  8. Android 自动化测试—robotium(七) 使用Junit_report测试报告

    使用Robotium进行测试的时候,要想可以导出明了的测试结果,可以使用junitreport来实现 junit-report下载地址:https://github.com/jsankey/andro ...

  9. Storm可靠性实例解析——ack机制

    对于Storm,它有一个很重要的特性:“Guarantee no data loss” ——可靠性 很显然,要做到这个特性,必须要track每个data的去向和结果.Storm是如何做到的呢——ack ...

  10. hibernate.cfg.xml配置文件和hbm.xml配置文件

    http://blog.sina.com.cn/s/blog_a7b8ab2801014m0e.html hibernate.cfg.xml配置文件格式 <?xml version=" ...