Spring Aop (jdk动态代理和cglib代理)

Aop 的概念

aop即面向切面编程,一般解决具有横切面性质的体统(事务,缓存,安全)

JDK动态代理:

可以使用实现proxy 类,实现jdk的动态代理

步骤

1.创建目标接口

 package com;

 public interface IPerson {

     public void print();
}

2.实现目标接口

package com;

public class Person implements IPerson {

    private String name;

    public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Person() {
super();
} public Person(String name) {
super();
this.name = name;
} @Override
public void print() {
System.out.println("Person.print()");
} }

3.创建代理工厂类

1.实现实现 invcationHandler 接口

2,申明一个对象作为代理的属性

3.申明一个createObject方法 返回一个代理对象 (Proxy.newProxyInstance("获得属性对象的类加载",“获得属性对象的接口结合”,this 当前对象));

4.invoke方法,对此对象进行处理 参数(Proxy ,method,Object o)注:Proxy代理对象,method 对象的方法,Object 为对象的参数列表

 package com;

 import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class Proxys implements InvocationHandler{ private Object p;
public Object createObject(Object p){
this.p=p;
return Proxy.newProxyInstance(p.getClass().getClassLoader(), p.getClass().getInterfaces(), this);
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Person person=(Person)p;
Object obj=null;
if(person.getName()!=null){
System.out.println(person.getName());
obj=method.invoke(p, args);
}else{
System.out.println("名字为空,被拦截");
}
return obj;
} }

一个简单的

public interface OtherBean{

  void f1();

}

public class OtherBeanService implements OtherBean{

  private Object obj;

  public OtherBeanService(Object obj){

    this.obj=obj;

  }

  public Object invoke(Proxy proxy,Method method,Object args){

    System.out.println("代理方法");

    method.invoke(obj,args)

    return null;

  }

}

public class Test{

  public static void main(String args[]){

    

    OtherBean otherBean=new OtherBeanService();

    ProxyUser proxyUser=new ProxyUser(otherBean);

    OtherBean ob=(OtherBean)Proxy.newProxyInsance(otherbean.getClass.getClassLoader,otherBean.getClass.Interfaces,proxyUser);

    ob.print();

  }

}

利用CGLIB实现AOP功能

此方式不用有接口,导入jar包

1.先导入这两个jar 包

asm-3.3.1.jar
cglib-2.2.2.jar

2.写业务类

public class Student{

  private String name;

  public Student(String name){

    this.name=name; 

  }

  public void print(){

    System.out.println("print");

  }

}

//

public gig implement MethodIntercepter{

  private Object obj;

  public gig(Object obj){

    this.obj=obj;

  }

  

  public Object intercept(Method method,Object [] obj,object args){//具体参数不记得了

    System.out.println("代理方法!")

  }

}

然后测试:省略!

spring 的aop进行登录,并且获取登录用时

贴代码

SpringAop学习的更多相关文章

  1. spring-aop学习

     SpringAOP学习 author:luojie 1.  AOP中的基本概念 AOP的通用术语,并非spring java所特有.很遗憾AOP的术语不是特别的直观.但如果让Spring java来 ...

  2. springAOP学习笔记

    目录 基础 引用 AOP方法 使用 xml配置 注解配置 基础 什么是aop? 把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的 基础上,对我们的已有方法进行增强. ...

  3. spring-aop学习【基于注解】

    我个人觉得,这个好像就是用在定制日志输出上,和log4j很像. 用途: 如果业务方法调用每一步都需要详细的日志,那就用这个吧 好处就是: 方便维护,只包含业务代码 下面开始说明: 所需要的jar包: ...

  4. SpringAOP学习第一天 @Pointcut注解

    自从上班之后,就很少再看AOP相关的内容,几年时间里虽然也有一两次完整看过,一直没有机会用到,都忘记了.今天重温一下 TestNG测试类 package com.test.spring.aop.min ...

  5. SpringAOP学习之5种通知

    一.Spring的AOP分为以下5种类型通知 ①前置通知(Before):在连接点执行前执行该通知 ②正常返回通知(AfterReturning):在连接点正常执行完后执行该通知,若目标方法执行异常则 ...

  6. Spring学习笔记四:SpringAOP的使用

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6776247.html  一:AOP基础概念 (1)通知(增强)Advice 通知,其实就是我们从众多类中提取出 ...

  7. spring框架学习笔记5:SpringAOP示例

    1.导包: 导入spring中的这两个包 再导入其他包(网上下载): 2.准备目标对象: package service; public class UserServiceImpl implement ...

  8. SpringAOP深入学习

    ----------------------Spring AOP介绍------------------ 1.编程范式概念 面向过程编程:C 面向对象编程:c++,Java 函数式编程 事件驱动编程: ...

  9. spring源码学习之:springAOP实现底层原理

    一:springAOP底层实现是基于动态代理实现的.增强和切面,以及通知.是在动态代理生成的代理类inoke方法中调用实现 //+++++++++++++aop动态代理++++++++++++++++ ...

随机推荐

  1. 骑士cms(74cms)个人版 整合UC

    1.安装74cms完成后登录总后台在菜单条工具选项中添加uc整合菜单. 在admin/templates/sys/admin_left_tools.htm这个文件中添加 <li >< ...

  2. Ecshop后台订单列表增加”商品名”检索字段

    近期ecshop网站做活动,统计商品订单量的时候没有按商品名搜索的选项,只能手动查询.这样效率很低下,而且容易出错. 现在为列表增加一个简单的“按商品名搜索”表单项.效果如下图 涉及到2个文件,分别是 ...

  3. YTU 3006: 迷宫问题(栈与队列)

    3006: 迷宫问题(栈与队列) 时间限制: 1 Sec  内存限制: 128 MB 提交: 3  解决: 1 题目描述 编写一个求解迷宫问题的程序,要求输出迷宫的所有路径,并求最短路径长度及最短路径 ...

  4. YTU 2974: C语言习题5.26--文件操作3

    2974: C语言习题5.26--文件操作3 时间限制: 1 Sec  内存限制: 128 MB 提交: 213  解决: 92 题目描述 文本文件score.dic 中存储了n名学生的信息(班级编号 ...

  5. js格式化日期 年月日

    /**                     * 格式化日期                     * @param value                     * @param row  ...

  6. 周赛-Equidistant String 分类: 比赛 2015-08-08 15:44 6人阅读 评论(0) 收藏

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  7. 哈夫曼树-Fence Repair 分类: 树 POJ 2015-08-05 21:25 2人阅读 评论(0) 收藏

    Fence Repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 32424 Accepted: 10417 Descri ...

  8. 实现LUT

    //实现LUT 查找表 #include "stdafx.h" #include <iostream> #include <opencv2/opencv.hpp& ...

  9. ubuntu查看内存占用和查看cpu使用情况的简单方法(ubuntu内存管理)

    单独查看内存使用情况的命令:free -m查看内存及cpu使用情况的命令:top也可以安装htop工具,这样更直观,安装命令如下:sudo apt-get install htop安装完后,直接输入命 ...

  10. C#之猴子吃桃儿问题的解法——猴子吐桃儿

    猴子第一天摘了许多个桃子,先吃了所有桃子的一半,后又吃了一个:第二天又吃了剩下桃子的一半,后又吃了一个……第十天,剩1个桃子.问:猴子第一天摘了多少个桃子? 首先对“猴子吃桃”的过程进行正向推导,设: ...