`
jzkangta
  • 浏览: 161621 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring学习笔记(5)---AOP之声明切面

阅读更多
AOP中一些概念

Aspect(切面):指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面横切性关注点的抽象.

joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器)

Pointcut(切入点):所谓切入点是指我们要对那些joinpoint进行拦截的定义.

Advice(通知):所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知

Target(目标对象):代理的目标对象

Weave(织入):指将aspects应用到target对象并导致proxy对象创建的过程称为织入.

Introduction(引入):在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.

光看这些定义是很难理解的,所以需要在例子中去消化。

要进行AOP编程,首先我们要在spring的配置文件中引入aop命名空间:
<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-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
</beans>


Spring提供了两种切面声明方式,实际工作中我们可以选用其中一种:
基于XML配置方式声明切面。
基于注解方式声明切面。

一,先来基于注解方式声明切面
1.Person类
package com.jzkangta.demo;

public class Person {

	private int userId;
	private String userName;
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
}

2.代理对象类
package com.jzkangta.demo;

public class PersonService {

	public void save(int userId,String userName){
		System.out.println("save user ----->userId="+userId+",userName="+userName);
	}
	public void delete(int userId){
		System.out.println("delete user ----->userId="+userId);
	}
	public void update(int userId,String userName){
		System.out.println("update user ----->userId="+userId+",userName="+userName);
	}
	public Person find(int userId){
		System.out.println("find user ----->userId="+userId);
		return null;
	}
}


3.切面类
package com.jzkangta.demo;

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

/**
 * 这是一个切面类  
 * 切面指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,
 * 类是对物体特征的抽象,而切面横切性关注点的抽象
 * @author Administrator
 *
 */
@Aspect   //切面类需要用该注解标注
public class AspectClass {

	//表达式详解需要查相关资料,这里不多说
	@Pointcut("execution(* com.jzkangta.demo..*.*(..))")  
	/*
	 * 所谓切入点是指我们要对那些joinpoint进行拦截的定义
	 * 声明一个切入点(Pointcut),切入点是一个空的方法来声明的,后面对它的引用就用该方法名	
	 */
	private void myPointcut() {}
	
	/*
	 * 所谓通知是指拦截到joinpoint之后所要做的事情就是通知.
	 * 通知分为前置通知,后置通知,异常通知,最终通知,环绕通知
	 * 定义前置通知,可以传参数,具体请查相关资料
	 * myPointcut()为引用上面定义的切入点
	 */
	@Before("myPointcut()")
	public void doAccessCheck() {
		System.out.println("前置通知执行.......");
	}
	
	//后置通知,异常通知,最终通知,环绕通知,这里就不做演示
}

4.调用main方法
public static void main(String[] args) {
		
		ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"beans.xml"});
		PersonService personService = (PersonService) ctx.getBean("personService");
		personService.save(1, "jzkangta");
	}


5.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-2.5.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
	
	<!-- 启动对@AspectJ注解的支持 -->
	<aop:aspectj-autoproxy/>
	<!-- 注意personService不是一个接口 -->
	<bean id="personService" class="com.jzkangta.demo.PersonService"></bean>
	<!-- 将切面类也交给Spring -->
	<bean id="aspectClass" class="com.jzkangta.demo.AspectClass"></bean>
	
</beans>


运行结果为:
前置通知执行.......
save user ----->userId=1,userName=jzkangta

二,先来基于XML声明切面
1.Person类,2.代理对象类都不用改
2.去掉了注解的切面类
package com.jzkangta.demo2;

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

/**
 * 这是一个切面类  
 * 切面指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,
 * 类是对物体特征的抽象,而切面横切性关注点的抽象
 * @author Administrator
 *
 */
public class AspectClass {

	/*
	 * 所谓切入点是指我们要对那些joinpoint进行拦截的定义
	 * 声明一个切入点(Pointcut),切入点是一个空的方法来声明的,后面对它的引用就用该方法名	
	 */
	private void myPointcut() {}
	
	
	public void doAccessCheck() {
		System.out.println("前置通知执行.......");
	}
	
	//后置通知,异常通知,最终通知,环绕通知,这里就不做演示
}

3.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-2.5.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
	
	
	<!-- 注意personService不是一个接口 -->
	<bean id="personService" class="com.jzkangta.demo2.PersonService"></bean>
	<!-- 将切面类也交给Spring -->
	<bean id="aspectClass" class="com.jzkangta.demo2.AspectClass"></bean>
	
	<aop:config>
		<aop:aspect id="myaop" ref="aspectClass">
			<aop:pointcut id="mycut"
			expression="execution(*com.jzkangta.demo2..*.*(..))" />
			<!-- method="doAccessCheck"为切面类里的前置通知名 -->
			<aop:before pointcut-ref="mycut" method="doAccessCheck" />
			<!-- 
			<aop:after-returning pointcut-ref="mycut"
				method="后置通知名 " />
			<aop:after-throwing pointcut-ref="mycut"
				method="例外通知名" />
			<aop:after pointcut-ref="mycut" method="最终通知名" />
			<aop:around pointcut-ref="mycut" method="环绕的通知名" />
			 -->
		</aop:aspect>

	</aop:config>
	
</beans>

4.在用main方法执行后,结果如下:
前置通知执行.......
save user ----->userId=1,userName=jzkangta
分享到:
评论

相关推荐

    Spring学习笔记(14)----使用CGLIB实现AOP功能

    CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它被广泛用于动态代理和运行时织入AOP切面。在Spring中,如果目标类没有实现接口,那么Spring默认会使用CGLIB来创建代理对象。下面我们将深入理解...

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

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

    spring aop 学习笔记

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

    Spring学习笔记(15)----使用Spring的注解方式实现AOP

    在本篇Spring学习笔记中,我们将深入探讨如何利用Spring框架的注解方式来实现面向切面编程(AOP)。AOP是一种编程范式,它允许我们定义横切关注点,如日志、事务管理等,然后将这些关注点模块化并插入到应用程序的多...

    spring ioc aop mvc boot-学习笔记.docx

    Spring框架是Java开发中不可或缺的一部分,它为开发者提供了强大的依赖注入(IOC)和面向切面编程(AOP)功能,以及用于构建Web应用程序的MVC框架。Spring Boot则是基于Spring框架构建的应用程序启动器,旨在简化...

    Spring学习笔记+学习源码.zip

    这份"Spring学习笔记+学习源码.zip"资源包含了深入学习Spring及其相关技术的知识点,以及实践代码,对提升Spring技能将大有裨益。 首先,我们来详细讨论Spring框架的主要组件和功能: 1. **依赖注入(Dependency ...

    SpringAop学习笔记以及实现Demo

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

    Spring学习笔记-cqupt

    在本篇 Spring 学习笔记中,我们将探讨 Spring 的入门、优点、组成以及重要的IOC理论。 1. **Spring 简介** Spring 是一个开源的、免费的 Java 框架,它的目标是减少企业级开发的复杂性。它集成了许多现有的技术,...

    Spring2.5.6学习笔记-最新

    以上是 Spring 2.5.6 学习笔记中的关键知识点,通过这些基础知识的学习,开发者可以开始构建基于 Spring 框架的应用程序。接下来,可以进一步深入学习 Spring 的高级特性,如事务管理、安全性、Web 开发等方面的知识...

    Spring.NET学习笔记 - 刘冬.NET - 博客园

    Spring.NET是中国.NET开发者社区中广泛讨论的一个开源框架,它为.NET平台带来了与Java Spring相似的功能,包括依赖注入(DI)和面向切面编程(AOP)。这个压缩包包含了一系列刘冬.NET在博客园上发布的Spring.NET学习...

    Spring学习笔记(精华全记录)

    ### Spring学习笔记(精华全记录) #### Spring框架概述 Spring框架源自Rod Johnson的个人项目,最初于2002年末发布。Spring并非一开始就作为一个完整的框架出现,而是从一个项目逐步发展而来。随着项目的成熟,...

    spring-framework-2.5-rc2-with-dependencies\spring-framework-2.5-rc2\spring-framework-2.5-rc2docs

    其次,Spring 2.5对AOP(面向切面编程)的支持也得到了加强。AOP允许开发者在不修改原有代码的情况下,插入跨切面的关注点,如日志、事务管理等。在这个版本中,Spring提供了基于注解的AOP支持,使得切面定义更加...

    spring学习笔记

    ### Spring学习笔记知识点详解 #### 一、Spring框架概述 **Spring** 是一个开源的、分层的企业级应用开发框架,旨在简化Java EE应用程序的开发。它的主要目标是提高开发效率,减少耦合度,并提供一种更为简洁的...

    Spring学习笔记.zip

    Spring框架以其轻量级、依赖注入(DI)和面向切面编程(AOP)等特性而闻名,是Java EE开发中的主流选择。 **依赖注入(Dependency Injection,DI)** 依赖注入是Spring框架的核心特性之一,它允许开发者在运行时将...

    Spring学习笔记之九--声明式事务

    声明式事务主要依赖于Spring的AOP(面向切面编程)功能。在Spring中,我们可以使用@Transactional注解来标记一个类或方法为事务边界。当标注在类上时,该类的所有公共方法都将被包含在事务内;标注在方法上,则仅该...

    JSF2整合Spring3------JSF学习笔记4

    JSF是一个用于构建用户界面的MVC(Model-View-Controller)框架,而Spring则是一个全面的企业级应用框架,尤其在依赖注入(DI)和面向切面编程(AOP)方面表现出色。本文将深入探讨如何将JSF2与Spring3进行整合,...

    Spring学习笔记&源码

    本资料“Spring学习笔记&源码”是基于网易云课堂黑马程序员的Spring四天精通课程,旨在帮助学习者深入理解和实践Spring框架。 笔记部分可能会涵盖以下内容: 1. **Spring概述**:介绍Spring框架的历史、特点和主要...

    SSH笔记-AOP

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

    Spring框架学习笔记

    Spring框架是Java开发中广泛应用的轻量级框架,它以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)为核心特性,极大地简化了企业级应用的开发工作。这份"Spring框架...

    spring-AOP面向切面编程所需jar包.zip

    该压缩包包含--学习笔记(05):轻松搞定Spring全家桶(初识篇)-面向切片编程AOP:--系列博客中新需要的三个jar包。包括spring-aspects-5.2.7.RELEASE.jar和spring-aop-5.2.7.RELEASE.jar和...

Global site tag (gtag.js) - Google Analytics