Spring基础3
一、AOP
1)AOP简介:
Aspect Oriented Programming,面向切面编程
通过预编译方式和动态代理实现程序功能的一种技术,AOP是OOP的延续,是函数式编程的一种衍生范例。利用AOP可以对业务逻辑各个部分进行隔离,从而使得业务逻辑之间的耦合度降低,提高程序的可重用性,同时提高开发效率。
AOP采用横向抽取机制取代了传统纵向继承,不破坏原有的类,生成一个动态代理类,在原有类的基础上进行增强,可以随时添加,随时取消功能。
Spring中使用的AOP是Aspectj
二、动态代理
1)JDK动态代理,依赖接口



package com.ual.dao;
public class GoodsDaoImpl implements GoodsDao {
@Override
public void save() {
System.out.println("保存");
}
@Override
public void update() {
System.out.println("更新");
}
}
package com.ual.Proxy; import com.ual.dao.GoodsDao; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class GoodsJDKProxy {
public GoodsDao createProxy(GoodsDao goodsDao) {
GoodsDao goodsDaoProxy = (GoodsDao) Proxy.newProxyInstance(goodsDao.getClass().getClassLoader(),
goodsDao.getClass().getInterfaces(), new InvocationHandler() {
@Override//当调用对象的时候,所有的方法都会来到这里
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if("save".equals(method.getName())){
System.out.println("保存校验");
return method.invoke(goodsDao, args);//返回的代理对象
}
if("update".equals(method.getName())){
System.out.println("更新校验");//方法执行之前,执行
GoodsDao goodsDao1 = (GoodsDao)method.invoke(goodsDao, args);//返回的代理对象
System.out.println("日志打印");//方法执行之后
return goodsDao1;
}
return method.invoke(goodsDao, args);//返回的代理对象
}
});
return goodsDaoProxy;//返回一个代理对象,代理对象中的方法执行时,会回调匿名内部类中的Invoke方法。
}
}
package com.ual.test; import com.ual.Proxy.GoodsJDKProxy;
import com.ual.dao.GoodsDao;
import com.ual.dao.GoodsDaoImpl;
import org.junit.Test; public class GoodsDaoTest {
@Test
public void test() {
GoodsDao goodsDao = new GoodsDaoImpl();
/* goodsDao.save();*/
GoodsJDKProxy goodsJDKProxy = new GoodsJDKProxy();
GoodsDao proxy = goodsJDKProxy.createProxy(goodsDao);
proxy.save();
proxy.update();
}
}
2)cglib动态代理,不需要依赖接口,核心是通过子类继承
Spring会在jdk与cglib之间进行自动切换,有接口使用jdk,没有接口使用cglib。



三、AOP相关术语
1)JoinPoint:连接点,可以被拦截的方法,能够(可以)被增强的方法,称为连接点。
2)Pointcut:切入点,真正被拦截,增强的方法
3)Advice:通知,增加的内容,通常封装成一个方法,这个方法称之为通知
4)Introduction:引介,类层面的增强,给原有类添加一些新的属性和方法。在开发中通常给方法加强
5)Target:被增强的对象
6)Weaving:织入,将通知应用到目标对象的过程
7)Proxy:代理对象
8)Aspect:切面,多个通知和对各切入点的集合
四、Spring 中AOP的使用
1)引入Spring基本jar包
2)引入AOP开发相关jar包
3)配置文件引入AOP约束
4)Spring 测试
引入这个jar包,这样就不用每次都获取工厂

在测试类上添加

package com.ual.test; import com.ual.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class UserTest {
@Autowired
private UserService userService;
@Test
public void test() {
this.userService.delete();
}
}
5)编写一个切面类
即里面写入通知
package com.ual2.demo;
public class Myaspect {
public void check(){
System.out.println("校验");
}
}
6)将切面类交给Spring
7)配置AOP完成对目标产生代理

<bean id="myaspect" class="com.ual2.demo.Myaspect"></bean>
<!--配置AOP-->
<aop:config>
<!--切入点:给哪个方法做增强-->
<aop:pointcut id="pointDelete" expression="execution(* com.ual.dao.UserDaoImpl.delete(..))"/><!--expression:给哪个类里的哪个方法做增强-->
<!--切面:增强的功能是什么-->
<aop:aspect ref="myaspect">
<aop:before method="check" pointcut-ref="pointDelete"/>
</aop:aspect>
</aop:config>
</beans>
五、AOP通知类型
1)前置通知
在目标方法执行之前执行
2)后置通知
在目标方法执行之后执行,可以在通知中可以得到一个目标方法的返回值



3)环绕通知
在目标方法执行之前,执行之后操作



4)异常抛出通知
在程序出现异常时才会触发



5)最终通知
无论代码是否有异常,都会执行

六、AOP切入点表达式
基于execution函数完成
【访问修饰符(可选)】 方法返回值(*代表任意类型)包名.类名.方法名(参数)
参数:“..”为任意类型;包名.类名+.方法名(参数)当前类和子类该方法都为切入点
* com.ual..*.*(..):com.ual包以及子包下面的所有类的所有方法都是切入点
七、AOP中的注解开发
1)引入jar包
2)引入配置文件
3)编写切面类配置
4)使用注解的AOP对象对目标类进行增强
1.在配置文件中开启以注解形式进行AOP开发

2.在切面类上添加注解

3.测试方法

5)注解AOP通知类型
1.@Before:前置通知
2.@AfterReturenning:后置通知
2.1 没有返回值

2.2 有返回值

3.@Around环绕通知

4.@AfterThrowing异常抛出通知
4.1没有获取异常信息
4.2获取异常信息
5.@After:最终通知
6.同一通知应用多个方法

也可以用这种方式

注意:当使用接口时与不使用接口时,Spring内部代理区别:
1.使用接口,采用jdk动态代理
2.不使用接口,采用cglib动态代理
Spring基础3的更多相关文章
- Spring基础知识
Spring基础知识 利用spring完成松耦合 接口 public interface IOutputGenerator { public void generateOutput(); } 实现类 ...
- spring基础整理
spring基础教程:https://www.tutorialspoint.com/spring/spring_overview.htm 注入实例 <bean id="" c ...
- Spring 基础知识
Spring架构简单描述 原文:https://www.shiyanlou.com/courses/document/212 Spring 概述 1. Spring 是什么 Spring是一个开源的轻 ...
- Spring基础配置
从毕业到现在我一直从事Android开发,但是对JavaEE一直念念不忘,毕业校招的时候,一个礼拜拿了三个offer,岗位分别是Android.JavaEE和JavaSE,后来觉得Android比较简 ...
- Spring基础系列--AOP织入逻辑跟踪
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9619910.html 其实在之前的源码解读里面,关于织入的部分并没有说清楚,那些前置.后 ...
- 第65节:Java后端的学习之Spring基础
Java后端的学习之Spring基础 如果要学习spring,那么什么是框架,spring又是什么呢?学习spring中的ioc和bean,以及aop,IOC,Bean,AOP,(配置,注解,api) ...
- Spring基础系列-AOP源码分析
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9560803.html 一.概述 Spring的两大特性:IOC和AOP. AOP是面向切 ...
- Spring基础系列-Spring事务不生效的问题与循环依赖问题
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9476550.html 一.提出问题 不知道你是否遇到过这样的情况,在ssm框架中开发we ...
- Spring Boot实战(1) Spring基础
1. Spring基础配置 Spring框架本身有四大原则: 1) 使用POJO进行轻量级和最小侵入式开发 2) 通过依赖注入和基于接口编程实现松耦合 3) 通过AOP和默认习惯进行声明式编程 4) ...
- spring基础学习01
spring基础 Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用 IOC控制反转 把创建对象和维护对象之间的关系权利 ...
随机推荐
- MySQL 之 库操作,表操作
系统数据库 information_schema :虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等 mysql:核心数据库,里面包含用户.权限.关键 ...
- C# Winfom 中ListBox的简单用法
https://www.cnblogs.com/xielong/p/6744805.html Winform控件ListBox的用法 1.如何添加listBox的值 this.listBox1.Ite ...
- 利用SHAPEIT将vcf文件进行基因型(genotype)定相(phasing):查看两个突变是否来源于同一条链(染色体或父本或母本),two mutations carried by the same read
首先,下载SHAPEIT. 按照里面的步骤安装完后,将vcf文件进行基因型定相,分四步走. 第一步,将vcf文件转化为plink二进制文件(.bed, .bim, .fam). 这一步需要用到GATK ...
- 斯坦福大学公开课机器学习: advice for applying machine learning - evaluatin a phpothesis(怎么评估学习算法得到的假设以及如何防止过拟合或欠拟合)
怎样评价我们的学习算法得到的假设以及如何防止过拟合和欠拟合的问题. 当我们确定学习算法的参数时,我们考虑的是选择参数来使训练误差最小化.有人认为,得到一个很小的训练误差一定是一件好事.但其实,仅仅是因 ...
- JDBC的简单笔记
JDBC笔记: JDBC:java database connectivity SUN公司提供的一套操作数据库的标准规范. JDBC与数据库驱动的关系:接口与实现的关系. JDBC规范(掌握四个核心对 ...
- C++基础知识--DAY2
昨天我们主要是讲的C++相对于C语言的变化,结尾讲述了一点引用的基础知识,要明白,引用就是对一个变量取别名,在C++中需要用指针的都可以思考是否可以用引用来代替. 1. 常引用 常引用(const s ...
- MooFest POJ - 1990 (树状数组)
Every year, Farmer John's N (1 <= N <= 20,000) cows attend "MooFest",a social gather ...
- (贪心)nyoj91-阶乘之和
91-阶乘之和 内存限制:64MB 时间限制:3000ms 特判: No 通过数:71 提交数:191 难度:3 题目描述: 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数) ...
- (Set){A} + {B} hdu1412
{A} + {B} 链接:http://acm.hdu.edu.cn/showproblem.php?pid=1412 Problem Description 给你两个集合,要求{A} + {B} ...
- Linux设备树(二 节点)
二 节点(node)的表示 首先说节点的表示方法,除了根节点只用一个斜杠“/”表示外,其他节点的表示形式如“node-name@unit-address”.@前边是节点名字,后边是节点地址.节点名字的 ...