aop

AOP与IOC区别

你。 提交于 2020-01-26 23:34:08
Spring核心知识 Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。 为什么说Spring是一个一站式的轻量级开源框架呢?EE开发可分成三层架构,针对JavaEE的三层结构,每一层Spring都提供了不同的解决技术。 • WEB层:SpringMVC • 业务层:Spring的IoC • 持久层:Spring的JDBCTemplate(Spring的JDBC模板,ORM模板用于整合其他的持久层框架) 从上面的简要介绍中,我们要知道Spring的核心有两部分: • IoC:控制反转

6. Spring - AOP - 基本使用

人盡茶涼 提交于 2020-01-26 13:39:03
系列篇幅 1. Spring - IOC - 注册组件 2. spring - IOC - 依赖注入 3. Spring - IOC - 组件扫描规则 4. Spring - IOC - 组件的作用域、懒加载、条件判断 5. Spring - IOC - 组件的生命周期 6. Spring - AOP - 基本使用 前言 本文来整理一下AOP相关知识,这里不直接介绍理论了,我们看下日常工作中如何使用 Filter、Interceptor、ControllerAdvice、AOP的关系 流程说明 加入依赖 spring-aspects 将业务逻辑组件和切面类都加入到容器中,并将切面类加入注解 @Aspect 在切面类上的每一个通知方法上标注通知注解,告诉Spring何时何地运行 切入点表达式 开启基于注解的aop模式 @EnableAspectJAutoProxy 通知方法 说明 前置通知(@Before) 在目标 方法运行之前 运行 后置通知(@After) 在目标方法 正常结束/异常结束之后 运行 返回通知(@AfterReturning) 在目标方法 正常返回之后 运行 异常通知(@AfterThrowing) 在目标方法 出现异常之后 运行 环绕通知(@Around) 动态代理,手动推进目标方法运行 joinPoint.procced() 引入依赖 lombok 推荐:

spring整合mybatis

允我心安 提交于 2020-01-26 08:18:47
spring整合mybatis的applicationContext.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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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:

spring AOP源码分析(一)

安稳与你 提交于 2020-01-26 06:55:44
spring AOP源码分析(一) 对于springAOP的源码分析,我打算分三部分来讲解:1.配置文件的解析,解析为BeanDefination和其他信息然后注册到BeanFactory中;2.为目标对象配置增强行为以及代理对象的生成,可以理解为AOP的准备阶段;3.代理对象调用方法,增强行为的触发执行,此时是AOP生效的阶段。我们可以把1,2理解为IOC阶段;2,3理解为AOP阶段。 我们先看第一部分:BeanDefination的解析注册过程 由一个demo进入源码分析,创建一个接口UserDao public interface UserDao { void addUser(); void deleteUser(); } 创建UserDaoImpl类 public class UserDaoImpl implements UserDao{ public void addUser() { System.out.println("add user "); } public void deleteUser() { System.out.println("delete user "); } } 创建一个Logger类 public class Logger { public void recordBefore(){ System.out.println("recordBefore"

AOP的动态代理机制

吃可爱长大的小学妹 提交于 2020-01-26 02:45:34
在java的动态代理机制中,有两个重要的类或接口,一个是InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。 代理模式的设计思想:是通过代理的方式避免暴露被代理对象或者说代理不容易被取得的对象 public class CalculatorProxy { /** * 为传入的参数对象创建一个动态代理对象 * @param calculator 参数对象 * @return 动态代理对象 */ public static Object getProxy ( final Calculator calculator ) { /* * Proxy:为目标对象创建代理对象;相当于Proxy也是实现了Calculator接口 * * 参数 * loader:目标对象的类加载器 * interfaces:目标对象实现的所有接口;如果没有实现任何接口,就会报错 * InvocationHandler:方法执行器对象 */ return Proxy . newProxyInstance ( calculator . getClass ( ) . getClassLoader ( ) , calculator . getClass ( ) . getInterfaces ( ) , new

Spring AOP的实现机制

北城余情 提交于 2020-01-26 02:33:01
AOP(Aspect Orient Programming),一般称为面向切面编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理,日志,缓存等等.AOP 实现的 关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。静态代理是编译期实现,动态代理是运行期实现,可想而知前者拥有更好的性能。 本文主要介绍Spring AOP的两种代理实现机制,JDK动态代理和CGLIB动态代理。 静态代理是编译阶段生成AOP代理类,也就是说生成的字节码就织入了增强后的AOP对象;动态代理则不会修改字节码,而是在内存中临时生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。 Spring AOP中的动态代理主要有两种方式, JDK动态代理 和CGLIB动态代理.JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口.JDK动态代理的核心是InvocationHandler接口和代理类。 如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类.CGLIB(代码生成库),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理

自定义注解结合Aop数据字典应用

梦想与她 提交于 2020-01-25 18:56:01
本篇博客主要聊聊自定义注解在项目中的应用,自定义注解用来做系统监控日志,这个用法已经烂大街了,无法让面试官眼前一亮的感觉。 项目开发中数据字典使用场景非常多,使用数据字典有一点非常的不方便,那就是数据库中存放的是数字,而实际页面上展示的却是汉字;那么这也就造成了,每次做页面展示的时候都需要给数字进行转义,将其转义成汉字内容展示到页面,而转换的过程过于繁琐; 咱们的自定义注解可以完美的解决这一问题; 浏览器输入:http://localhost:8080/student/listPager 测试 最后浏览器访问的效果图 小李飞刀_解决方案 小李飞刀_解决方案 当然,也可以不走默认规则,xxx就是在类属性上的自定义注解的属性值 小李飞刀_解决方案 相关的pom依赖 com.alibaba fastjson 1.2.4 逆向工程生成实体类、mapper.xml、mapper.java 实体类 package com.javaxl.model; public class DataDict { private Integer id; private String datasource; private String description; public DataDict(Integer id, String datasource, String description) { this.id

Spring AOP中的动态代理

我怕爱的太早我们不能终老 提交于 2020-01-25 14:47:33
0 前言 1 动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2 Spring AOP中的动态代理机制 2.1 JdkDynamicAopProxy 2.2 CglibAopProxy 3 总结 0 前言 前一个季度旅游TDC的Thames服务有几次宕机,根据组内原因认真查找发现是数据库事务造成的,后来把服务中的事务配置全部去掉,服务恢复正常。根据这次教训,虽然现在还是很难确定是哪一个方面的真正原因,但是激发了我学习Spring事务方面的兴趣。而Spring事务的实现是根据AOP来实现的,对于我这个小菜鸟,只能一步一步来了,决定先从Spring的AOP开始。 1 动态代理 Spring AOP中使用了两种动态代理,一种是JDK的动态代理,一种CGLIB的动态代理。JDK的动态代理必须指定接口,这些接口都是已经被代理对象实现了的;而CGLIB代理则不需要指定接口。 1.1 JDK动态代理 JDK的动态代理网上有很多资料,这里只说我自己的理解。 JDK动态代理必须实现InvocationHandler接口,然后通过Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)获得动态代理对象。

Spring代理模式及AOP基本术语

纵然是瞬间 提交于 2020-01-25 14:43:55
Spring代理模式及AOP基本术语 一: 代理模式 静态代理:代理模式 原始对象 代理对象:对原始对象的方法做了增强 动态代理 jdk的动态代理 本质:在内存中构建出接口的实现类 特点:被代理对象,必须有接口 public void jdkTest(){ //如何生成代理对象? final UserDAO dao=new UserDAOImpl(); //1参数 :被代理对象 UserDAOImpl的类加载器 //2参数 :被代对象 所属的接口 UserDAO proxy=(UserDAO)Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(), new InvocationHandler() { /** * proxy:代理对象 * * method:代理对象的方法 add * * args:代理对象的方法的参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("开启事务"); //真正的dao.add() Object invoke = method.invoke(dao,

spring注解开发-AOP(含原理)

你说的曾经没有我的故事 提交于 2020-01-25 10:39:21
一:AOP基本使用 AOP指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式; 步骤一:导入aop模块;Spring AOP:(spring-aspects) <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.12.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.3.12.RELEASE</version> </dependency> 步骤二:定义一个业务逻辑类;在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,环绕) public class MathCalculator { public int div(int i,int j){ System.out.println("MathCalculator...method..."); return i/j; } } 步骤三:定义一个日志切面类