1.JDK动态代理方式实现

public static UserService createService(){
//目标类
final UserService userService = new UserServiceImp();
//切面类
final MyAspect myAspect = new MyAspect();
/**
* 代理类:
* class Proxy{
* public void addUser(){
* invoke(this,addUser,args)
* }
* public void deleteUser(){
* invoke(this,addUser,args)
* }
* }
*
* classLoader:类加载器,动态代理类在运行时创建,任何类都需要类加载器将其加载到内存。
* 一般使用当前类的类加载器
* interfaces:代理类需要实现的所有接口
* 方式1:userService.getClass().getInterfaces()
* 方式2:new Class[]{UserService.class}
* InvocationHandler:处理类,接口,匿名内部类
* invoke方法,代理类的每个方法执行时,都会调用一次该方法
* proxy:代理对象
* method:代理对象执行的方法的描述对象
* args:方法参数
*/ UserService proxyService = (UserService) Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(),
userService.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { myAspect.before();
Object obj = method.invoke(userService,args);
myAspect.after();
return obj ;
}
});
return proxyService;
}

2.采用字节码增强的框架,在运行时创建目标类的子类,从而实现增强

2.1 导入jar包

核心:hibernate\lib\bytecode\cglib\cglib-2.2.jar

依赖:struts2.3.15.4\struts-2.3.15.3\lib\asm-3.3.jar

spring-core...jar已经整合了这两个jar包

3. AOP联盟通知类型

AOP联盟为通知定义了org.aopalliance.aop.Advice

环绕通知,必须手动执行目标方法

try{

//前置通知

//执行目标方法

//后置通知

}catch(){}

4. spring编写代理:半自动

4.1  让spring去创建代理对象,从spring容器手动获取代理对象

  导入jar包:4+1

    AOP jar包:AOP联盟(规范)spring-framework-3.0.2.RELEASE-dependencies\org.aopalliance\com.springsource.org.aopalliance\1.0.0\com.springsource.org.aopalliance-1.0.0.jar

    spring-aop(实现)spring-framework-3.2.0.RELEASE\libs\spring-aop-3.2.0.RELEASE.jar

<!-- bean definitions here
创建目标类
-->
<bean id="userService" class="c_proxy_factoryBean.UserServiceImp"></bean>
<bean id="myAspect" class="c_proxy_factoryBean.MyAspect"></bean>
<!-- 使用spring的工厂bean,返回代理对象 -->
<bean id="proxyUserService" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 设置接口
确定接口,是个数组,使用array设置,如果只有一个值时,可以使用value配置 -->
<property name="interfaces">
<array>
<value>c_proxy_factoryBean.UserService</value>
</array>
</property>
<!--设置目标类-->
<property name="target" ref="userService"></property>
<!-- 设置通知
是个String数组,使用array设置,如果只有一个值时,可以使用value配置 -->
<property name="interceptorNames" value="myAspect"></property>
<!--强制使用cglib-->
<property name="optimize" value="true"></property>
</bean>

底层机制:

  如果没有设置接口,则使用cglib方式

  如果设置接口,默认使用JDK代理方式

  可以强制使用cglib方式

5.spring AOP编程,全自动

  从spring容器中正常获取目标类,如果配置了AOP,spring自动生成代理类

  必须确定目标类,支持aspectJ切入点表达式,导入jar包spring-framework-3.0.2.RELEASE-dependencies\org.aspectj\com.springsource.org.aspectj.weaver\1.6.8.RELEASE\com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

  目标类-->pointcut(切入点) + 通知(advicor)--》advicor(切面)

excution() || excution()

public class MyAspect implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("before method...");
Object obj = methodInvocation.proceed();
System.out.println("after method...");
return obj;
}
}
<!-- bean definitions here
创建目标类 -->
<bean id="userService" class="d_springAop.UserServiceImp"></bean>
<bean id="bookService" class="d_springAop.BookService"></bean>
<bean id="myAspect" class="d_springAop.MyAspect"></bean>
<!--spring AOP,导入命名空间,是否使用cglib-->
<aop:config proxy-target-class="true">
<!--
pointcut:切入点,目标类的方法
advicor:特殊的切面,只有一个通知和一个切入点,组织切入点和通知(增强)
-->
<!--切入点表达式-->
<aop:pointcut id="myPointcut" expression="execution(* d_springAop.*.*(..))" />
<aop:advisor advice-ref="myAspect" pointcut-ref="myPointcut" />
</aop:config>

6. aspectJ

6.1 介绍

  aspectJ是基于java的AOP框架

  spring2.0后支持AspectJ切入点表达式

  用途:自定义开发,代码植入

6.2 基于xml

6.3 基于注解

AOP切面编程的更多相关文章

  1. Spring MVC通过AOP切面编程 来拦截controller 实现日志的写入

    首选需要参考的是:[参考]http://www.cnblogs.com/guokai870510826/p/5977948.html    http://www.cnblogs.com/guokai8 ...

  2. Spring AOP 切面编程记录日志和接口执行时间

    最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特 ...

  3. AOP切面编程在android上的应用

    代码地址如下:http://www.demodashi.com/demo/12563.html 前言 切面编程一直是一个热点的话题,这篇文章讲讲一个第三方aop库在android上的应用.第三方AOP ...

  4. SpringBoot2.0 基础案例(11):配置AOP切面编程,解决日志记录业务

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.AOP切面编程 1.什么是AOP编程 在软件业,AOP为Asp ...

  5. 注解与AOP切面编程实现redis缓存与数据库查询的解耦

    一般缓存与数据库的配合使用是这样的. 1.查询缓存中是否有数据. 2.缓存中无数据,查询数据库. 3.把数据库数据插入到缓存中. 其实我们发现 1,3 都是固定的套路,只有2 是真正的业务代码.我们可 ...

  6. 十:SpringBoot-配置AOP切面编程,解决日志记录业务

    SpringBoot-配置AOP切面编程,解决日志记录业务 1.AOP切面编程 1.1 AOP编程特点 1.2 AOP中术语和图解 2.SpringBoot整合AOP 2.1 核心依赖 2.2 编写日 ...

  7. Spring AOP 切面编程的方法

    spring aop的使用分为两种,一种是使用注解来实现,一种是使用配置文件来实现. 先来简单的介绍一下这两种方法的实现,接下来详细的介绍各处的知识点便于查阅.目录如下: 1.基于注解实现spring ...

  8. AOP 切面编程

    简介 如果你很熟悉面向方面编程(AOP),你就会知道给代码增加“切面”可以使代码更清晰并且具有可维护性.但是AOP通常都依赖于第三方类库或者硬编码的.net特性来工作.虽然这些实现方式的好处大于它们的 ...

  9. AOP 切面编程------JoinPoint ---- log日志

    AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件 ...

  10. Spring基础篇——Spring的AOP切面编程

    一  基本理解 AOP,面向切面编程,作为Spring的核心思想之一,度娘上有太多的教程啊.解释啊,但博主还是要自己按照自己的思路和理解再来阐释一下.原因很简单,别人的思想终究是别人的,自己的理解才是 ...

随机推荐

  1. UINavigationController + UIScrollView组合,视图尺寸的设置探秘(三)

    还是在苹果的 View Controller Catalog for iOS 文章中找到答案.文中提到了两点: 1.If the navigation bar or toolbar are visib ...

  2. 洛谷P2235 [HNOI2002]Kathy函数

    传送门 题解 // luogu-judger-enable-o2 //minamoto #include<cstdio> #include<cstring> using nam ...

  3. 解决vue-cli相对路径问题 about css assert path ,two Solution(css路径的问题解决方案) #179

    https://github.com/vuejs/vue-cli/issues/179

  4. CI框架定义判断POST GET AJAX

    CI框架当中并没有提供,类似tp框架中IS_POST,IS_AJAX,IS_GET的方法. 所有就得我们自己造轮子了.下面就介绍一下,如何定义这些判断请求的方法.其实很简单的. 首先打开constan ...

  5. DP【洛谷P2134】 百日旅行

    [洛谷P2134] 百日旅行 题目背景 重要的不是去哪里,而是和你在一起.--小红 对小明和小红来说,2014年7月29日是一个美好的日子.这一天是他们相识100天的纪念日. (小明:小红,感谢你2场 ...

  6. Spring----. ref的用法

      ref元素是用在property中,来设置需要引用的容器管理的其它Bean.     它的用法:<ref bean|local|parent="someBean"> ...

  7. Pandas基本功能详解

    Pandas基本功能详解 Pandas  Pandas基本功能详解 |轻松玩转Pandas(2) 参考:Pandas基本功能详解 |轻松玩转Pandas(2)

  8. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_值类型的装箱和拆箱(二)

    [注意]:如果知道自己写的代码会造成编译器反复对一个值类型进行装箱,请改成用手动方式对值类型进行装箱. [好处]:代码会变得更小.更快. [例子]: using System; public seal ...

  9. hdu6223 Infinite Fraction Path 2017沈阳区域赛G题 bfs加剪枝(好题)

    题目传送门 题目大意:给出n座城市,每个城市都有一个0到9的val,城市的编号是从0到n-1,从i位置出发,只能走到(i*i+1)%n这个位置,从任意起点开始,每走一步都会得到一个数字,走n-1步,会 ...

  10. Appium自动化—浅谈iOS自动化测试环境搭建

    在日常的测试工作中,我们会发现有些测试工作重复率极高,测试人员需要花费大量的时间进行这些重复性的测试,浪费了大量的人力与时间.若能够将常用的测试场景进行自动化,那必定能节省许多的人力与时间.作为一个初 ...