`
Ivan_Pig
  • 浏览: 386803 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Spring2.0技术手册笔记——AOP_1_AOP概念与简单实现

阅读更多
   Ioc之前看了一些书籍,有写概念,而AOP则基本没什么概念。感觉比较深奥,就先从这里开刀。不过看了看,感觉其实就那么回事。
    一般情况下,一个方法里面除了完成业务外,肯定会加入一些其他多余的东西。。。。log(这个东西可能国外用得比较多,国内可能有这个习惯的人不多,我新手,肯定没这个习惯了。。。。),安全检查(这个应该是到处可见)。这样的话,这个方法就不‘纯’了。如果哪天你要把这写多余的东西去掉,那就要一个方法一个方法的去找。会累死人的。AOP就为解决这个问题的。
    先看代码(代码都为技术手册实例,简单明了!)。
    最原始也是最快速的给方法添加log的方法就像这样写。
import java.util.logging.Level;
import java.util.logging.Logger;

/*A normal java Class which will be 
compared with a Class using AOP*/

public class NormalClass {
	private Logger log = Logger.getLogger(this.getClass().getName());
	
	public void hello(String name){
		//log before print
		log.log(Level.INFO,"hello method starts....");
		//print
		System.out.println("Hello," + name);
		//log after print
		log.log(Level.INFO,"hello method ends....");
	}
}

    假如100个方法都要加log,重复代码可想而知了。(英文注释自己写的,书写水平很烂,阅读水平一般,欢迎拍砖。。。。)
   下面是以静态代理来实现最简单的aop。首先,定义个接口。实现类和代理类都实现此接口。
public interface SayHello {
	void hello(String hello);
}

    然后是实现类,里面就是最简单的业务处理---打印。
import staticproxy.inter.SayHello;

public class SayHelloImpl implements SayHello{

	@Override
	public void hello(String name) {
		System.out.println("Hello," + name);
	}
	
}

     接着是代理类,代理类里添加log。
import java.util.logging.Level;
import java.util.logging.Logger;

import staticproxy.inter.SayHello;

public class SayHelloImplProxy implements SayHello {
	
	private SayHello say;
	private Logger log ;
	
	public SayHelloImplProxy(SayHello say){
		this.say = say;
		log = Logger.getLogger(this.say.getClass().getName());
	}

	@Override
	public void hello(String name) {
		log.log(Level.INFO,"hello method starts....");
		this.say.hello(name);
		log.log(Level.INFO,"hello method ends....");
	}

}

    测试一下。
import dynamicproxy.LogHandler;

import staticproxy.SayHelloImpl;
import staticproxy.SayHelloImplProxy;
import staticproxy.inter.SayHello;
import normal.NormalClass;


public class Test {
	public static void main(String[] args){
		//Test normal.NormalClass
		NormalClass nor = new NormalClass();
		nor.hello("Ivan");
		
		//Test staticproxy.SayHelloImpl
		SayHello say = new SayHelloImplProxy(new SayHelloImpl()); 
		say.hello("Ivan");
		
			}
}

    两个输出应该是一样的。这样就把业务和log分开了。这是代理模式的简单体现,应该很简单。不过缺点显而易见,每个类都得有个代理类。
    于是就有了动态代理。直接实现java.lang.reflect.InvocationHandler接口即可。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.logging.Level;
import java.util.logging.Logger;

public class LogHandler implements InvocationHandler {

	private Logger log = Logger.getLogger(this.getClass().getName());
	private Object delegate;

	public Object bind(Object delegate) {
		this.delegate = delegate;
		return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
				delegate.getClass().getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object res = null;
		
		log(method + " method starts....");
		res = method.invoke(delegate, args);
		log.log(Level.INFO,method + " method ends....");		
		
		return res;
	}

	private void log(String message) {
		log.log(Level.INFO,message);
	}

}

    看起来好像挺复杂,其实和静态代理一样。其中的bind就相当于静态代理的构造方法。然后在调用时,会自动的调用invoke方法,在invoke方法里添加了log。
    其他代码和静态代理的一模一样。不重复。
    这样的话,你想在哪个方法里添加log,只要bind那个类就可以了。
    这就是AOP了,没什么深奥的。就实现方法有区别而已。Spring里的AOP就是用动态代理实现的。

    下面通过上面的代码解释几个AOP的名词。
    1.Cross-cutting concern(直译应该叫“横切关注点”)
      我理解的就是,需要以AOP来处理的东东。像log,安全检查这些。
    2.Aspect(方面)
     就是对于那些横切关注点所编写的类。如LogHandler。
    3.Advice(原意“忠告”,感觉莫名其妙。)
     可以理解为,在Aspect里面,实现的Cross-cutting concern的具体方法.如Loghandler里的invoke方法。
    4.Joinpoint
      Advice被执行的那个时机。(感觉比较抽象。保留意见。)
    5.Pointcut
      可以理解为Joinpoint执行的条件,符合Pointcut的Joinpoint才执行。
    6.Target
      简单理解为被代理的那个对象。如SayHelloImpl。
    7.Introduction
      给一个已编写或编译玩的类,在执行期间动态地加入一些方法或行为,而不修改或新增任何一行程序代码。(不解其意。。。。不是不懂他说的意思,而是不解,他说的是Introduction这个东东的功能还是什么。)
     8.Proxy(代理)
       。。。。
     9.Weave(编织,组合,编排)
      Advice被应用至对象之上的过程称之为Weave。
     
分享到:
评论

相关推荐

    学习Spring笔记_AOP_Annotation实现和XML实现

    这篇“学习Spring笔记_AOP_Annotation实现和XML实现”主要探讨了如何在Spring中利用注解和XML配置来实现AOP的概念。 AOP,全称Aspect-Oriented Programming,是一种编程范式,旨在将关注点分离,让开发者可以更专注...

    spring2.0学习笔记

    7. **国际化与本地化**:Spring 2.0提供了强大的I18N(Internationalization)支持,可以通过资源包轻松实现多语言环境的切换。 8. **Web服务**:Spring 2.0提供了SOAP和RESTful Web服务的支持,方便了与外部系统的...

    spring2.0学习笔记+spring定时任务

    标题 "spring2.0学习笔记+spring定时任务" 暗示了我们即将探讨的是关于Spring框架2.0版本的学习心得以及如何在Spring中配置和使用定时任务。在这个主题下,我们将深入理解Spring的核心概念,特别是它在企业级Java...

    Spring 2.0核心技术学习笔记总结

    **Spring 2.0核心技术详解** Spring框架是Java企业级应用开发中的一个重要组成部分,自2.0版本发布以来,它引入了许多重要的改进和新特性,极大地提升了开发效率和应用程序的可维护性。以下是对Spring 2.0核心知识...

    Spring2.0学习笔记

    【Spring2.0学习笔记】 在深入探讨Spring2.0的知识点之前,首先理解几个核心概念至关重要。Spring框架的核心设计理念是控制反转(Inversion of Control, IoC)和依赖注入(Dependency Injection, DI)。IoC意味着...

    Spring2.0精简笔记

    ### Spring2.0精简笔记知识点解析 #### 一、Spring基础知识 1. **Spring简介:** - **Spring框架**是一种轻量级Java开发框架,主要用来简化企业级应用的开发过程。它通过一系列的设计模式(如依赖注入DI、面向切...

    spring aop 学习笔记

    本学习笔记将深入探讨Spring AOP的核心概念、工作原理以及实际应用。 1. **核心概念** - **切面(Aspect)**:切面是关注点的模块化,包含业务逻辑之外的横切关注点,如日志、事务管理。 - **连接点(Join Point...

    spring2.0宝典一书笔记

    Spring 2.0 宝典涵盖了 Spring 框架的核心概念和关键功能,包括低侵入式设计、依赖注入、BeanFactory 与 ApplicationContext、Web 应用支持、MVC 框架、面向切面编程以及持久化支持。这些内容不仅有助于理解和掌握 ...

    Spring AOP IOC源码笔记.pdf

    本笔记将深入探讨这两个概念以及它们在Spring中的实现。 1. Spring框架简介: Spring作为一个轻量级的开源框架,旨在简化企业级应用的开发。它通过提供IOC容器,实现了对象的创建、管理和依赖注入,减轻了开发者对...

    SpringAop学习笔记以及实现Demo

    **Spring AOP 学习笔记及实现Demo** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP的主要目的...

    spring源码--AOP流程--笔记.docx

    Spring AOP 源码分析笔记 Spring AOP(Aspect-Oriented Programming)是一种编程范式,它允许开发者 modularize cross-cutting concerns,即将横切关注点模块化。AOP 使得开发者可以将一些公共的功能模块化,以便在...

    Struts 2 + Spring 2.0 + Hibernate 3.0整合笔记

    在本笔记中,我们将深入探讨这三个框架的整合过程及其核心概念。 **Struts 2** 是一个开源的MVC框架,它为Java Web应用程序提供了强大的控制层。Struts 2的核心是Action类,它是处理用户请求的中心。通过配置Action...

    Spring_AOP笔记Spring_AOP笔记

    Spring_AOP,全称为Spring的面向切面编程,是一种编程范式,旨在将关注点分离,使得代码结构更清晰,可维护性更强。在传统的面向对象编程(OOP)中,我们通常会将业务逻辑与系统服务(如日志、事务管理等)混杂在...

    Spring.NET学习笔记16——事务管理Demo源码

    在本篇“Spring.NET学习笔记16——事务管理Demo源码”中,我们将深入探讨Spring.NET的事务管理机制及其实际应用。 事务管理是软件开发中的关键部分,它确保数据库操作的一致性和完整性。Spring.NET通过其事务管理...

    SSH笔记-AOP

    总结,SSH笔记-AOP涵盖了Spring中AOP的核心概念,包括动态代理技术的使用、基于注解的AOP配置以及如何在XML中声明切面。学习和掌握这些内容,能够帮助开发者更好地利用Spring框架实现代码的解耦和模块化,提高系统的...

    Spring学习笔记(16)----使用Spring配置文件实现AOP

    在本篇Spring学习笔记中,我们将深入探讨如何利用Spring配置文件来实现面向切面编程(AOP)。面向切面编程是Spring框架的核心特性之一,它允许我们把关注点分离,将横切关注点(如日志、事务管理、权限控制等)与...

    J2EE框架_笔记_c

    48Spring_AOP笔记 49-Spring_JDBC模板笔记 50-Spring_Struts、Hibernate支持笔记 51-52使用Struts + Spring + Hibernate完成用户登陆笔记 53使用Struts + Spring + Hibernate完成分页笔记 54留言管理程序_Struts + ...

Global site tag (gtag.js) - Google Analytics