原文链接:http://www.orlion.ga/205/

一、AOP简介

1、AOP概念

参考文章:http://www.orlion.ml/57

2、AOP的产生

对于如下方法:

    public class UserDAOImpl implements UserDAO{
    
     public void saveUser(User user){
     doSaveUser();
     }
    }

想在saveUser方法中执行保存用户之前和之后记录当前时间以求出saveUser花费了多少时间,方法有很多种,最直观的写法就是在doSaveUser()前后加代码取出当前时间:

    public class UserDAOImpl implements UserDAO{
    
     public void saveUser(User user){
     int beginTime = getCurrentTime();
    
     doSaveUser();
    
     int endTime = getCurrentTime();
     }
    }

还有一种方法就是重新写一个类继承自UserDAOImpl然后重写saveUser方法,如下:

    public class UserDAOImpl2 extends UserDAOImpl{
        @Override
public void saveUser(User user){
int beginTime = getCurrentTime(); super.saveUser(); int endTime = getCurrentTime();
}
    }

这种方法耦合性太强,一旦父类改变了子类也会改变,慎用继承

再有一种方法就是在调用saveUser()方法时加代码:

    public class UserService{
        
public void saveUser(User user){
        UserDAOImpl userDao = new UserDAOImpl();
int beginTime = getCurrentTime(); userDao.saveUser(); int endTime = getCurrentTime();
}
    }

现在如果让我们将项目中所有的对数据库进行CRUD操作的方法都加上获取时间的代码,显然工作量太大,这时候就用动态代理: (可参考http://www.orlion.ml/207/)

UserDAOImpl.java

    package ml.orlion.dao.impl;
    
    import ml.orlion.dao.UserDAO;
    import ml.orlion.model.User;
    
    public class UserDAOImpl implements UserDAO{
    
     public void saveUser(User user){
     System.out.println("save usering");
     }
    }

TimeInterceptor.java

    package ml.orlion.aop;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class TimeInterceptor implements InvocationHandler{
    
     private Object target;// 被代理的对象
    
     public Object getTarget() {
     return target;
     }
     public void setTarget(Object target) {
     this.target = target;
     }
     public void beforeMethod(Method m){
     System.out.println(m.getName() + "begin start");
     }
     @Override
     public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
    
     this.beforeMethod(m);// 插入方法
     m.invoke(target, args);
     return null;
     }
    }

测试

    public static void testProxy(){
// 首先产生一个被代理对象
UserDAO userDao = new UserDAOImpl();
// 下一步将被代理对象交给InvocationHandler即TimeInterceptor
TimeInterceptor ti = new TimeInterceptor();
// 设置被代理对象
ti.setTarget(userDao);
// 根据被代理对象产生一个代理
UserDAO userProxy = (UserDAO)Proxy.newProxyInstance(UserDAO.class.getClassLoader(), new Class[]{UserDAO.class}, ti);
userProxy.saveUser(new User());
    }

运行可以看到控制台打印:saveUserbegin start      save usering

二、使用Spring AOP

UserDAO.java:

package ml.orlion.dao;

import ml.orlion.model.User;

public interface UserDAO {
public void saveUser(User user);
}

UserDAOImpl.java:

package ml.orlion.dao.impl;

import ml.orlion.dao.UserDAO;
import ml.orlion.model.User; public class UserDAOImpl implements UserDAO{ public void saveUser(User user){
System.out.println("save usering");
}
}

UserService.java

package ml.orlion.service;

import ml.orlion.dao.UserDAO;
import ml.orlion.dao.impl.UserDAOImpl;
import ml.orlion.model.User; public class UserService { private UserDAO userDAO = new UserDAOImpl(); public UserDAO getUserDao() { return userDAO;
} public void setUserDao(UserDAO userDAO) {
this.userDAO = userDAO;
} public void saveUser(User user){
this.userDAO.saveUser(user);
}
}

LogInterceptor.java

package ml.orlion.aop;

public class LogInterceptor {

	public void before(){
System.out.println("before");
}
}

beans.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: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.xsd"> <bean id="logInterceptor" class="ml.orlion.aop.LogInterceptor">
</bean>
   <bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl">
 
   </bean>
   <bean id="userService" class="ml.orlion.service.UserService">
   <property name="userDao" ref="userDao"/>
   </bean>
   <aop:config>
   <aop:pointcut expression="execution(public * ml.orlion.service..*.add(..))"
   id="servicePointcut" />
   <aop:aspect id="logAspect" ref="logInterceptor">
   <aop:before method="before" pointcut-ref="servicePointcut"/>
   </aop:aspect>
   </aop:config>
</beans>

测试:

BeanFactory appContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService) appContext.getBean("userService");
userService.saveUser(new User());

Spring(三)AOP面向切面编程的更多相关文章

  1. Spring 08: AOP面向切面编程 + 手写AOP框架

    核心解读 AOP:Aspect Oriented Programming,面向切面编程 核心1:将公共的,通用的,重复的代码单独开发,在需要时反织回去 核心2:面向接口编程,即设置接口类型的变量,传入 ...

  2. Spring:AOP面向切面编程

    AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...

  3. spring框架学习(三)——AOP( 面向切面编程)

    AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ...

  4. Spring框架 AOP面向切面编程(转)

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  5. spring:AOP面向切面编程02

    参考: https://blog.csdn.net/jeffleo/article/details/54136904 一.AOP的核心概念AOP(Aspect Oriented Programming ...

  6. Spring的AOP面向切面编程

    什么是AOP? 1.AOP概念介绍 所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程. 功能: 让关注点代码与业务代码分离! 关注点: 重复代码就叫做关注点: ...

  7. Spring注解 - AOP 面向切面编程

    基本概念: AOP:Aspect Oriented Programming,即面向切面编程 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 前置通知(@Before):在目标 ...

  8. Spring框架——AOP面向切面编程

    简介 AOP练习 使用动态代理解决问题 Spring AOP 用AspectJ注解声明切面 前置后置通知 利用方法签名编写AspectJ切入点表达式 指定切面的优先级 基于XML的配置声明切面 Spr ...

  9. Spring之AOP(面向切面编程)_入门Demo

    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可 ...

随机推荐

  1. Exchange超级实用命令行

    发现Powershell很强大以后,就欲罢不能了.来点干货

  2. 使用spring的@Scheduled注解执行定时任务,启动项目不输出警告

    在applicationContext.xml中添加: xmlns:task="http://www.springframework.org/schema/task" xsi:sc ...

  3. C#调用Win32API

    Win32API.cs   using System;using System.Drawing;using System.Runtime.InteropServices;using Lordal.Wi ...

  4. h5 audio标签在手机上不能自动播放????

    最近在做一个微信端的项目,快到接近尾声的时候,发现还没放入音频,于是乎,放入音频,在电脑端测试一切正常,无阻碍. 后来在手机上测试,发现背景音乐不能播放,于是开始找错,刚开始以为是IIS服务器出错,结 ...

  5. 关于Hibernate的Dialect

    org.hibernate HibernateException Dialect must be explicitly set :***  使用Hibernate,有时候会遇到类似上面的异常.  使用 ...

  6. tabhost 下 setOnItemClickListener失效的问题

    分析了一下代码,应该是tabhost 的ontabchangedListener接管了下面应该由setOnItemClickListener接管的部分,导致不能相应setOnItemClickList ...

  7. 安卓端360度全景图的html5实现

    这里是一款旅游相关的安卓应用,其中虚拟旅游的功能采用html5的360度全景图技术实现,使用户能够身临其境的感受旅游景点的风光. 此处引入了ddpanorama插件,它的原理是在canvas上绘制全景 ...

  8. c#中abstract与virtua、overridel的用法

    1.abstract 抽象方法 ,virtual 虚方法 ,override 重载函数 父类A.m() 子类B.m()   abstract的方法父类可以不实现,让子类去重写(重写=overwrite ...

  9. C#使用HttpWebRequest 进行请求,提示 基础连接已经关闭: 发送时发生错误。

    本人今天遇到的错误,C#使用HttpWebRequest 进行请求,提示 基础连接已经关闭: 发送时发生错误. 测试了很久,才发现,是安全协议问题,把安全协议加上就可以了

  10. AJAX学习随笔

    AJAX名为“啊,贾克斯”,听着挺怪的哈. 主要的技术就是XMLHttpRequest对象和Javascript 度娘的解答: AJAX即“AsynchronousJavascriptAndXML”( ...