文档章节

AOP的半自动代理 及 缺点

T-Brain
 T-Brain
发布于 2015/10/20 01:20
字数 1084
阅读 10
收藏 0
点赞 0
评论 0

AOP的通知类型:

aop联盟 定义 aop通知类型,spring 对 aop联盟规范支持。

aop联盟定义5种通知

前置通知 org.springframework.aop.MethodBeforeAdvice

在目标方法执行前实施增强

后置通知 org.springframework.aop.AfterReturningAdvice

在目标方法执行后实施增强

环绕通知 org.aopalliance.intercept.MethodInterceptor

在目标方法执行前后实施增强

异常抛出通知 org.springframework.aop.ThrowsAdvice

在方法抛出异常后实施增强

引介通知 org.springframework.aop.IntroductionInterceptor(了解)对一个类进行增强(添加方法或属性等)

在目标类中添加一些新的方法和属性

如果使用aop联盟规范进行aop开发,所有的通知必须实现接口。(底层为了确定通知方法名称)


AOP的半自动代理(不带有切入点的切面---所有方法)

1.切面类

    需要总结:

            需要根据AOP联盟确定一个通知类型:这里使用环绕通知(环绕通知需要手动开启方法)

            所以切面类随便写,随便实现一个通知类型,重写里面的invok方法在,通过参数调用

                    proceed()执行目标类,前后可以写代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.mickeymouse.proxy;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
/**
  * 切面类:包含两个通知(增强)
          环绕通知必须手动执行方法
  * @author Mickey-Mouse
  *
  */
public class MyAspect implements MethodInterceptor {
     public Object invoke(MethodInvocation mi) throws Throwable {
         System.out.println( "已校验是否符合身份" );
         //环绕通知必须手动执行方法
         Object object = mi.proceed();
         System.out.println( "方法已经执行完--->后处理" );
         return object;
     }
}
2.目标类(已实现接口)
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.mickeymouse.proxy;
public class ProductsServiceImpl implements ProductsService {
     /**
      * 目标类:
      * 里面有两个连接点
      */
     public void addProducts(){
         System.out.println( "添加商品成功" );
     }
     public void updateProducts(){
         System.out.println( "修改商品成功" );
     }
}
3.半自动代理XML配置

  与AOP的自动代理的区别在于:

       半自动代理没有使用AOP约束,要手动配置代理类与目标类的关系

      半自动代理是基于ProxyFactoryBean的代理类:

            缺点:

                    * 配置麻烦:

                    * 需要为每一个要增强的类配置一个ProxyFactoryBean.(只要有增强,就需要写一个ProxyFactoryBean的配置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<? xml version = "1.0" encoding = "UTF-8" ?>
        xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop = "http://www.springframework.org/schema/aop"
        xsi:schemaLocation="
<!-- bean definitions here -->
     <!-- 半自动代理模式 -->
     <!-- 生成切面类 -->
     < bean id = "myAspect" class = "com.mickeymouse.proxy.MyAspect" />
     <!-- 生成目标类 -->
     < bean id = "productsService" class = "com.mickeymouse.proxy.ProductsServiceImpl" />
     <!-- 让Spring来创建代理工厂对象 -->
     < bean id = "proxyFactoryBean" class = "org.springframework.aop.framework.ProxyFactoryBean" >
         <!-- 设置目标类 -->
         < property name = "target" ref = "productsService" ></ property >
         <!-- 设置切面类"名字" -->
         < property name = "interceptorNames" value = "myAspect" ></ property >
         <!-- 设置切面类需要连接的接口(optimize与接口二选一即可,Spring可以自动识别,接口就动态代理,没有就CGLIB) -->
         < property name = "proxyInterfaces" value = "com.mickeymouse.proxy.ProductsService" ></ property >
         <!-- 是否强制使用使用CGLIB -->
         < property name = "optimize" value = "true" ></ property >
     </ bean >
</ beans >

测试类:

1
2
3
4
5
6
7
@Test
     public void test1(){
         ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml" );
         ProductsService bean = applicationContext.getBean( "proxyFactoryBean" ,ProductsService. class );
         bean.addProducts();
         bean.updateProducts();
     }

结果:



AOP的半自动代理:(配置带有切入点的切面---->个别方法)(了解)

配置文件:(其他部分是一样的 , 同上)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<? xml version = "1.0" encoding = "UTF-8" ?>
        xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
     
     <!-- Spring帶有切入点的切面=============== -->
     
     <!-- 配置目标类 -->
     < bean id = "customerDao" class = "com.itheima.spring.demo4.CustomerDao" />
     
     <!-- 配置通知:(环绕通知) -->
     < bean id = "myAroundAdvice" class = "com.itheima.spring.demo4.MyAroundAdvice" />
     
     <!-- 配置带有切入点的切面 -->
     < bean id = "myAdvisor" class = "org.springframework.aop.support.RegexpMethodPointcutAdvisor" >
         <!-- 表达式: 正则表达式 : .:任意字符  *:任意次数-->
<!-- 拦截所有方法 -->
<!--         <property name="pattern" value=".*"/> -->
<!-- 只拦截update方法 -->
<!--         <property name="pattern" value="com\.itheima\.spring\.demo4\.CustomerDao\.update"/> -->
<!-- 拦截update和delete方法 -->
<!--         <property name="patterns" value="com\.itheima\.spring\.demo4\.CustomerDao\.update,com\.itheima\.spring\.demo4\.Cus            tomerDao\.delete"/> -->
         <!-- 拦截所有以save和update结束名的方法 -->
         < property name = "patterns" value = ".*save.*,.*update.*" />
         <!-- 配置增强 -->
         < property name = "advice" ref = "myAroundAdvice" />
     </ bean >
     
     <!-- 配置生成代理 -->
     < bean id = "proxyFactoryBean" class = "org.springframework.aop.framework.ProxyFactoryBean" >
         <!-- 配置目标 -->
         < property name = "target" ref = "customerDao" />
         <!-- 配置代理目标类 -->
         < property name = "proxyTargetClass" value = "true" />
         <!-- 配置拦截的名称 -->
         < property name = "interceptorNames" value = "myAdvisor" />
     </ bean >
</ beans >



© 著作权归作者所有

共有 人打赏支持
T-Brain
粉丝 1
博文 44
码字总数 46138
作品 0
海淀
程序员
我们为什么要使用 AOP

前言 一年半前写了一篇文章Spring3:AOP,是当时学习如何使用Spring AOP的时候写的,比较基础。这篇文章最后的推荐以及回复认为我写的对大家有帮助的评论有很多,但是现在从我个人的角度来看...

t4i2b10X4c22nF6A ⋅ 2017/10/26 ⋅ 0

java代理与Spring AOP

代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会...

coldlemon ⋅ 2013/11/24 ⋅ 0

AOP动态代理的实现机制

1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP。 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比...

markGao ⋅ 2014/01/02 ⋅ 0

32、最简单的mvc框架tiny,orm、原理图、问题与解决思路

orm 先说下orm,在前面我们没有提这个,其实我们已经实现了orm功能。 这里把orm做了极大的简化,以一个model映射到数据库的一张表。在前面看到我们把业务处理也放在model里,所以这时model才...

青青小树 ⋅ 2014/04/13 ⋅ 11

代理模式-结构型模式1

即Proxy Pattern,23种java常用设计模式之一。代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在...

凯文加内特 ⋅ 2014/02/13 ⋅ 0

【00】AOP概述

一、AOP的产生与意义 1、垂直模块化的局限 SoC,Separation of Concerns,把系统分割为小的单独的单元来处理。在命令式编程语言里头,会把系统分割为数据结构和方法,具体在OOP语言里头,分解...

xixicat ⋅ 2014/07/02 ⋅ 0

静态代理与动态代理实现与原理

基础代码准备 接口类: public interface IUser { /** * 判断用户的权限 * @param uid 用户的UID * @return / public boolean isAuthUser(int uid);} 实现类: /* * 类的实现 * @author Jaso......

ifree613 ⋅ 2016/03/11 ⋅ 0

【Spring AOP】学习记录(一)

[TOC] 由于公司有自己的框架,整个架构跟几乎沾不上边,在业余时间对框架的学习,最近开始学习切面编程,并且在博文中记录一下,以便日后快速上手 概述 这一章先了解一下什么是AOP,以及写一...

小彬彬_ ⋅ 2016/09/11 ⋅ 0

AOP各种的实现

1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP。 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比...

城固如春 ⋅ 2016/09/29 ⋅ 0

java annotation与AOP点滴积累

spring注解,与依赖注入 (1).类级别的注解:如@Component、@Repository、@Controller 、@Service 以及JavaEE6的@ManagedBean和@Named注解,都是添加在类上面的类级别注解,Spring容器根据注解...

浮云过眼 ⋅ 2016/03/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决yum安装报错Protected multilib versions

使用yum安装报错Protected multilib versions原因是因为多个库不能共存,不过更新的话也并不行,但是可以在安装命令后面加上如下一段命令: --setopt=protected_multilib=false 案例: 比如需...

北岩 ⋅ 19分钟前 ⋅ 0

为什么要学习Typescript???

简单来说 目前的typescript就是未来的javascript 为什么?? 这要从ECMA-262标准的第4版说起 对了 我们说的ES5 其实是ECMAScript3.1这个替代性建议被扶正了而已... 那么 第4版标准是什么? 看看...

hang1989 ⋅ 23分钟前 ⋅ 0

linux安装ipfs

一、下载ipfs # cd /usr/local/ipfs/ # wget https://dist.ipfs.io/go-ipfs/v0.4.15/go-ipfs_v0.4.15_linux-amd64.tar.gz # tar -zxvf go-ipfs_v0.4.15_linux-amd64.tar.gz 二、安装ipfs # ......

八戒八戒八戒 ⋅ 29分钟前 ⋅ 0

jvm程序执行慢诊断手册

生产环境最多的几种事故之一就是程序执行慢,如果是web服务的话,表现就是响应时间长。本文分享,从业多年形成的排查守则。 诊断步骤 系统资源查看 首先是系统资源查看,而且必须是在第一步。...

xpbob ⋅ 29分钟前 ⋅ 0

YII2 advanced 高级版本项目搭建-添加API应用以及多应用

一、YII安裝 安裝yii可以用composer安裝,也可以在yii中文社区下载归档文件安装 composer安装就不介绍了,因为要安装composer,比较麻烦,当然安装了composer是最好的,以后安装yii的插件要用...

botkenni ⋅ 30分钟前 ⋅ 0

在jdk1.8的环境下模拟永久代内存溢出

相信不少小伙伴在看深入理解Java虚拟机的时候,作者给我们举例一个demo来发生PermGen space 1、通过List不断添加String.intern(); 2、通过设置对应的-XX:PermSize与-XX:MaxPermSize(更快看到...

虾几把写 ⋅ 56分钟前 ⋅ 0

开发OpenDaylight组件的完整流程

在前面介绍学习了OpenDaylight的几个重要模块后,这里再来介绍下完整开发一个模块的过程。 OSGI的bundles提供被其他OSGI组件调用的服务。这个教程中展示的是Data Packet Service去解析数据包...

wangxuwei ⋅ 今天 ⋅ 0

Java序列化和反序列化

1、什么是序列化和反序列化 序列化:把对象转换为字节序列的过程。 反序列化:把字节序列恢复成对象的过程。 2、被序列化的类需要实现serializable接口,只是为了标注该对象是可以被序列化的...

IT-Mamba ⋅ 今天 ⋅ 0

流式构建原理

流式构建需要达到分钟级的数据更新频率,Kylin采用类似于Spark Streaming的做法,每隔数分钟进行一次微构建。这边的构建需要考虑到一个延迟因素,分布式网络存在延迟等因素,该时间段的数据有...

无精疯 ⋅ 今天 ⋅ 0

在maven项目工程编写solr代码,需要的依赖

solrJ <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>6.6.2</version> </dependency> <dependency> <groupId>org.apache.httpcomponents<......

爱运动的小乌龟 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部