aop

spring AOP 实现方式2

三世轮回 提交于 2020-02-29 16:45:38
IUserService.java package com.qfwh.app02; import java.util.List; public interface IUserService<T> { /*** * 获取 * */ List<T> getAllUser(); /** * 保存用户 */ Boolean saveUser(T user); /** * 删除 * */ boolean deleteUser(int uid); /** * 跟新 */ boolean updateUser(T obj); } UserServiceImpl.java package com.qfwh.app02; import java.util.ArrayList; import java.util.List; public class UsrServiceImpl<T> implements IUserService<T> { @Override public List<T> getAllUser() { System.out.println("----------getAllUser--------------"); return new ArrayList<>(); } @Override public Boolean saveUser(T user) { System.out

Spring Aop详解

扶醉桌前 提交于 2020-02-29 16:40:27
一、AOP背景 aop(aspect oriented progrmming), 面向切面编程. 在oop的概念中, 开发者可以自由的定义纵向关系, 但对横向的关系却有点束手无策. Aop技术的出现可以解决这一问题. 进一步描述问题:   代码混乱: 越来越多的非业务需求(日志和验证等)加入后, 原有的业务方法急剧膨胀, 每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点.    代码分散: 以日志需求为例, 只是为了满足这个单一的需求, 就不得不在多个模块(方法)里多次重复相同的日志代码.如果日志需求发生变化,必须更改所有的模块. aop的主要编程对象是切面,而切面模块化横切关注点. 在应用aop编程时, 仍然需要定义公共功能, 但可以明确的定义这个功能在哪里,以什么方式应用, 并且不必修改受影响的类 aop的好处:   每个事物逻辑位于一个位置, 代码不分散, 便于维护和升级   业务模块更简洁, 只包含核心业务代码 二、AOP基本概念 切面(Aspect): 横切关注点, 跨越应用程序多个模块的功能, 被模块化的特殊对象 通知(Advice): 切面必须要完成的工作 目标(Target): 被通知的对象 代理: 向目标对象应用通知之后创建的对象 连接点(JoinPoint): 程序执行的某个特定位置. 连接点由两个信息确定: 方法表示的程序执行点; 相对点表示的方位. 切点

SSH三大框架的工作原理及流程

帅比萌擦擦* 提交于 2020-02-29 09:06:35
Hibernate工作原理及为什么要用? 原理: 1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件 2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息 3.通过config.buildSessionFactory();//创建SessionFactory 4.sessionFactory.openSession();//打开Sesssion 5.session.beginTransaction();//创建事务Transation 6.persistent operate持久化操作 7.session.getTransaction().commit();//提交事务 8.关闭Session 9.关闭SesstionFactory 为什么要用: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库

Spring实战 (四) AOP

徘徊边缘 提交于 2020-02-29 08:15:21
在软件开发中,分布于应用多出的功能被称为和 横切关注点 . 通常,这些横切关注点从概念上是与应用的业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑中).将这些横切关注点与业务逻辑相分离正是 面向切面编成 (AOP)所要解决的 要了解什么是AOP,首先应该了解AOP相关术语,只有完全理解这些,才能更好的掌握AOP 描述切面的常用术语有 通知(advice), 切点(pointcut), 连接点(join point). 通知(advice) 切面有目标-他必须要完成的工作,成为通知.通知定义了切面是什么以及何时使用. Spring切面可以应用5种类型的通知 Before 在方法被调用之前调用通知 After 在方法完成之后调用通知,无论方法执行是否成功 After-returning 在方法成功执行之后调用通知 After-throwing 在方法抛出异常后调用通知 Around 通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为 连接点(join point) 连接点是在应用执行过程中能够插入切面的一个点.这个点可以是调用方法时,抛出异常时,甚至修改一个字段时.切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为 切点(pointcut) 切点的定义会匹配通知所要织入的一个或多个连接点 切面(Aspect) 切面是通知和切点的结合

spring AOP的异常拦截

爱⌒轻易说出口 提交于 2020-02-29 08:00:25
系统的异常处理机制是衡量一个系统设计的关键因素,良好的异常处理机制能在系统出现异常时准确的找到问题的所在。 spring aop对异常的处理有良好的支持。spring 提供了一个接口 ThrowsAdvice,该接口里面没有任何方法,但是实现类里面必须的实现 afterThrowing(Method method, Object[] args, Object target, RuntimeException throwable) 或者 afterThrowing(RuntimeException throwable) 如果需要记录发生异常方法的详细信息,则实现第一个方法就行,如果只记录发生的异常,实现第二个方法就ok! 那么异常的处理应该在什么位置来做处理呢? 一般我们的系统都应该有以下几个层次:Action--->Service---->DAO DAO负责直接和数据库打交道,也是发生异常频率较高的地方,而service只是调用DAO所提供给外面的接口,action里面大部分的操作也是调用service的服务,再加上少数其他的逻辑,这部分的异常可以单独处理!下面我们主要关心DAO层的异常处理。 1、定义接口 [java] view plain copy package com.beckham.dao; import java.util.List; import com

AOP:基于AspectJ编码简单示例

孤人 提交于 2020-02-29 07:55:40
一、基本概念   AspectJ 是一种面向切面程序设计的基于 Java 的实现。它向 Java 中加入了连接点(Join Point)这个新概念,其实它也只是现存的一个 Java概念的名称而已。它向 Java 语言中加入少许新结构:切点(pointcut)、通知(Advice)、类型间声明(Inter-type declaration)和方面(Aspect)。切点和通知动态地影响程序流程,类型间声明则是静态的影响程序的类等级结构,而切面则是对所有这些新结构的封装。 基于切面、连接点、切点、通知的概念如下: Aspect : Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。 Joint point :表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。 Pointcut :表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。 Advice :Advice 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint

【Spring】AOP注解方式实现机制

坚强是说给别人听的谎言 提交于 2020-02-29 01:15:00
一、概述 二、@EnableAspectJAutoProxy 注解分析 三、分析AnnotationAwareAspectJAutoProxyCreator 四、执行流程 1. registerBeanPostProcessors() 2. finishBeanFactoryInitialization() 3. InstantiationAwareBeanPostProcessor后置处理器的执行逻辑 4. 目标方法执行 第一部分,得到拦截器链 第二部分,拦截器链的触发过程 总结 一、概述 在Spring AOP 中: AnnotationAwareAspectJAutoProxyCreator 是基于Bean中的 AspectJ 注解来实现自动代理,在Bean创建的过程中完成对切入点的增强。 Spring AOP 的其他实现方式可以查看 【Spring】 AOP Base 对于 Spring AOP 使用注解的方式中,我们配置开启AOP注解 可以用XML的方式: <!-- 自动生成代理 底层就是AnnotationAwareAspectJAutoProxyCreator --> <aop:aspectj-autoproxy /> 或者用注解的方式 在配置类上标注 @EnableAspectJAutoProxy 注解 import org.springframework

Spring AOP原理

我的未来我决定 提交于 2020-02-29 00:30:52
ProxyFacotryBean是FacotryBean的一种实现,FacotryBean要产生bean都要重写getObject方法,而ProxyFacotryBean这里的这个getObject正是为代理做了准备并返回代理对象。首先用initializeAdvisorChain(第一次去取代理对象时初始化一遍)初始化Advisor链后对于singleton和prototype进行区分生成对应的proxy。 1、初始化Advisor链 initializeAdvisorChain初始化Advisor链是遍历ProxyFacotryBean中配置的interceptorNames,如果结尾有通配符只能是ListableBeanFacotory来加载否则报错,去掉结尾通配符*后调用addGlobalAdvosor(这个是获取ListableBeanFacotory的所有globalAdvisorNames和globalInterceptorNames,分别遍历用getBean(beanName)获取advice,把其中符合通配符格式的advice调用addAdvisorOnChainCreation封装成advicsor后添加到Advisor链

Spring AOP(三)--XML方式实现

谁说胖子不能爱 提交于 2020-02-29 00:28:52
本文介绍通过XML方式实现Spring AOP,在上一篇中已经介绍了通过注解+java配置的方式,这篇文章主要是看XML中怎么配置,直接上代码了: 一、创建一个连接点 1⃣️定义接口 注意⚠️:可以定义接口,也可以不定义,定义接口时使用jdk动态代理,不定义接口时使用cglib动态代理; 1 //定义一个接口 2 public interface CoderProjectService { 3 public void getProjectInfo(CoderProject coderProject); 4 } 2⃣️接口实现类 1 //创建一个类来处理业务逻辑,作为要织入切面中的被代理对象 2 public class CoderProjectServiceImpl implements CoderProjectService { 3 4 @Override 5 public void getProjectInfo(CoderProject coderProject) { 6 System.out.println("项目名称:" + coderProject.getProjectName() + "--项目版本号:" + coderProject.getProjectVersion() 7 + "--项目描述:" + coderProject.getProjectDesc());

Spring AOP 方式四 Aspect 基于Schema

 ̄綄美尐妖づ 提交于 2020-02-29 00:27:54
例子 Spring 配置文件 <?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" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans