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. tr DEMO

    测试数据: [weblogic@etp-mall-dev7][/tmp]$ cat msn.txt aaa bbb bbb ccc ccc ddd bbb eee aaa ccc bbb sss 转换 ...

  2. BZOJ 1036:树的统计Count(树链剖分)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1036 题意:中文题意. 思路:也是普通的树链剖分.唯一注意的点是在change函数中 while(t ...

  3. 加载 pcntl 多进程

    加载 pcntl 有两种方式 一种重新编译安装,在编译时加 --enable-pcntl ./configure --prefix=/usr/local/php --with-mysql=/usr/l ...

  4. Python 中translate()与replace()区别

    translate函数和replace函数一样,用于替换字符串中的某个部分,但是和replace不同,translate只处理单个字符,而且可以同时进行多个替换.在使用translate函数转换之前, ...

  5. 只使用处理I/O的PrintDigit函数,编写一个过程以输出任意实数

    #include <stdio.h> #include <stdlib.h> #include <math.h> int printDigit(int a) { p ...

  6. 20150629_Andriod_06_插入_删除_弹出式操作数据

    Fr_06_view_s6 --> activity_f6_insert              --> activity_f7__delete ******************** ...

  7. 20150601_Andriod 打开新窗体

    <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="htt ...

  8. poj3342 Party at Hali-Bula

    树形dp题,状态转移方程应该很好推,但一定要细心. http://poj.org/problem?id=3342 #include <cstdio> #include <cstrin ...

  9. 【20160924】GOCVHelper综述

    GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的 ...

  10. php基础复习(一)smarty模板

    一.基本配置第一步:下载smarty:官网www.smarty.net第二步:加载类文件和更改配置 1. //加载类文件 require_once '../libs/Smarty.class.php' ...