实现步骤:

  1:导入类扫描的注解解析器
    命名空间:xmlns:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-2.5.xsd"

    xml配置文件如下配置:<context:component-scan base-package="com.lxk.spring.aop.annotation"/>

  2:导入springAOP的注解解析器
    命名空间:xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/aop 
      http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"

    xml配置文件如下配置:<aop:aspectj-autoproxy/>          //开启aop注释自动代理

  3:首先定义我们的类,实现项目中的某个功能。 

 import org.springframework.stereotype.Component;

 @Component("aopFun")                  //这里将此类加载到bean里面,这里是使用的注解形式,也可以通过spring.xml文件中配置<bean id="aopFun" class="com.zs.aop"></bean>进和依赖注入
public class AopFun{
public void printfStr(){
System.out.println("执行切点方法");
}
}

  4:配置切面类,也就是配置在什么情况下我们去执行切点:

 /**
* 注解方式声明aop
* 1.用@Aspect注解将类声明为切面(如果用@Component("")注解注释为一个bean对象,那么就要在spring配置文件中开启注解扫描,<context:component-scan base-package="com.cjh.aop2"/>
* 否则要在spring配置文件中声明一个bean对象)
* 2.在切面需要实现相应方法的前面加上相应的注释,也就是通知类型。
* 3.此处有环绕通知,环绕通知方法一定要有ProceedingJoinPoint类型的参数传入,然后执行对应的proceed()方法,环绕才能实现。
*/
@Component("aopTest")
@Aspect
public class AopTest{
//定义切点
@Pointcut("execution(* *.printfStr(..))")
public void printfString(){}
/**
* 前置通知(注解中的printfString()方法,其实就是上面定义pointcut切点注解所修饰的方法名,那只是个代理对象,不需要写具体方法,
* 相当于xml声明切面的id名,如下,相当于id="embark",用于供其他通知类型引用)
* <aop:config>
<aop:aspect ref="mistrel">
<!-- 定义切点 -->
<aop:pointcut expression="execution(* *.printfStr(..))" id="embark"/>
<!-- 声明前置通知 (在切点方法被执行前调用) -->
<aop:before method="beforSay" pointcut-ref="embark"/>
<!-- 声明后置通知 (在切点方法被执行后调用) -->
<aop:after method="afterSay" pointcut-ref="embark"/>
</aop:aspect>
</aop:config>
*/
@Before("printfString()")            //before:在切点执行之前执行
public void sayHello(){
System.out.println("注解类型前置通知");
}
//后置通知
@After("printfString()")            //After:在切点执行之后执行
public void sayGoodbey(){
System.out.println("注解类型后置通知");
}
//环绕通知。注意要有ProceedingJoinPoint参数传入。
@Around("printfString()")
public void sayAround(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("注解类型环绕通知..环绕前");      
pjp.proceed();//执行方法
System.out.println("注解类型环绕通知..环绕后");
}
}

  5:spring.xml文件配置

 <?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/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 开启注解扫描 -->
<context:component-scan base-package="com.zs.aop"/>
<!-- 开启aop注解方式,此步骤s不能少,这样java类中的aop注解才会生效 -->
<aop:aspectj-autoproxy/>
</beans>

  6:测试类

 package com.cjh.aop2;

 import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
*
* @author Caijh
* email:codecjh@163.com
* 2017年7月11日 下午6:27:06
*/
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("com/zs/aop/spring.xml");      //获取applicationContext对象
AopFun bean1= (AopFun) ac.getBean("aopFun");          //通过spring的bean对象获取AopFun对象,并对对象进行依赖注入
bean1.printfStr();                          //执行功能方法
}
}

  7:最后打印的结果为

    注解类型环绕通知..环绕前
    注解类型前置通知
    执行切点方法
    注解类型环绕通知..环绕后
    注解类型后置通知

通知类型有:

  1:@Before:通知这个方法会在功能之前执行

  2:@After:通知这个方法会在功能之后执行

  3:@AfterThrow:通知这个方法会在功能抛出异常时执行

  4:@AfterReturning:通知这个方法会在功能return后执行

  5:@Around:通知这个方法会将功能封装起来

在最后也简单说一下通过spring.xml文件配置aop

     <!-- 使用xml配置aop -->
<!-- 强制使用cglib代理,如果不设置,将默认使用jdk的代理,但是jdk的代理是基于接口的 -->
<aop:config proxy-target-class="true" />
<aop:config>
   <!--定义切面-->
  <aop:aspect id="logAspect" ref="logInterceptor">
  <!-- 定义切入点 (配置的的有printfStr方法在调用之前都会被拦截)-->
<aop:pointcut expression="execution(execution(* *.printfStr(..)))" id="logPointCut"/>
9    <!--方法执行之前被调用执行的-->
   <aop:before method="before" pointcut-ref="logPointCut"/><!--一个切入点的引用-->
   <aop:after method="after" pointcut-ref="logPointCut"/><!--一个切入点的引用-->
   </aop:aspect>
  </aop:config>

Spring AOP注解形式简单实现的更多相关文章

  1. Spring AOP注解为什么失效?90%Java程序员不知道

    使用Spring Aop注解的时候,如@Transactional, @Cacheable等注解一般需要在类方法第一个入口的地方加,不然不会生效. 如下面几种场景 1.Controller直接调用Se ...

  2. Spring Boot -- Spring AOP原理及简单实现

    一.AOP基本概念 什么是AOP,AOP英语全名就是Aspect oriented programming,字面意思就是面向切面编程.面向切面的编程是对面向对象编程的补充,面向对象的编程核心模块是类, ...

  3. spring的注解形式:@Repository、@Service、@Controller,

    Spring的注解形式:@Repository.@Service.@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean. @Repository.@Service.@C ...

  4. Spring aop注解失效

    问题 在spring 中使用 @Transactional . @Cacheable 或 自定义 AOP 注解时,对象内部方法中调用该对象的其他使用aop机制的方法会失效. @Transactiona ...

  5. Spring AOP Aspect的简单实现(基于注解)

    第1步:声明使用注解 <!-- 配置扫描注解--> 扫描包的位置<context:component-scan base-package="com.zz"/> ...

  6. Spring AOP就是这么简单啦

    前言 只有光头才能变强 上一篇已经讲解了Spring IOC知识点一网打尽!,这篇主要是讲解Spring的AOP模块~ 之前我已经写过一篇关于AOP的文章了,那篇把比较重要的知识点都讲解过了一篇啦:S ...

  7. Spring AOP 注解和xml实现 --转载

    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...

  8. 【学习笔记】Spring AOP注解使用总结

    Spring AOP基本概念 是一种动态编译期增强性AOP的实现 与IOC进行整合,不是全面的切面框架 与动态代理相辅相成 有两种实现:基于jdk动态代理.cglib Spring AOP与Aspec ...

  9. 死磕Spring之AOP篇 - Spring AOP注解驱动与XML配置

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

随机推荐

  1. Androidstudio坑

    1.intel haxm sdkmanager显示不可选中,而且boost设置好了intervt 解决:重新关闭,打开系统,然后开启.... 2.解决不了一直报错,(自己的代码,明明已经没有问题) 有 ...

  2. Hive进阶_汇总

    =========================================================================== 第2章 Hive数据的导入 使用Load语句执行 ...

  3. Python网络编程中的服务器架构(负载均衡、单线程、多线程和同步、异步等)

    这篇文章主要介绍服务器架构. 网络服务需要面对两个挑战. 第一个问题是核心挑战,要编写出能够正确处理请求并构造合适响应的代码. 第二个挑战是如何将网络代码部署到随系统自动启动的Windows服务或者是 ...

  4. C#oracle还原imp实例

    C#来做oracle还原,调用oracle自带函数imp.exe时,需要注意的是:1.imp.exe 中fromuser 和touser两个关键字: fromuser与exp.exe中的owner对应 ...

  5. 解决resteasy上传表单文件名乱码

    Dubbo在2.6版本后合并了dubbox的resteasy代码后,可以支持rest风格的接口发布,但是在使用form表单上传文件的时候,获取的文件名称是乱码. 下面通过对源码分析一下原因,并提供一种 ...

  6. session会话

    jsp会话篇session: package com.log; import java.io.IOException; import java.util.ArrayList; import java. ...

  7. Java中的多线程详解

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  8. GIT SSH免登录密码实现更新(git pull)、推送(git push)操作

     一.使用场景 现在有两台服务器A和B,在A服务器上搭建有git版本代码仓库,现要实现B服务器SSH免密码登录A服务器,并能够从A服务器拉取.推送代码! 二.操作步骤 1.在B服务器项目根目录下执行以 ...

  9. python读xml文件

    # -*- coding:utf-8 -*- import jsonimport requestsimport os curpath=os.path.dirname(os.path.realpath( ...

  10. Python+selenium之下载文件

    一.Firefox文件下载 Web容许我们设置默认的文件下载路劲,文件会自动下载并且存放在指定的目录下. from selenium import webdriver import os fp = w ...