SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP

AOP(Aspect Oriented Programming)。是面向切面编程的技术。AOP基于IoC基础。是对OOP的故意补充。

AOP之所以能得到广泛应用,主要是由于它将应用系统拆分分了2个部分:核心业务逻辑(Core business concerns)及横向的通用逻辑,也就是所谓的切面Crosscutting enterprise concerns。比如,全部大中型应用都要涉及到的持久化管理(Persistent)、事务管理(Transaction Management)、权限管理(Privilege
Management)、日志管理(Logging)和调试管理(Debugging)等。

使用AOP技术,能够让开发者仅仅专注核心业务,而通用逻辑则使用AOP技术进行横向切入。由专人去处理这些通用逻辑,会使得任务简单明了,提高开发和调试的效率。

使用AOP,我们要注意关注横切性的功能。即抽象出独立服务。进行模块化使我们曾经习惯性的纵向思维的方法再改变,注意横向思考问题的方式,我们结合如今的系统能够把推断文本框一些了的验证、日志的记录、事务的开启、数据库的开启和关闭等等。都能够抽象出使用切面的形式把这些方法切入进去,我们仅仅须要关心我们的业务逻辑。这样代码简单,间接,开发效率大大提高,更重要的是复用效率大大提高了。

基本概念

要想了解AOP。首先得了解几个重要的基本概念:

  • 切面(Aspect):一个关注点的模块化。这个关注点实现可能另外横切多个对象。比方说事务管理就是J2EE应用中一个非常好的横切关注点样例。切面用Spring的Advisor或拦截器实现。
  • 连接点(Joinpoint):程序运行过程中明白的点,如方法的调用或特定的异常被抛出。
  • 通知(Advice):在特定的连接点,AOP框架运行的动作。

    各种类型的通知包含“around”、“before”和“throws”通知。通知类型将在以下讨论。

    很多AOP框架包含Spring都是以拦截器做通知模型。维护一个“环绕”连接点的拦截器链。

  • 切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。

    AOP框架必须同意开发人员指定切入点。比如,使用正則表達式。
  • 目标对象(Target Object):包括连接点的对象,也被称作被通知或被代理对象。
  • AOP代理(AOP Proxy):AOP框架创建的对象,包括通知。在Spring中,AOP代理能够是JDK动态代理或CGLIB代理。
  • 编织(Weaving):组装方面来创建一个被通知对象。

    这能够在编译时完毕(比如使用AspectJ编译器),也能够在执行时完毕。Spring和其它纯Java AOP框架一样,在执行时完毕织入。

各种通知(Advice)类型

为了符合各种流程处理。通知类型提供了5种,能够对目标方法进行全方位处理:

  • Before advice:在某连接点(JoinPoint)之前运行的通知。但这个通知不能阻止连接点前的运行。

    ApplicationContext中在<aop:aspect>里面使用<aop:before>元素进行声明。

  • After advice:当某连接点退出的时候运行的通知(不论是正常返回还是异常退出)。

    ApplicationContext中在<aop:aspect>里面使用<aop:after>元素进行声明。

  • After returnadvice:在某连接点正常完毕后运行的通知,不包含抛出异常的情况。

    ApplicationContext中在<aop:aspect>里面使用<aop:after-returning>元素进行声明。

  • Around advice:包围一个连接点的通知。类似Web中Servlet规范中的Filter的doFilter方法。能够在方法的调用前后完毕自己定义的行为,也能够选择不运行。

    ApplicationContext中在<aop:aspect>里面使用<aop:around>元素进行声明。
  • Afterthrowing advice:在方法抛出异常退出时运行的通知。

    ApplicationContext中在<aop:aspect>里面使用<aop:after-throwing>元素进行声明。

本文採用的JDK代理方式

AspectJ注解方式配置AOP。实例解说

SecurityHandler,这个通知类能够换成安全性检測、日志管理、事务开启关闭等等。

<span style="font-family:FangSong_GB2312;font-size:18px;">package com.bjpowernode.spring;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class SecurityHandler {

	/**
	 * 定义Pointcut。Pointcut的名称为addAddMethod(),此方法没有返回值和參数
	 * 该方法就是一个标识,不进行调用
	 */
	@Pointcut("execution(* add*(..))")
	private void addAddMethod(){};

	/**
	 * 定义Advice,表示我们的Advice应用到哪些Pointcut订阅的Joinpoint上
	 */
	//@Before("addAddMethod()")
	@After("addAddMethod()")
	private void checkSecurity() {
		System.out.println("-------checkSecurity-------");
	}
}
</span>

UserManager接口

<span style="font-family:FangSong_GB2312;font-size:18px;">package com.bjpowernode.spring;

public interface UserManager {

	public void addUser(String username, String password);

	public void delUser(int userId);

	public String findUserById(int userId);

	public void modifyUser(int userId, String username, String password);
}
</span>

UserManagerImpl实现

<span style="font-family:FangSong_GB2312;font-size:18px;">package com.bjpowernode.spring;

public class UserManagerImpl implements UserManager {

	public void addUser(String username, String password) {
		//checkSecurity();
		System.out.println("---------UserManagerImpl.add()--------");
	}

	public void delUser(int userId) {
		//checkSecurity();
		System.out.println("---------UserManagerImpl.delUser()--------");
	}

	public String findUserById(int userId) {
		//checkSecurity();
		System.out.println("---------UserManagerImpl.findUserById()--------");
		return "张三";
	}

	public void modifyUser(int userId, String username, String password) {
		//checkSecurity();
		System.out.println("---------UserManagerImpl.modifyUser()--------");
	}

//	private void checkSecurity() {
//		System.out.println("-------checkSecurity-------");
//	}
}
</span>

application-config.xml中。仅仅须要配置业务逻辑bean和Aspect bean。并启用Aspect注解就可以:

<span style="font-family:FangSong_GB2312;font-size:18px;"><?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"
	     xmlns:tx="http://www.springframework.org/schema/tx"
	     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

    <!-- 启用AspectJ对Annotation的支持 -->
	<aop:aspectj-autoproxy/>           

	<bean id="userManager" class="com.bjpowernode.spring.UserManagerImpl"/>

	<bean id="securityHandler" class="com.bjpowernode.spring.SecurityHandler"/>
</beans>
</span>

Clientclient

<span style="font-family:FangSong_GB2312;font-size:18px;">package com.bjpowernode.spring;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Client {

	public static void main(String[] args) {
		BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserManager userManager = (UserManager)factory.getBean("userManager");
		userManager.addUser("张三", "123");
	}

}
</span>

效果图

当然我们通过注解的方式能够实现灵活的配置

<span style="font-family:FangSong_GB2312;font-size:18px;">/**
	 * 定义Advice。表示我们的Advice应用到哪些Pointcut订阅的Joinpoint上
	 */
	@Before("addAddMethod()")
	//@After("addAddMethod()")
	private void checkSecurity() {
		System.out.println("-------checkSecurity-------");
	}		</span>

改动后的效果:

总结

Annotation

长处

保存在 class 文件里,减少维护成本。

无需工具支持。无需解析。

编译期就可以验证正确性,查错变得easy。

 

   缺点

若要对配置项进行改动。不得不改动 Java 文件,又一次编译打包应用。

总的来说,AOP这种优点是我们抽象出公共的方法之后,我们的代码,方法复用性大大提高,实现了可灵活的配置,提高了系统的可靠性。

接下来

SSH深度历险(十一) AOP原理及相关概念学习+xml配置实例(对照注解方式的优缺点)

时间: 2024-10-12 23:31:15

SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP的相关文章

SSH深度历险(十一) AOP原理及相关概念学习+xml配置实例(对比注解方式的优缺点)

接上一篇 SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP,本篇我们主要是来学习使用配置XML实现AOP 本文采用强制的CGLB代理方式 SecurityHandler这个通知类可以换成安全性检测.日志管理等等. <span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18

SSH深度历险(八) 剖析SSH核心原理+Spring依赖注入的三种方式

在java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是"控制反转",通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. Spring依赖注入(

SSH深度历险(七) 剖析SSH核心原理(一)

接触SSH有一段时间了,但是对于其原理,之前说不出来莫模模糊糊(不能使用自己的语言描述出来的就是没有掌握),在视频和GXPT学习,主要是实现了代码,一些原理性的内容还是欠缺的,这几天我自己也一直在反问着自己,学习本不应该是这个样子了,道理倘若不懂:就是常说的老牛只知道低头拉磨,不抬头看路,映射到学习中,如果我们只是一味的写代码,而不懂原理的话,这样的生命力是不持久的,是短暂的,后劲会很不足,反问的学习促使我对这些逐步的深入了思考,参考了很多的网友博客与PDF资料,自己感悟而成,现和大家分享. 首

SSH深度历险(四) Maven初步学?

这几天接触这个词,非常多遍了,仅仅是浅显的体会到它在GXPT中的优点,功能之强大,又通过网络查询了资料进一步的认识学习了,和大家分享. Maven是基于项目对象模型(POM),能够通过一小段描写叙述信息来管理项目的构建,报告和文档的软件项目管理工具. 在gxpt中的体现 1. 父子关系 一个多模块项目通过一个父POM 引用一个或多个子模块来定义. a. 在父文件夹中分别创建子项目 b. 父项目,通过下面配置,将子项目关联: 例如以下: <span style="font-size:18px

Spring之AOP基本概念及通过注解方式配置AOP

为什么使用AOP 传统方法 AOP前前奏 首先考虑一个问题,假设我们要设计一个计算器,有如下两个需求: - 在程序运行期间追踪正在放生的活动 - 希望计算器只能处理正数的运算 通常我们会用如下代码进行实现: 定义一个接口: public interface ArithmeticCalculator { int add(int i, int j); int sub(int i, int j); int mul(int i, int j); int div(int i, int j); } 实现类(

深入探索spring技术内幕(七): 配置Spring AOP面向切面编程

一. AOP一些概念 Aspect( 切面 ): 指横切性关注点的抽象即为切面, 它与类相似, 只是两者的关注点不一样, 类是对物体特征的抽象, 而切面横切性关注点的抽象. joinpoint( 连接点 ): 指那些被拦截到的点. 在spring中, 这些点指的是方法, 因为spring只支持方法类型的连接点, 实际上joinpoint还可以是field或类构造器) Pointcut( 切入点 ): 指我们要对那些joinpoint进行拦截的定义. Advice( 通知 ): 指拦截到joinp

基于@AspectJ配置Spring AOP之一--转

原文地址:http://tech.it168.com/j/2007-08-30/200708302209432.shtml 概述 在低版本Spring中定义一个切面是比较麻烦的,需要实现特定的接口,并进行一些较为复杂的配置,低版本Spring AOP的配置是被批评最多的地方.Spring听取这方面的批评声音,并下决心彻底改变这一现状.在Spring2.0中,Spring AOP已经焕然一新,你可以使用@AspectJ注解非常容易的定义一个切面,不需要实现任何的接口. Spring2.0采用@As

【Spring】—AOP之AspectJ注解方式实现声明式事务管理

前言 这回来说下注解方式的声明式事务管理. 正文 Demo 1.引入相关的jar包这里写图片描述 2.引入AOP约束<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/con

xml配置spring aop

1.spring aop配置如下: 1.aspect切面是一个具体类,里面包含各种执行的通知方法.切面类也要注册到ioc容器中. 2.切入点pointcut,可以在每个通知里单独配置,即每个通知可以指定自己的切入点,各个通知的切入点不必相同. 3.配置aop的层次关系,切面是个具体类,切面里包含通知,切入点.每个通知可以单独指定自己的切入点. 切面是个具体类