AOP: 面向切面编程. 通过动态代理实现.

AOP就3条线, 2条线给剪断.

实现:动态代理

如果实现interface的话, 用Proxy, InvocationHandler.

不实现interface的话, 用cglib操作二进制码实现.

AOP用在哪里:

性能, 日志, 权限检查, transaction.

项目里如何使用: 声明式事务管理.

JDK提供了两个提供动态代理的类: Proxy, InvocationHandler.

UserServiceTest.java:

  1. package com.bjsxt.service;
  2. import java.lang.reflect.Proxy;
  3. import org.junit.Test;
  4. import com.bjsxt.aop.LogInterceptor;
  5. import com.bjsxt.dao.UserDAO;
  6. import com.bjsxt.dao.impl.UserDAOImpl;
  7. import com.bjsxt.model.User;
  8. import com.bjsxt.spring.BeanFactory;
  9. import com.bjsxt.spring.ClassPathXmlApplicationContext;
  10. public class UserServiceTest {
  11. @Test
  12. public void testProxy() {
  13. UserDAO userDAO = new UserDAOImpl();
  14. LogInterceptor li = new LogInterceptor();
  15. li.setTarget(userDAO);
  16. UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), li);
  17. System.out.println(userDAOProxy.getClass());
  18. userDAOProxy.delete();
  19. userDAOProxy.save(new User());
  20. }
  21. }

代理 LogInterceptor.java:

  1. package com.bjsxt.aop;
  2.  
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5.  
  6. public class LogInterceptor implements InvocationHandler {
  7. private Object target;
  8.  
  9. public Object getTarget() {
  10. return target;
  11. }
  12.  
  13. public void setTarget(Object target) {
  14. this.target = target;
  15. }
  16.  
  17. public void beforeMethod(Method m) {
  18. System.out.println(m.getName() + " start");
  19. }
  20.  
  21. public Object invoke(Object proxy, Method m, Object[] args)
  22. throws Throwable {
  23. beforeMethod(m);
  24. m.invoke(target, args);
  25. return null;
  26. }
  27. }

UserDAOImpl.java:

  1. package com.bjsxt.dao.impl;
  2. import com.bjsxt.dao.UserDAO;
  3. import com.bjsxt.model.User;
  4. public class UserDAOImpl implements UserDAO {
  5. public void save(User user) {
  6. System.out.println("user saved!");
  7. }
  8.  
  9. public void delete() {
  10. System.out.println("user deteleted");
  11. }
  12. }

UserDAO.java:

  1. package com.bjsxt.dao;
  2. import com.bjsxt.model.User;
  3.  
  4. public interface UserDAO {
  5. public void save(User user);
  6. public void delete();
  7. }

  

 

  

 

Spring--AOP--面向切面编程的更多相关文章

  1. 详细解读 Spring AOP 面向切面编程(二)

    本文是<详细解读 Spring AOP 面向切面编程(一)>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实 ...

  2. 浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~

    简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring ...

  3. spring AOP面向切面编程学习笔记

    一.面向切面编程简介: 在调用某些类的方法时,要在方法执行前或后进行预处理或后处理:预处理或后处理的操作被封装在另一个类中.如图中,UserService类在执行addUser()或updateUse ...

  4. 【Spring系列】Spring AOP面向切面编程

    前言 接上一篇文章,在上午中使用了切面做防重复控制,本文着重介绍切面AOP. 在开发中,有一些功能行为是通用的,比如.日志管理.安全和事务,它们有一个共同点就是分布于应用中的多处,这种功能被称为横切关 ...

  5. 从源码入手,一文带你读懂Spring AOP面向切面编程

    之前<零基础带你看Spring源码--IOC控制反转>详细讲了Spring容器的初始化和加载的原理,后面<你真的完全了解Java动态代理吗?看这篇就够了>介绍了下JDK的动态代 ...

  6. Spring AOP面向切面编程详解

    前言 AOP即面向切面编程,是一种编程思想,OOP的延续.在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等.在阅读本文前希望您已经对Spring有一定的了解 注:在能对代码进行添 ...

  7. Spring AOP 面向切面编程相关注解

    Aspect Oriented Programming 面向切面编程   在Spring中使用这些面向切面相关的注解可以结合使用aspectJ,aspectJ是专门搞动态代理技术的,所以比较专业.   ...

  8. Spring AOP 面向切面编程入门

    什么是AOP AOP(Aspect Oriented Programming),即面向切面编程.众所周知,OOP(面向对象编程)通过的是继承.封装和多态等概念来建立一种对象层次结构,用于模拟公共行为的 ...

  9. 详细解读 Spring AOP 面向切面编程(一)

    又是一个周末, 今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之. ...

  10. Spring Aop面向切面编程&&自动注入

    1.面向切面编程 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面的过程叫做面向切面编程 2.常用概念 原有功能:切点,pointcut 前置通知:在切点之前执行的功能,befor ...

随机推荐

  1. asp.net textbox控件readonly为true时,后台取值的问题

    如题,在后台通过textbox.Text方式取值为空,不论你默认值是否是空,如想要获得,需通过request.Form[""]的方式.

  2. linux c中select使用技巧

    1.select函数作为定时器使用    it_value.tv_sec = 0;    it_value.tv_usec = 100000:    select(1,NULL,NULL,NULL,& ...

  3. URL的# (转)

    http://www.ruanyifeng.com/blog/2011/03/url_hash.html

  4. php并发控制 , 乐观锁

    由于悲观锁在开始读取时即开始锁定,因此在并发访问较大的情况下性能会变差.对MySQL Inodb来说,通过指定明确主键方式查找数据会单行锁定,而查询范围操作或者非主键操作将会锁表. 接下来,我们看一下 ...

  5. 门面模式(Facade)解析

    门面模式使用一个门面类来包装一些复杂的类,对外提供一个简单的访问方法. 见如下代码: class CPU { public void startup() { System.out.println(&q ...

  6. 为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序

    在Android硬件抽象层(HAL)概要介绍和学习计划一文中,我们简要介绍了在Android系统为为硬件编写驱动程序的方法.简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的 ...

  7. JS-DOM元素灵活查找

    用className选择元素 封装成函数 <title>无标题文档</title> <script> /* window.onload=function () { ...

  8. 转:LoadRunner检查点使用小结

    LR中检查点有两种:图片和文字. 常用检查点函数如下: 1)web_find()函数用于从 HTML 页中搜索指定的文本字符串: 2)web_reg_find()函数注册一个请求,以在下一个操作函数( ...

  9. PAT (Advanced Level) 1102. Invert a Binary Tree (25)

    简单题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #in ...

  10. (转)Windows管道(Pipe)重定向stdout,stderr,stdin

    参考: http://qiusuoge.com/11496.html http://www.cnblogs.com/BoyXiao/archive/2011/01/01/1923828.html st ...