1.文件目录:

2.实体类

  1. package com.wangcf.po;
  2.  
  3. public class User {
  4. private int id;
  5. private String name;
  6. private String password;
  7.  
  8. public int getId() {
  9. return id;
  10. }
  11. public void setId(int id) {
  12. this.id = id;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. public String getPassword() {
  21. return password;
  22. }
  23. public void setPassword(String password) {
  24. this.password = password;
  25. }
  26. }

3.接口:

  1. package com.wangcf.manager;
  2.  
  3. import com.wangcf.po.User;
  4.  
  5. public interface IUserManager {
  6.  
  7. public void addUser();
  8.  
  9. public void addUser(User user);
  10. public void delUser(int uid);
  11.  
  12. public User modifyUser(User user);
  13. }

4.实现类:

  1. package com.wangcf.manager;
  2.  
  3. import com.wangcf.po.User;
  4.  
  5. public class UserManagerImp implements IUserManager{
  6.  
  7. @Override
  8. public void addUser() {
  9. // TODO Auto-generated method stub
  10. System.out.println("UserManagerImp addUser..");
  11. }
  12.  
  13. @Override
  14. public void delUser(int uid) {
  15. // TODO Auto-generated method stub
  16. System.out.println("UserManagerImp delUser..");
  17. }
  18.  
  19. @Override
  20. public User modifyUser(User user) {
  21. // TODO Auto-generated method stub
  22. user.setName(user.getName()+",修改后的");
  23. System.out.println("UserManagerImp modifyUser..");
  24. return null;
  25. }
  26.  
  27. @Override
  28. public void addUser(User user) {
  29. // TODO Auto-generated method stub
  30. System.out.println("UserManagerImp addUser(User user)...");
  31. }
  32.  
  33. }

5.切面:

  1. package com.wangcf.manager.aspect;
  2.  
  3. import org.aspectj.lang.JoinPoint;
  4. import org.aspectj.lang.annotation.After;
  5. import org.aspectj.lang.annotation.AfterReturning;
  6. import org.aspectj.lang.annotation.AfterThrowing;
  7. import org.aspectj.lang.annotation.Around;
  8. import org.aspectj.lang.annotation.Aspect;
  9. import org.aspectj.lang.annotation.Before;
  10.  
  11. @Aspect
  12. /**
  13. * 切面类
  14. * @author fan
  15. *
  16. */
  17. public class LogManager {
  18. @Before("execution(public void com.wangcf.manager.UserManagerImp.addUser())")
  19. /*addUser(..)表示带参数或不带参数
  20. * add*() 可以用通配符进行修饰
  21. * execution为切入点的指示符,还有其他的
  22. * advice(通知)
  23. */
  24. public static void addLogBefore(){
  25. System.out.println("添加日志 Before...");
  26. }
  27.  
  28. @After("execution(* com.wangcf.manager.*.*(..))")
  29. public void addLogAfter(){
  30. System.out.println("添加日志记录 After...");
  31. }
  32.  
  33. @AfterReturning("execution(* com.wangcf.manager.*.*(..))")
  34. public void addLogAfterReturning(){
  35. System.out.println("添加日志记录 AfterReturning...");
  36. }
  37.  
  38. @AfterThrowing("execution(* com.wangcf.manager.*.*(..))")
  39. public void addLogAfterThrowing(){
  40. System.out.println("添加日志记录 AfterThrowing...");
  41. }
  42.  
  43. @Around("execution(* com.wangcf.manager.*.*(..))")
  44. public void addLogAround(JoinPoint joinPoint){
  45. System.out.println("添加日志记录 AfterAround start...");
  46. System.out.println(joinPoint.getTarget());
  47. System.out.println("添加日志记录 AfterAround end...");
  48. }
  49. }

6.测试类:

  1. package com.wangcf.test;
  2.  
  3. import org.springframework.beans.factory.BeanFactory;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. import com.wangcf.manager.IUserManager;
  7. import com.wangcf.po.User;
  8.  
  9. public class TestAction {
  10. public static void main(String[] args) {
  11. BeanFactory factory=new ClassPathXmlApplicationContext("applicationContext.xml");
  12. IUserManager userManager=(IUserManager) factory.getBean("userManager");
  13. userManager.addUser();
  14. System.out.println("=================");
  15. User user=new User();
  16. user.setName("张三") ;
  17. userManager.addUser(user);
  18. System.out.println("========");
  19. userManager.modifyUser(null);
  20. }
  21. }

7.xml配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  7. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
  8.  
  9. <bean name="userManager" class="com.wangcf.manager.UserManagerImp"/>
  10. <bean name="logManager" class="com.wangcf.manager.aspect.LogManager"/>
  11. <!--启用AspectJ的支持 -->
  12. <aop:aspectj-autoproxy/>
  13. </beans>

8.输出

9.总结:

在xml配置中会生成代理类

在使用SpringAOP的时候,业务类需要实现接口,不然就需要使用CGLIB生成目标对象的代理类

Spring会自动选择用何种方式处理代理:

1.JDK动态代理:当目标对象实现了接口的时候

2.CGLIB的代理:当目标对象没有实现接口的时候

可以强制使用CGLIB来生成代理:

  1. <aop:aspectj-autoproxy proxy-target-class="true"/>

AOP:spring 的Annotation配置的更多相关文章

  1. 【学习】Spring 的 AOP :基于Annotation 的“零配置”方式

    转自:http://www.cnblogs.com/jbelial/archive/2012/07/20/2539123.html AOP(Aspect Orient Programming ) , ...

  2. 深入浅出学习Spring框架(四):IoC和AOP的应用——事务配置

    在前文 深入浅出学习Spring框架(一):通过Demo阐述IoC和DI的优势所在. 深入浅出学习Spring框架(三):AOP 详解 分别介绍了Spring的核心功能——IoC和AOP,光讲知识远远 ...

  3. spring集成mybatis配置多个数据源,通过aop自动切换

    spring集成mybatis,配置多个数据源并自动切换. spring-mybatis.xml如下: <?xml version="1.0" encoding=" ...

  4. 18-spring学习-利用Annotation配置AOP

    之前是通过配置完成aop操作,如果自己写的话,太麻烦了,可以使用基于annotation的配置完成. 第一步:打开AOP的annotation支持 加上一句话: <context:annotat ...

  5. Spring AOP源码分析(二):AOP的三种配置方式与内部解析实现

    AOP配置 在应用代码中,可以通过在spring的XML配置文件applicationContext.xml或者基于注解方式来配置AOP.AOP配置的核心元素为:pointcut,advisor,as ...

  6. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  7. spring框架中AOP思想与各种配置详解

    Spring中提供两种AOP支持:   1.基于代理的经典AOP   2.Aspectj注解配置AOP    首先我们先了解什么是AOP,AOP(Aspect Oriented Programming ...

  8. java 实现类似spring的可配置的AOP框架

    一.工厂类BeanFactory: 1.工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换. 2.getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符 ...

  9. Spring MVC 事务配置

    Spring MVC事务配置 要了解事务配置的所有方法,请看一下<Spring事务配置的5种方法> 本文介绍两种配置方法: 一.      XML,使用tx标签配置拦截器实现事务 一.   ...

随机推荐

  1. Ubuntu操作系统(我的是ubuntu 18.04.3 LTS)

    查看是否开启了ssh服务是否安装,使用命令: sudo ps -e |grep ssh 如果安装了的是会有sshd服务的,下面的图片是没有安装ssh服务 2 先更新资源列表,使用命令: sudo ap ...

  2. 笔记:javascript操作iframe内的DOM元素,及调用iframe内的方法

    iframe相当于一个嵌入在网页内的浏览器,它与当前网页是隔离的. 但有时我们也需要在当前网页操作iframe内的元素或操作iframe内的javascript方法. 在网页内操作DOM元素,是使用d ...

  3. 在全志V3/V3s和索智S3/S3L上调试32MB NorFlash

    选取MX25L25635F作为调试对象,其他型号的NorFlash开发调试原理基本一致.为了使V3/V3s/S3/S3L识别32MB NorFlash并正常工作,主要针对以下三个部分进行开发和调试.下 ...

  4. 发现环——第八届蓝桥杯C语言B组(国赛)第四题

    原创 标题:发现环 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台 电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管 ...

  5. Git最常用的命令 总结

    stage/unstage  git add xxx.xx 和 git reset HEAD xxx.xx 前者将本地的修改提交到index(此操作成为stage,参考备注1),后者将已提交到inde ...

  6. 20155216 2016-2017-2《Java程序设计》课程总结

    20155216 2016-2017-2<Java程序设计>课程总结 (按顺序)每周作业链接汇总 预备作业1:简要内容:我对师生关系的见解 预备作业2:简要内容:有关C语言学习调查以及学习 ...

  7. 20145234黄斐《网络对抗技术》PC平台逆向破解

    Shellcode注入 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址. ...

  8. How to bind a Command on a ContextMenu within a DataTemplate using MVVM

    Since the Popuup control has it's separate visual tree, you cannot use find ancestor to find the Gri ...

  9. shell loop

    #!/bin/sh date i=0 while [ $i -le 30 ] do         echi $i /usr/sbin/r2/np_test_acl -f rule.txt i=$(e ...

  10. pytest使用笔记(三)——pytest+allure+jenkins配置使用

    按照pytest使用笔记(二)把pytest+allure配置好后,现在在jenkins配置好,先实现手动构建(立个小目标) 一,安装jenkins插件 首页->系统管理->插件管理,从“ ...