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
分享到:
相关推荐
CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它被广泛用于动态代理和运行时织入AOP切面。在Spring中,如果目标类没有实现接口,那么Spring默认会使用CGLIB来创建代理对象。下面我们将深入理解...
在本篇Spring学习笔记中,我们将深入探讨如何利用Spring配置文件来实现面向切面编程(AOP)。面向切面编程是Spring框架的核心特性之一,它允许我们把关注点分离,将横切关注点(如日志、事务管理、权限控制等)与...
本学习笔记将深入探讨Spring AOP的核心概念、工作原理以及实际应用。 1. **核心概念** - **切面(Aspect)**:切面是关注点的模块化,包含业务逻辑之外的横切关注点,如日志、事务管理。 - **连接点(Join Point...
在本篇Spring学习笔记中,我们将深入探讨如何利用Spring框架的注解方式来实现面向切面编程(AOP)。AOP是一种编程范式,它允许我们定义横切关注点,如日志、事务管理等,然后将这些关注点模块化并插入到应用程序的多...
Spring框架是Java开发中不可或缺的一部分,它为开发者提供了强大的依赖注入(IOC)和面向切面编程(AOP)功能,以及用于构建Web应用程序的MVC框架。Spring Boot则是基于Spring框架构建的应用程序启动器,旨在简化...
这份"Spring学习笔记+学习源码.zip"资源包含了深入学习Spring及其相关技术的知识点,以及实践代码,对提升Spring技能将大有裨益。 首先,我们来详细讨论Spring框架的主要组件和功能: 1. **依赖注入(Dependency ...
**Spring AOP 学习笔记及实现Demo** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP的主要目的...
在本篇 Spring 学习笔记中,我们将探讨 Spring 的入门、优点、组成以及重要的IOC理论。 1. **Spring 简介** Spring 是一个开源的、免费的 Java 框架,它的目标是减少企业级开发的复杂性。它集成了许多现有的技术,...
以上是 Spring 2.5.6 学习笔记中的关键知识点,通过这些基础知识的学习,开发者可以开始构建基于 Spring 框架的应用程序。接下来,可以进一步深入学习 Spring 的高级特性,如事务管理、安全性、Web 开发等方面的知识...
Spring.NET是中国.NET开发者社区中广泛讨论的一个开源框架,它为.NET平台带来了与Java Spring相似的功能,包括依赖注入(DI)和面向切面编程(AOP)。这个压缩包包含了一系列刘冬.NET在博客园上发布的Spring.NET学习...
### Spring学习笔记(精华全记录) #### Spring框架概述 Spring框架源自Rod Johnson的个人项目,最初于2002年末发布。Spring并非一开始就作为一个完整的框架出现,而是从一个项目逐步发展而来。随着项目的成熟,...
其次,Spring 2.5对AOP(面向切面编程)的支持也得到了加强。AOP允许开发者在不修改原有代码的情况下,插入跨切面的关注点,如日志、事务管理等。在这个版本中,Spring提供了基于注解的AOP支持,使得切面定义更加...
### Spring学习笔记知识点详解 #### 一、Spring框架概述 **Spring** 是一个开源的、分层的企业级应用开发框架,旨在简化Java EE应用程序的开发。它的主要目标是提高开发效率,减少耦合度,并提供一种更为简洁的...
Spring框架以其轻量级、依赖注入(DI)和面向切面编程(AOP)等特性而闻名,是Java EE开发中的主流选择。 **依赖注入(Dependency Injection,DI)** 依赖注入是Spring框架的核心特性之一,它允许开发者在运行时将...
声明式事务主要依赖于Spring的AOP(面向切面编程)功能。在Spring中,我们可以使用@Transactional注解来标记一个类或方法为事务边界。当标注在类上时,该类的所有公共方法都将被包含在事务内;标注在方法上,则仅该...
JSF是一个用于构建用户界面的MVC(Model-View-Controller)框架,而Spring则是一个全面的企业级应用框架,尤其在依赖注入(DI)和面向切面编程(AOP)方面表现出色。本文将深入探讨如何将JSF2与Spring3进行整合,...
本资料“Spring学习笔记&源码”是基于网易云课堂黑马程序员的Spring四天精通课程,旨在帮助学习者深入理解和实践Spring框架。 笔记部分可能会涵盖以下内容: 1. **Spring概述**:介绍Spring框架的历史、特点和主要...
总结,SSH笔记-AOP涵盖了Spring中AOP的核心概念,包括动态代理技术的使用、基于注解的AOP配置以及如何在XML中声明切面。学习和掌握这些内容,能够帮助开发者更好地利用Spring框架实现代码的解耦和模块化,提高系统的...
Spring框架是Java开发中广泛应用的轻量级框架,它以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)为核心特性,极大地简化了企业级应用的开发工作。这份"Spring框架...
该压缩包包含--学习笔记(05):轻松搞定Spring全家桶(初识篇)-面向切片编程AOP:--系列博客中新需要的三个jar包。包括spring-aspects-5.2.7.RELEASE.jar和spring-aop-5.2.7.RELEASE.jar和...