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进行登录,并且获取登录用时

贴代码

最新文章

  1. for循环每次取出一个字符(不是字节)
  2. React版本修改内容
  3. makefile学习小结
  4. PHP数据过滤
  5. iOS_动态插入或删除行
  6. Problem : 1202 ( The calculation of GPA )
  7. 看到一个对CAP简单的解释
  8. 小强的HTML5移动开发之路(4)——CSS2和CSS3
  9. SSM-MyBatis-03:Mybatis中简单的整合日志
  10. Touch Gesture手势总结
  11. 使用Nginx实现服务器反向代理和负载均衡
  12. 深入理解JVM(6)——JVM性能调优实战
  13. jqeury-地区三级联动
  14. python自动化开发-8
  15. 【ZZ】堆和堆的应用:堆排序和优先队列
  16. Redis实战(八)Redis的配置文件介绍
  17. iOS8 自定义navigationItem.titleView
  18. rabbitmq web管理界面 用户管理
  19. Android Log.isLoggable方法异常:exceeds limit of 23 characters
  20. Python学习之k-近邻实例

热门文章

  1. Quartz集群原理及配置应用
  2. Hadoop集群管理之内存管理
  3. JavaScript的一些基本语句代码如下!!!!
  4. asp.net中调用javascript自定义函数的方法(包括引入JavaScript文件)总结
  5. ACM题目————已知前序和中序求后序
  6. protoful进行序列化
  7. 【转】MYSQL入门学习之三:全文本搜索
  8. [团队项目]----Math Calculator
  9. 我的CSS样式记事本(1)
  10. HTML,javaScript,DOM详解