ProxyFactoryBean类

FactoryBean接口用于Bean的实例化,ProxyFactoryBean是它的一个实现类,用于实例化代理(Bean)。

spring  aop是用动态代理实现的,自己写jdk动态代理、cglib代理很麻烦,spring用ProxyFactoryBean封装了jdk动态代理、cglib动态代理,我们只需在xml中配置代理即可,不必手写动态代理。


Demo

(1)添加spring-aop.RELEASE.jar

Spring  AOP需要spring-aop.RELEASE.jar的支持。(待修改)

(2)目标接口、目标类

新建包com.chy.dao,包下新建接口UserDao、实现类UserDaoImpl:

public interface UserDao {
public void addUser();
public void deleteUser();
}
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
System.out.println("正在添加用户...");
} @Override
public void deleteUser() {
System.out.println("正在删除用户...");
}
}

(3)切面

新建包com.chy.aspect,包下新建类UserDaoAspect:

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation; public class UserDaoAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
//前增强
System.out.println("正在执行前增强...");
//调用目标方法,返回值是Object类型
Object object=methodInvocation.proceed();
//后增强
System.out.println("正在执行后增强...");
//返回目标方法的返回值
return object;
}
}

注意实现的接口是spring-aop.RELEASE.jar中的aopalliance包下的接口:

import org.aopalliance.intercept.MethodInterceptor;

是spring aop封装好的接口,不必手写代理。

不是spring内嵌的cglib包下的接口:

import org.springframework.cglib.proxy.MethodInterceptor

spring内嵌了cglib需要的jar,这个MethodInterceptor是cglib的原生接口,需要手写动态代理。


实现相应的接口即可:

  通知类型
对应的接口
环绕通知     MethodInterceptor    
前置通知 MethodBeforeAdvice
后置通知

AfterAdvice(空接口)

异常通知 ThrowsAdvice(空接口)
返回通知 AfterReturningAdvice 

一般不使用空接口。

虽然AfterReturningAdvice是返回通知,但很多时候都可以作为后置通知使用。

示例     前增强

import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method; public class UserDaoAspect implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("前增强...");
}
}

(4)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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 目标类-->
<bean name="userDaoImpl" class="com.chy.dao.UserDaoImpl" /> <!-- 切面-->
<bean name="userDaoAspect" class="com.chy.aspect.UserDaoAspect" /> <!-- 配置ProxyFactoryBean类,用于生产代理对象-->
<bean name="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--指定要代理的接口,如果实现了多个接口,用子元素<list>来写-->
<property name="proxyInterfaces" value="com.chy.dao.UserDao" />
<!--指定目标对象-->
<property name="target" ref="userDaoImpl" />
<!--指定切面,只能用value,不能用ref-->
<property name="interceptorNames" value="userDaoAspect" />
<!-- 是否直接代理目标类
true:直接代理目标类,目标类不必实现接口,使用的是cglib动态代理
false:默认值,代理接口,目标类必须实现接口,使用的是jdk动态代理
-->
<property name="proxyTargetClass" value="false" />
<!--返回的代理对象是否使用单例,默认为true 单例-->
<property name="singleton" value="true" />
</bean>
</beans>

ProxyFactoryBean类封装好了创建代理的代码,我们只需使用<property>注入参数即可。

上面的配置代理的是目标接口,如果只代理目标类:

  • 不配置proxyInterfaces(不注入目标接口)
  • 将proxyTargetClass的值改为true(代理目标类)


(5)使用

ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");
UserDao user=applicationContext.getBean("userDaoProxy", UserDao.class);
user.addUser();

会自动增强方法。

基于代理类实现Spring AOP的更多相关文章

  1. Spring AOP(基于代理类的AOP实现)

    #基于代理类的AOP实现:step1: 1 package com.sjl.factorybean; /**切面类*/ import org.aopalliance.intercept.MethodI ...

  2. CgLib动态代理学习【Spring AOP基础之一】

    如果不了解JDK中proxy动态代理机制的可以先查看上篇文章的内容:Java动态代理学习[Spring AOP基础之一] 由于Java动态代理Proxy.newProxyInstance()的时候会发 ...

  3. Spring Aop(七)——基于XML配置的Spring Aop

    转发:https://www.iteye.com/blog/elim-2396043 7 基于XML配置的Spring AOP 基于XML配置的Spring AOP需要引入AOP配置的Schema,然 ...

  4. 基于 Annotation 拦截的 Spring AOP 权限验证方法

    基于 Annotation 拦截的 Spring AOP 权限验证方法 转自:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilte ...

  5. Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式

    Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式 主题 概念 Hibernate 延迟加载的代理模式 Spring AOP的代理模式 区别和联系 静态代理和动态代理 概念 代 ...

  6. Spring Aop(二)——基于Aspectj注解的Spring Aop简单实现

    转发地址:https://www.iteye.com/blog/elim-2394762 2 基于Aspectj注解的Spring Aop简单实现 Spring Aop是基于Aop框架Aspectj实 ...

  7. java代理课程测试 spring AOP代理简单测试

    jjava加强课程测试代码 反射. 代理 .泛型.beanUtils等 项目源码下载:http://download.csdn.net/detail/liangrui1988/6568169 热身运动 ...

  8. Java动态代理学习【Spring AOP基础之一】

    Spring AOP使用的其中一个底层技术就是Java的动态代理技术.Java的动态代理技术主要围绕两个类进行的 java.lang.reflect.InvocationHandler java.la ...

  9. 基于Aspectj 注解实现 spring AOP

    AOP 面向切面编程,是 OOP (面向对象编程)的补充 术语 横切关注点:方法中非主要业务逻辑部分 比如运算的模块:有验证参数.执行方法前的操作.执行方法.执行方法后的操作,验证参数.执行方法前后的 ...

随机推荐

  1. kotlin基础 条件控制 when

    When 表达式 when 将它的参数和所有的分支条件顺序比较,直到某个分支满足条件. when 既可以被当做表达式使用也可以被当做语句使用.如果它被当做表达式,符合条件的分支的值就是整个表达式的值, ...

  2. Spring Web Flux 相关概念

    Reactive Streams.Reactor 和 Web Flux 上面介绍了反应式编程的一些概念,以及 Reactor 和 Web Flux.可能读者看到这里有些乱.这里介绍一下三者的关系.其实 ...

  3. Java13新特性 -- 重新实现旧版套接字API

    全新实现的 NioSocketImpl 来替换JDK1.0的PlainSocketImpl. 它便于维护和调试,与 NewI/O (NIO) 使用相同的 JDK 内部结构,因此不需要使用系统本地代码. ...

  4. (.Net) NLog 记录日志功能

    https://codeload.github.com/NLog/NLog/zip/v4.6.6 https://nlog-project.org/?r=redirect Logger logger ...

  5. /bin/sh^M:解释器错误:没有那个文件或目录

    在win下编辑的时候,换行结尾是\n\r , 而在linux下 是\n,所以才会有 多出来的\rsed -i 's/\r$//' configure 删除configure脚本中的\r

  6. php的工厂模式

    特点 :将调用者和创建者分离,调用者直接向工厂类请求获取调用对象,减少代码耦合,提高系统的维护性和扩展性. <?php // **** 共同接口 **** // interface DB { f ...

  7. 通过下载git包来安装git

    Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.而国外的GitHub和国内的Coding都是项目的托管平台.但是在使用Git工具的时候,第一步要学会如何安装gi ...

  8. Oracle 实现表中id字段自增长

    Oracle 实现表中id字段自增长 最近正在学习Oracle的时候发现Oracle表中的字段不能像mysql中那样可以用auto increment修饰字段从而让id这种主键字段实现自增长. 那Or ...

  9. 【MongoDB学习之四】索引 聚合 备份与恢复 监控

    环境 MongoDB 4.0 CentOS 6.5_x64 一.索引语法ensureIndex()方法基本语法格式如下所示:>db.COLLECTION_NAME.ensureIndex({KE ...

  10. XML中的XPATH和DTD

    大家好,乐字节小乐又来了,上次给大家说道的是XML解析,这次接着讲述XML文档中的语言:XPATH.DTD 一.先来说说XPATH 1.XPATH 概念 XPath 是一门在 XML 文档中查找信息的 ...