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. 170303、PHP微信公众平台开发接口 SDK完整版

    <?php /* 方倍工作室 http://www.fangbei.org/ CopyRight 2015 All Rights Reserved */ define("TOKEN&q ...

  2. python之MongoDB学习

    import pymongo as pm # 获取连接 client = pm.MongoClient('localhost', 27017) # 端口号是数值型 # 连接数据库 db = clien ...

  3. document.cookie = 'wcookie_date=' + wv + ';max-age=60'

    js cookie生命周期

  4. AttachThreadInput

    BOOL WINAPI AttachThreadInput( _In_  DWORD idAttach, _In_  DWORD idAttachTo, _In_  BOOL fAttach ); i ...

  5. 关于增强for循环和普通for循环是否需要判断为null的情况

    1.增强for循环: public static void main(String[] args) { List<Object> list = null; for(Object s : l ...

  6. rest_framake之视图

    开始,先放大招 一  最原始的写法 前戏之序列化 class AuthorSerializer(serializers.ModelSerializer): class Meta: model = mo ...

  7. python多线程的两种写法

    1.一般多线程 import threading def func(arg): # 获取当前执行该函数的线程的对象 t = threading.current_thread() # 根据当前线程对象获 ...

  8. LRU经典算法的原理与实现

    LRU  least recently used.顾名思义,是根据数据的活跃度进行更新的缓存算法. LRU Cache的LinkedHashMap实现: LinkedHashMap自身已经实现了顺序存 ...

  9. 010-shiro与spring web项目整合【四】缓存Ehcache

    一.Ehcache shiro每次授权都会通过realm获取权限信息,为了提高访问速度需要添加缓存,第一次从realm中读取权限数据,之后不再读取,这里Shiro和Ehcache整合. 1.添加Ehc ...

  10. 经典排序算法的总结及其Python实现

    经典排序算法总结: 结论: 排序算法无绝对优劣之分. 不稳定的排序算法有:选择排序.希尔排序.快速排序.堆排序(口诀:“快速.选择.希尔.堆”).其他排序算法均为稳定的排序算法. 第一趟排序后就能确定 ...