Spring知识点小结(三)
一、aop的简介
aop:面向切面编程
aop是一种思想,面向切面编程思想,Spring内部提供了组件对aop进行实现
aop是在运行期间使用动态代理技术实现的思想
aop是oop延续
面向过程:C
面向对象:Java
面向切面:AOP
面向服务架构:SOA
aop的底层实现:动态代理
基于JDK:目标对象必须有接口(proxy是接口的实现)
基于cglib:目标对象不需要有接口(proxy是目标子类)
aop的基本概念、术语
目标对象(target)
代理对象(proxy)
连接点(joinpoint): 可以被增强的方法
切(入)点(pointcut): 真正可以被增强的方法
增强/通知(advice):功能增强的方法
切面(aspect):切点+增强
织入(weaver):将切点和增强结合的过程

二、基于xml方式的aop配置
开发步骤:
1、导入aop的jar
spring-aop-4.2.4.RELEASE spring的aop核心包
spring-aspects-4.2.4.RELEASE spring的切面包
com.springsource.org.aopalliance-1.0.0 aop联盟包
com.springsource.org.aspectj.weaver-1.6.8.RELEASE aspectj的织入包
2、定义目标(目标内部有切点)、定义切面(增强在切面内部)
public class Target implements TargetInterface
public class MyAspect
3、配置目标和切面到spring容器中
<!-- 配置目标 -->
<bean id="target" class="com.ghdu.aop.Target"></bean>
<!-- 配置切面 -->
<bean id="myAspect" class="com.ghdu.aop.MyAspect"></bean>
4、配置aop的织入
导入aop的命名空间
xml配置代码:
<!-- 配置目标 -->
<bean id="target" class="com.ghdu.aop.Target"></bean>
<!-- 配置切面 -->
<bean id="myAspect" class="com.ghdu.aop.MyAspect"></bean>
<!-- 配置aop的织入 -->
<aop:config>
<!-- 指定切面对象是谁 -->
<aop:aspect ref="myAspect">
<!-- 切面=切点+增强 -->
<!-- 细节2:切点表达式的写法
expression写法
示例:execution(public void com.ghdu.aop.Target.show())
语法:execution([访问修饰符] 返回值 包.类.方法(参数类型列表))
注意:其中
访问修饰符可以省略
返回值、包、类、方法 可以使用*作为通配符代表任意
参数类型列表 可以使用..作为通配符代表任意
示例:
* com.ghdu.service.impl.CustomerServiceImpl.*(..) CustomerServiceImpl的任意方法
* com.ghdu.service.impl.*.*(..) 对impl包下的任意类的任意方法
* com.ghdu.service.*.*.*(..) 对service包下的任意子包下的任意类的任意方法
* com.ghdu.service..*.*.*(..) 对service包下的任意后代包下的任意类的任意方法
-->
<!-- <aop:pointcut expression="execution(public void com.ghdu.aop.Target.*(..))" id="myPointcut"/>
<aop:pointcut expression="execution(public void com.ghdu.aop.Target.show(..))" id="myPointcut2"/> -->
<!-- 细节1:aop的增强/通知有哪些
aop:before 前置增强
aop:after-returning 后置增强
aop:around 环绕增强
aop:after-throwing 异常抛出增强
aop:after 最终增强
-->
<!-- <aop:before method="before" pointcut-ref="myPointcut"/>
<aop:after-returning method="afterReturning" pointcut-ref="myPointcut"/>
<aop:around method="around" pointcut-ref="myPointcut"/>
<aop:after-throwing method="afterThrowing" pointcut-ref="myPointcut"/>
<aop:after method="after" pointcut-ref="myPointcut2"/> -->
<aop:around method="around" pointcut="execution(* com.ghdu.aop.*.*(..))"/>
<aop:after method="after" pointcut="execution(* com.ghdu.aop.*.*(..))"/>
</aop:aspect>
</aop:config>
三、基于注解方式的aop配置
开发步骤:
1、导入aop的jar
spring-aop-4.2.4.RELEASE spring的aop核心包
spring-aspects-4.2.4.RELEASE spring的切面包
com.springsource.org.aopalliance-1.0.0 aop联盟包
com.springsource.org.aspectj.weaver-1.6.8.RELEASE aspectj的织入包
2、定义目标(目标内部有切点)、定义切面(增强在切面内部)
public class Target implements TargetInterface
public class MyAspect
3、配置目标和切面到spring容器中
@Component("target")
public class Target implements TargetInterface
@Component("myAspect")
public class MyAspect
4、配置aop的织入
@Component("myAspect")
//<aop:aspect ref="myAspect">
@Aspect
public class MyAspect {
//<aop:before method="before" pointcut="execution(* com.ghdu.aop.*.*(..))"/>
//@Before("execution(* com.ghdu.anno.*.*(..))")
public void before(){
System.out.println("前置增强....");
}
注意:
在配置文件中配置aop的自动代理
<!-- 开启aop的自动代理 -->
<aop:aspectj-autoproxy/>
全注解: 在原始注解的基础上,创建配置类
//声明
@Configuration
//扫描包
@ComponentScan("com.gudf.allanno")
//设置aop自动代理
@EnableAspectJAutoProxy
public class SpringConfiguration {
}
有关aop的知识扩充
aop的底层实现

aop、spring、aspectj三者的关系

动态代理

全盘委托机制

aop应用场景
方法性能测试
日志控制
事务控制......
Spring知识点小结(三)的更多相关文章
- Spring知识点小结(二)
一.配置非自定义的Bean(数据源DataSource模型) DBCP数据源: 导入dbcp的jar包:dbcp+pool+connector 代码实现: ...
- Spring知识点总结(三)之注解方式实现IOC和DI
1. 注解概念 所谓注解就是给程序看的提示信息,很多时候都用来作为轻量级配置的方式. 关于注解的知识点,参看java基础课程中java基础加强部分的内容. 2 ...
- Spring知识点小结(一)
一.Spring的简介 1.spring是一个full-stack轻量级开源框架 2.spring的两大核心 IoC: inverse of control 控制反转:反转是对象 ...
- Hibernate知识点小结(三)-->一对多与多对多配置
一.多表关系与多表设计 1.多表关系 一对一: 表的设计原则(分表原则): 优化表的性能 基于语意化分表 ...
- Spring知识点小结汇总
Spring部分 1.谈谈你对spring IOC和DI的理解,它们有什么区别? IoC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控 ...
- Spring知识点小结(四)
一.JdbcTemplate(jdbc模版--抽取的工具) web阶段DBUtils: QueryRunner runner = new QueryRunner(dataSource); ...
- Spring知识点总结(三)之Spring DI
1. IOC(DI) - 控制反转(依赖注入) 所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利及对象的生命周期的管理过程交由Spring框架来处理,从此在开发过程中不再需要关注对象的创建和 ...
- Struts2知识点小结(三)--值栈与ognl表达式
1.问题一 : 什么是值栈 ValueStack 回顾web阶段 数据交互问题? 客户端提交数据 到 服务器端 request接受数据+BeanUtils实体封装 ...
- 【SpringBoot MQ 系列】RabbitMq 核心知识点小结
[MQ 系列]RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 ...
随机推荐
- Linux基础之命令练习Day4-fdisk,mkfs,mlabel,mount,umount,mkswap,swapon,dd,top,free,ps,kill,rpm,yum,make
一. 硬盘分区.格式化及文件系统的管理 1. 在Linux系统中,一切皆文件.每个设备都被当作一个文件来对待. 常见的存储设备在Linux系统中的文件名如下表所示: 2. 对硬盘进行分区有以下优点: ...
- 关于pom版本提交不成功的问题
今天碰到个问题:我在原来的一个pom项目的client服务里面修改了一个java类,但是没有升级版本.然后再预发环境更新后,从显示的日志来看,仍然是我修改前的版本. 这就奇怪了,看了svn确实已经提交 ...
- 关于map容器的元素被无参初始化
使用C++中的map容器定义一个mp,当你执行if语句判断mp[3]是否为1时,那么如果mp[3]以前不存在,此时mp[3]就会被无参初始化,second赋值为0. 以下的程序可以证明这一点.执行了第 ...
- java中double类型显示两个小数,比如12.00
Double类型的数据如何保留两位小数? 各位大虾,现有Double类型的数据,如何转换为保留两位小数的数,返回值的类型仍然是Double类型的,而不是字符串类型. 比如 0,返回“0.00” ...
- MySQL存储过程和临时表
MySQL创建存储过程 MySQL中,创建存储过程的基本形式如下: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...
- docker images存放路径指定
steps: 1. mkdir /home/docker(你想要docker存放image的目录) 2. systemctl stop docker 3. vi /usr/lib/systemd/sy ...
- CVE-2014-0322漏洞成因与利用分析
CVE-2014-0322漏洞成因与利用分析 1. 简介 此漏洞是UAF(Use After Free)类漏洞,即引用了已经释放的内存,对指定内存处的值进行了加1.其特点在于攻击者结合flash实现了 ...
- impala安装笔记(Ubuntu)
1.Override 1.With Impala, you can query data, whether stored in HDFS or Apache HBase – including SEL ...
- 设计模式:组合(Composite)模式
设计模式:组合(Composite)模式 一.前言 关于Composite模式,其实就是组合模式,又叫部分整体模式,这个模式在我们的生活中也经常使用,比如说如果读者有使用Java的GUI编写过程序 ...
- TaskScheduler内幕天机解密:Spark shell案例运行日志详解、TaskScheduler和SchedulerBackend、FIFO与FAIR、Task运行时本地性算法详解等
本课主题 通过 Spark-shell 窥探程序运行时的状况 TaskScheduler 与 SchedulerBackend 之间的关系 FIFO 与 FAIR 两种调度模式彻底解密 Task 数据 ...