SSM-Spring-09:Spring中jdk动态代理

简介:   ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------     JDK动态代理:   为何叫JDK动态代理呢?     所谓JDK,jdk是java开发工具包,它里面包含了一个动态代理的api     代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。

 

 

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

 

 

JDK动态代理:

  为何叫JDK动态代理呢?

    所谓JDK,jdk是java开发工具包,它里面包含了一个动态代理的api

    代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

    何为动态?相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象。

  下面我拿例子带入,具体的动态代理案例如下:

    首先按平时的方式来写,一个接口,一个实现它的类

      ISomeService接口

package cn.dawn.day09jdkdtproxy;

/**
 * Created by Dawn on 2018/3/8.
 */
public interface ISomeService {
    public void doSome();
}

 

      SomeServiceImpl类,实现ISomeService接口

 

package cn.dawn.day09jdkdtproxy;

/**
 * Created by Dawn on 2018/3/8.
 */
public class SomeServiceImpl implements ISomeService {
    public void doSome() {
        System.out.println("do something");
    }
}

 

      测试类,用动态代理的形式,对方法进行增强操作

 

package cn.dawn.day09jdkdtproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created by Dawn on 2018/3/8.
 */
public class Test {
    public static void main(String[] args) {
        /*匿名内部类要想得到外面的值,需要把外面的值改为常量*/
        final ISomeService service=new SomeServiceImpl();
        /*用动态代理的方式生成ISomeService的对象,就是增强后的对象,可以看看newProxyInstance的方法参数,就有方法去写了*/
        /*InvocationHandler是由代理实例的调用处理程序实现的接口。*/
        ISomeService proxy=(ISomeService)Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), new InvocationHandler() {
            /**
             *invoke:每个代理实例都有一个关联的调用处理程序。当在代理实例上调用方法时,方法调用将被编码并分派给invoke 其调用处理程序的方法。
             * @param proxy     代理对象,没啥用
             * @param method        反射获取的方法
             * @param args          方法的参数
             * @return
             * @throws Throwable
             */
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("before===================");
                method.invoke(service,args);//相当于执行目标类型的方法
                return null;
            }
        });
        proxy.doSome();
    }
}

 

      值得一提的是:Proxy是java.lang.reflect包下,正因如此,才叫JDK动态代理

目录
相关文章
|
1月前
ssm(Spring+Spring mvc+mybatis)——updateDept.jsp
ssm(Spring+Spring mvc+mybatis)——updateDept.jsp
10 0
|
1月前
ssm(Spring+Spring mvc+mybatis)——showDept.jsp
ssm(Spring+Spring mvc+mybatis)——showDept.jsp
9 0
|
1月前
|
监控 Java 开发者
Spring AOP动态代理
Spring AOP动态代理
43 1
|
11天前
|
监控 Java 数据库连接
Spring高手之路17——动态代理的艺术与实践
本文深入分析了JDK和CGLIB两种动态代理技术在Spring框架中的应用。讨论了动态代理的基础概念,通过实例展示了如何实现和应用这两种方法,并比较了它们的性能差异及适用场景。进一步,探讨了在动态代理中实现熔断限流和日志监控的策略,以及如何利用动态代理优化Spring应用的设计和功能。
26 6
Spring高手之路17——动态代理的艺术与实践
|
12天前
|
Java 数据库 Spring
切面编程的艺术:Spring动态代理解析与实战
切面编程的艺术:Spring动态代理解析与实战
25 0
切面编程的艺术:Spring动态代理解析与实战
|
27天前
|
Java 程序员 API
浅谈JDK动态代理
浅谈JDK动态代理
31 1
|
1月前
ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl
ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl
12 0
|
1月前
ssm(Spring+Spring mvc+mybatis)Dao接口——IDeptDao
ssm(Spring+Spring mvc+mybatis)Dao接口——IDeptDao
8 0
|
1月前
ssm(Spring+Spring mvc+mybatis)实体类——Dept
ssm(Spring+Spring mvc+mybatis)实体类——Dept
11 0
|
1月前
|
Java 关系型数据库 MySQL
ssm(Spring+Spring mvc+mybatis)
ssm(Spring+Spring mvc+mybatis)
13 0