1、被代理类接口Person.java

 package com.xiaostudy;

 /**
* @desc 被代理类接口
*
* @author xiaostudy
*
*/
public interface Person { public void add();
public void update();
public void delete();
}

2、被代理类PersonImple.java

 package com.xiaostudy;

 /**
* @desc 被代理类
*
* @author xiaostudy
*
*/
public class PersonImple implements Person { /**
* @desc 实现接口方法
*/
public void add() {
System.out.println("add()>>>>>>>>");
} @Override
public void update() {
System.out.println("update()>>>>>>>>");
} @Override
public void delete() {
System.out.println("delete()>>>>>>>>");
} }

3、切面类MyAdvice.java

 package com.xiaostudy;

 import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation; /**
* @desc 切面类
*
* @author xiaostudy
*
*/
public class MyAdvice implements MethodInterceptor { /**
* @desc 环绕通知
*/
@Override
public Object invoke(MethodInvocation method) throws Throwable {
System.out.println("日记开始>>>>>>>>>>>");
method.proceed();
System.out.println("日记结束<<<<<<<<<<<<");
return null;
} }

4、spring配置文件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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 创建被代理类 -->
<bean id="person" class="com.xiaostudy.PersonImple"></bean>
<!-- 创建切面类 -->
<bean id="advice" class="com.xiaostudy.MyAdvice"></bean>
<!-- 创建代理类 -->
<bean id="proxyPerson" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 把被代理类接口引入进来 -->
<property name="interfaces" value="com.xiaostudy.Person"></property>
<!-- 把被代理类引入进来 -->
<property name="target" ref="person"></property>
<!-- 把切面类引入进来,是以字符串形式引入,所以是用value,而不是用ref -->
<property name="interceptorNames" value="advice"></property>
<!-- 非必须项:value为true表示强制使用cglib代理 -->
<property name="optimize" value="true"></property>
</bean>
</beans>

5、测试类Test.java

 package com.xiaostudy;

 import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* @desc 测试类
*
* @author xiaostudy
*
*/
public class Test { public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = ac.getBean("proxyPerson", Person.class);
person.add();
person.update();
person.delete();
} }

spring半自动代理的更多相关文章

  1. AOP联盟通知类型和Spring编写代理半自动

    一.cglib功能更强大 二.Spring核心jar包 三.AOP联盟通知 三.代码实现Spring半自动代理 1.环绕通知的切面 2.bean.xml配置 3.创建bean容器,获取bean,即已经 ...

  2. Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误)

    Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误) 问题: 今天在用AfterReturningAdvice时,a ...

  3. jdk动态代理与cglib代理、spring aop代理实现原理

    原创声明:本博客来源与本人另一博客[http://blog.csdn.net/liaohaojian/article/details/63683317]原创作品,绝非他处摘取 代理(proxy)的定义 ...

  4. jdk动态代理与cglib代理、spring aop代理实现原理解析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  5. 何为代理?jdk动态代理与cglib代理、spring Aop代理原理浅析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  6. Spring 静态代理+JDK动态代理和CGLIB动态代理

    代理分为两种:静态代理 动态代理 静态代理:本质上会在硬盘上创建一个真正的物理类 动态代理:本质上是在内存中构建出一个类. 如果多个类需要进行方法增强,静态代理则需要创建多个物理类,占用磁盘空间.而动 ...

  7. java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总

    若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...

  8. jdk动态代理与cglib代理、spring Aop代理原理-代理使用浅析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  9. Spring动态代理的生成-如何判断是使用JDK动态代理还是CGlib代理

    前言 在上一篇文章中讲到了Spring是如何获取对应的Bean的增强,然后本次主要讲解一下Spring如何在获取到增强后创建Spring代理的. 在步入正题之前先给大家看一下Spring创建代理的大致 ...

随机推荐

  1. openvswitch总述

    前面用了两天时间了解了OpenvSwitch的结构,今天参考其他资料加自己的心得做个总结 一. openvswitch的安装和使用 在前一篇文章中详细的介绍了OpenvSwitch的安装和使用,不再赘 ...

  2. JZOJ.5280【NOIP2017模拟8.15】膜法师

    Description

  3. 【BZOJ4345】[POI2016]Korale 堆(模拟搜索)

    [BZOJ4345][POI2016]Korale Description 有n个带标号的珠子,第i个珠子的价值为a[i].现在你可以选择若干个珠子组成项链(也可以一个都不选),项链的价值为所有珠子的 ...

  4. 转载:Eslint 规则说明

    原文: http://blog.csdn.net/helpzp2008/article/details/51507428 ,//禁止使用alert confirm prompt ,//禁止使用数组构造 ...

  5. 用express创建网站出现"$ DEBUG=microbog ./bin/www"的提示

    第一次用express框架创建网站,指令为:“express -t ejs microblog”,如下图 指令运行完成后,出现如图框中的提示,不知道什么意思,运行:“node app.js”来启动服务 ...

  6. JDK源码分析之concurrent包(三) -- Future方式的实现

    上一篇我们基于JDK的源码对线程池ThreadPoolExecutor的实现做了分析,本篇来对Executor框架中另一种典型用法Future方式做源码解读.我们知道Future方式实现了带有返回值的 ...

  7. 基于GTID的主从架构异常处理流程

    通常情况下我们主库的binlog只保留7天,如果从库故障超过7天以上的数据没有同步的话,那么主从架构就会异常,需要重新搭建主从架构. 本文就简单说明下如何通过mysqldump主库的数据恢复从库的主从 ...

  8. img标签使用onload进行src更改时出现的内存溢出问题

    最近在开发时需要在img标签加载完成后修改src属性,使用了onload方法. 但是在方法体中最后没有把onload事件指向null, 导致了循环调用onload方法,CPU占用一直居高不下,最后只要 ...

  9. Linux定时器 使用

    1.alarm alarm()执行后,进程将继续执行,在后期(alarm以后)的执行过程中将会在seconds秒后收到信号SIGALRM并执行其处理函数. #include <stdio.h&g ...

  10. python16_day09【Select多路复用】

    一.select多路复用 句柄列表11, 句柄列表22, 句柄列表33 = select.select(句柄序列1, 句柄序列2, 句柄序列3, 超时时间) 参数: 可接受四个参数(前三个必须) 返回 ...