夜光带你走进Spring(四)
夜光序言:
哪儿有什么天长地久,只不过是一时拥有;
哪儿有什么雪月风花,只不过是沧海幻化。
正文:
2. Aop编程
public void add(User user) { Session session = null; Transaction trans = null; try { session = HibernateSessionFactoryUtils.getSession(); 【关注点代码】 trans = session.beginTransaction(); 【关注点代码】
session.save(user); // 业务
trans.commit(); 【关注点代码】 } catch (Exception e) { e.printStackTrace(); if(trans != null){ trans.rollback(); } } finally{ HibernateSessionFactoryUtils.closeSession(session); } }
|
Aop 编程,
主要是分离业务代码与关注点代码~
关注点代码,写一次,在执行业务代码时候动态植入关注点代码~
自己实现aop编程
aop编程, 注解方式
概念:
Aop编程:
关注点代码与业务代码分离~(jdk/cglib代理)
关注点:
重复执行的代码, 也叫关注点代码
切面:
关注点代码形成的类,就叫做切面
springAop编程,也叫面向切面编程~
Aop: Aspect Object Programming 面向切面编程
举例,哪些是切面?
事务,权限控制, 日志…
切入点表达式
拦截方法,给方法所在的类,生成代理对象~
Spring在初始化容器的时候,会根据切入点表达式的规则,会符合拦截规则的方法所在的类生成代理对象~
使用Aop开发步骤:
1. 引入aop 相关 jar文件
(aspectj 在spring之前,面向切面开发的公用组件)
aopalliance.jar 【spring-framework-2.5.6\lib\aopalliance】
aspectjrt.jar 【spring-framework-2.5.6\lib\aspectj】
aspectjweaver.jar 【spring-framework-2.5.6\lib\aspectj】
spring-aop-3.2.5.RELEASE.jar 【Spring3.2源码】
2. 引入aop名称空间
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 开启注解扫描 --> <context:component-scan base-package="cn.Genius.e_aop_anno"></context:component-scan> <!-- 开启aop注解 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans> |
3. 开启aop注解
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
4. 使用Aop相关注解
@Aspect 指定一个类为切面类
(切面类也需要实例化)
(切面类中的方法,也叫做通知)
@Before 前置通知 【在执行目标对象方法之前执行】
@After 后置通知 【在执行目标对象方法之后执行】
@AfterReturning 返回后通知 【在执行目标对象方法结束后执行, 出现异常不执行】
@AfterThrowing 异常通知 【在执行目标对象方法出现异常时候执行】
@Around 环绕通知 【环绕目标方法执行】
@Pointcut 定义一个切入点表达式变量 (后面使用这个切入点表达式的时候,直接引用方法名即可)
Spring生成代理对象的过程?
1. 创建容器对象的时候, 根据“切入点表达式”拦截的类,生成代理对象;
2. 如果目标对象有实现接口,使用jdk代理~
3. 如果目标对象没有实现接口,使用cglib代理~
4. 从容器获取代理后的对象
5. 执行代理对象的方法,在运行时期,动态植入“切面”类中的“通知”
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- selenium webdriver 如何添加cookie
- Flutter基础widgets教程-Scaffold篇
- python selenium 微信公众号历史文章随手一点就返回首页?郁闷之下只好将他们都下载下来。
- Flutter基础widgets教程-SimpleDialog篇
- python selenium 关于将网页打包为静态网页(mhtml)下载。
- Redis:哨兵
- Python中设置指定窗口为前台活动窗口(最顶层窗口)win32gui
- 关于pandas.eval使用的一些问题。
- Flutter基础widgets教程-Slider篇
- 带你认识Pytest(三)
- Additive Powers-of-Two (APoT) Quantization:硬件友好的非均匀量化方法
- Flutter基础widgets教程-SnackBar篇
- Redash 二开 - 后端环境搭建
- Flutter基础widgets教程-Stepper篇
- Flutter基础widgets教程-Switch篇