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
分享到:
相关推荐
该压缩包包含--学习笔记(05):轻松搞定Spring全家桶(初识篇)-面向切片编程AOP:--系列博客中新需要的三个jar包。包括spring-aspects-5.2.7.RELEASE.jar和spring-aop-5.2.7.RELEASE.jar和...
@Aspect 声明是一个切面 拦截规则@After @Before @Around PointCut JoinPoint Spring常用配置 Bean的Scope Singleton Prototype Request Session GlobalSession SpringEL和资源...
在“Java Spring学习笔记”中,你将找到对Spring框架的全面介绍,包括IoC(控制反转)和DI(依赖注入)原理、AOP(面向切面编程)、Spring MVC、Spring Boot等核心内容。每个主题都结合了理论知识和实际示例,帮助你...
第七课:AOP(面向切面编程) 19 一、 AOP概念 19 二、 利用动态代理实现面向切面编程 20 第八课:Spring AOP配置选项 21 一、 AOP配置annotation方式 21 (一) 搭建annotation开发环境 21 (二) aspectJ类库 22 (三) ...
首先我们应该想想为什么要使用aop面向切面编程?面向切面的底层实现是什么?小编在这里举个例子吧 小编首先给出Spring全家桶,方便大家下载使用—->Spring全家桶 1.自定义代理对象代理类以及实现类 1.1 定义接口...
Spring最新资料总结,包含SpringMVC,IOC,AOP面向切面编程,以及与Struts2,Hibernate的集成.
Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control: 反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring MVC 和持久层 Spring ...
Spring 学习笔记《切面编程 AOP 之 暗黑肉夹馍诞生》源码
第七课:AOP(面向切面编程) 19 一、 AOP概念 19 二、 利用动态代理实现面向切面编程 20 第八课:Spring AOP配置选项 21 一、 AOP配置annotation方式 21 (一) 搭建annotation开发环境 21 (二) aspectJ类库 22 (三) ...
Spring是一个开源的控制反转(Inversion of Control , Ioc)和面向切面(AOP)的容器框架.它的主要目的是简化企业开发.
本质上讲,Spring是IOC(Inversion of Control)和面向切面编程(AOP)的组合体。它是一个非侵入式的框架,增强了POJO的功能。从服务上讲(With a service abstraction),它将程序代码从J2EE环境解耦到普通的java对象...
AOP面向切面编程:(可以在不修改源代码的前提下,增强权限,日志,事务功能)切面编程将业务逻辑从应用服务中分离 容器(spring):管理dao,service,action,...包含并管理应用对象的生命周期和配置 框架:使用组件配置...
核心概念:深入探讨了 Spring 的核心概念,如控制反转(IoC)和面向切面编程(AOP),以及它们如何改善应用程序的设计和结构。 Spring 容器:介绍了 Spring 容器的不同类型,包括 BeanFactory 和 ...
spring学习笔记 包括: spring + hiberante 访问数据库 JDBC 操作的JAVA 的对象化: (sql对表操作) AOP 面向方面编程,实现"切面
全称:面向切面编程(AspectOrientedProgramming),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种...
内容: Spring资源管理 Spring表达式语言 ...AOP切面编程-代理功能的加强 Spring与JMS消息组件 Spring与WebService Spring与Redis数据库 JDBC操作模板 Spring事务管理 SpringDataJPA SpringMVC SpringSecurity
Spring的Ioc Spring的AOP , AspectJ Spring的事务管理 , 三大框架的整合 目录 1.1 Spring 框架学习路线:..........................................................................................................
Spring AOP 面向切面编程 spring-ioc Spring IOC 控制反转(类[对象]交由Spring容器管理) restructure 学习代码重构 mybatis-enum MyBtais整合Spring Boot整合,TypeHandler对枚举类(enum)处理 AOP 在这里我们以 ...
spring 2.5.6 + struts 2.2.1 + hibernate 3.5.5 内有 AOP 的切面、全部的注解的 M V C 结构,之外还在上网上找了一个同学的学习笔记一起打包,感觉好不错!