AOP实际开发工作比较常用,在此使用注解方式加深对面向切面编程的理解

废话不多少,先看下面的实例代码

场景:

1.未满一岁的小孩,在执行方法之前打印:“还没有满一岁,不会说话”,在执行方法之后打印:“请多多关注我!”

2.大于一岁的小孩,在执行方法之前打印:“大家好,我的名字叫: "+ baby.getName() + "我今年 "+ baby.getAge() +" 岁了!”,在执行方法之后打印:“请多多关注我!”

切面类:定义切点和切面方法

@Aspect
@Component
public class CheckAgeAspect { @Autowired
Baby baby; @Pointcut("@annotation(com.mb.util.CheckAge)") //@annotation声明以注解的方式来定义切点
public void checkDataPoint(){ }
@Before("checkDataPoint()") //前置通知
public void checkBefore(){
if (baby.getAge() <= 1) {
System.out.println("还没有满一岁,不会说话");
}else {
System.out.println("大家好,我的名字叫: "+ baby.getName() + "我今年 "+ baby.getAge() +" 岁了!");
}
}
@After("checkDataPoint()") //后置通知
public void checkAfter(){
System.out.println("请多多关注我!");
}
} /**
after returning 目标方法返回时执行 ,后置返回通知
after throwing 目标方法抛出异常时执行 异常通知
around 在目标函数执行中执行,可控制目标函数是否执行,环绕通知
以上三种通知使用上基本雷同不举例了
**/

注解方法:使用注解的方式来定义,在目标方法上面标注该注解

@Target(ElementType.METHOD)   //定义注解的使用范围为方法
@Retention(RetentionPolicy.RUNTIME )
public @interface CheckAge { }

目标类

@Data  //需要导入import lombok.Data; 通过注解搞定getter和setter
@Component
public class Baby { private int age;
private String name; @CheckAge
public void say(){
System.out.println("执行目标方法");
}
}

applicationContext.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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <context:component-scan base-package="com.mb"></context:component-scan> <!--项目包扫描-->
<aop:aspectj-autoproxy proxy-target-class="false"></aop:aspectj-autoproxy> <!--使用注解的方式,需要添加该标签,它会调用AspectJAutoProxyBeanDefinitionParser的parse来解析;   proxy-target-class为true则是基于类的代理将起作用(需要cglib库),为false或者省略这个属性,则标准的JDK 基于接口的代理将起作用,一般采用后者,因为前者效率高-->
</beans>

测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:**/applicationContext*.xml"})
public class DemoTest { @Autowired
Baby person;
@Test
public void demoTest(){
person.setAge(3);
person.setName("美美");
person.say();
}
}

执行结果:

大家好,我的名字叫: 美美我今年 3 岁了!
执行目标方法
请多多关注我!

java AOP使用注解@annotation方式实践的更多相关文章

  1. Java学习之注解Annotation实现原理

    前言: 最近学习了EventBus.BufferKinfe.GreenDao.Retrofit 等优秀开源框架,它们新版本无一另外的都使用到了注解的方式,我们使用在使用的时候也尝到不少好处,基于这种想 ...

  2. java中的注解(Annotation)

    转载:https://segmentfault.com/a/1190000007623013 简介 注解,java中提供了一种原程序中的元素关联任何信息.任何元素的途径的途径和方法. 注解是那些插入到 ...

  3. spring中aop的注解实现方式简单实例

    上篇中我们讲到spring的xml实现,这里我们讲讲使用注解如何实现aop呢.前面已经讲过aop的简单理解了,这里就不在赘述了. 注解方式实现aop我们主要分为如下几个步骤(自己整理的,有更好的方法的 ...

  4. java基础篇---注解(Annotation)

    一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关 ...

  5. 简单介绍 Java 中的注解 (Annotation)

    1. 例子 首先来看一个例子: @Override public String toString() { return "xxxxx"; } 这里用了 @Override, 目的是 ...

  6. Spring AOP通过注解的方式设置切面和切入点

    切面相当于一个功能的某一个类,切入点是这个类的某部分和需要额外执行的其他代码块,这两者是多对多的关系,在代码块处指定执行的条件. Aspect1.java package com.yh.aop.sch ...

  7. hibernate笔记--使用注解(annotation)方式配置单(双)向多对一的映射关系

    前面几篇都是介绍的用配置文件来实现实体类到数据库表的映射,这种方式是比较麻烦的,每一个pojo类都需要写一个相应的*.hbm.xml,无疑增加了很多代码量,不过也有优点就是利于维护,为了方便开发,Hi ...

  8. Java 基础之--注解Annotation详解

    自定义注解入门: public @interface Annotation01 { //set default value ""; String value() default & ...

  9. Spring 框架的AOP之注解的方式

    1. 环境搭建 1.1 导入 jar 包 Spring 框架的基本开发包(6个); Spring 的传统AOP的开发包 spring-aop-4.3.10.RELEASE org.aopallianc ...

随机推荐

  1. Activiti的BPMN演示工具

    场景是这样的:产品经理不懂技术,又不想安装Java以及Eclipse(需要安装Activiti BPMN Designer的插件). 这两天解决.bpmn的解析(BPMNParser)时顺带找到一个顺 ...

  2. jq源码解析之绑在$,jQuery上面的方法

    1.当我们用$符号直接调用的方法.在jQuery内部是如何封装的呢?有没有好奇心? // jQuery.extend 的方法 是绑定在 $ 上面的. jQuery.extend( { //expand ...

  3. 解决问题的方法=>现象-->原因-->方案-->方案的优缺点

    解决问题的方法=>现象-->原因-->方案-->方案的优缺点

  4. python下对appium服务端的操作

    appium -p 4703 -bp 5500 -U 127.0.0.1:5005 -p 指的是·appium的服务器端口 -bp 指的是 连接安卓设备端口 -U 指的是 安卓设备 大体思路: 1. ...

  5. BZOJ1127 POI2008KUP(悬线法)

    首先显然地,如果某个格子的权值超过2k,其一定不在答案之中:如果在[k,2k]中,其自身就可以作为答案.那么现在我们只需要考虑所选权值都小于k的情况. 可以发现一个结论:若存在一个权值都小于k的矩阵其 ...

  6. ZOJ2836-Number Puzzle-容斥原理

    依次考虑一个数的倍数,两个数的倍数(lcm),三个数的倍数(lcm)... 会发现有这么一个规律,奇数个数时要加上情况数,偶数个数时要减去情况数. 一种只有10个数,用二进制枚举所有情况即可. #in ...

  7. Code POJ - 1780(栈模拟dfs)

    题意: 就是数位哈密顿回路 解析: 是就算了...尼玛还不能直接用dfs,得手动开栈模拟dfs emm...看了老大半天才看的一知半解 #include <iostream> #inclu ...

  8. hg和git命令对照表

    hg和git命令对照表 来源 https://github.com/sympy/sympy/wiki/Git-hg-rosetta-stone Git hg rosetta stone   muxat ...

  9. Python3网络爬虫(3):使用User Agent和代理IP隐藏身份

    Python版本: python3 IDE: pycharm2017.3.3 一.为何要设置User Agent 有一些网站不喜欢被爬虫访问,所以会检测对象,如果是爬虫程序,他就会不让你访问,通过设置 ...

  10. HNOI2017大佬

    贼难的一道题 虽然算法都不难,但组合起来就是想不到 首先,最简单的一步,对所有大佬,嘲讽你减的自信值和你做水题回复自信值都是不变的,写个\(dp\),设\(dp[i][j]\)表示第\(i\)天自信值 ...