`
xieyan30
  • 浏览: 49093 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

spring AOP (5) 基础知识-java动态代理

 
阅读更多

在「spring AOP (4) 基础知识-代理」中给大家讲解了什么是代理,有什么弊端。

java的动态代理比代理的思想更前进了一步。

首先我们要创建一个代理类,它必须实现java.lang.reflect.InvocationHandler接口。

DynamicProxyHandler:

 

package spring3.aop.aop3;

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

public class DynamicProxyHandler implements InvocationHandler {

	// 目标对象
	private Object proxied;

	public DynamicProxyHandler(Object proxied) {
		this.proxied = proxied;
	}

	/**
	 * invoke.
	 * 
	 * @param proxy    (最终生成的)代理实例,不是目标对象(一般情况下不会用到)
	 * @param method   要调用的方法
	 * @param args     要调用方法的参数
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("----START----");
		// method.invoke是java反射的知识
		Object obj = method.invoke(proxied, args);
		System.out.println("----END----");
		return obj;
	}

}

 接口Interface1

 

 

package spring3.aop.aop3;

public interface Interface1 {

	public void do1();

	public void do2(String str);

}

  接口Interface2

 

 

package spring3.aop.aop3;

public interface Interface2 {

	public void exe1();

	public void exe2(String str);

}

 目标对象类,Target实现了两个接口Interface1, Interface2

 

 

package spring3.aop.aop3;

public class Target implements Interface1, Interface2 {

	@Override
	public void do1() {
		System.out.println("Target.do1()");
	}

	@Override
	public void do2(String str) {
		System.out.println("Target.do2(" + str + ")");
	}

	@Override
	public void exe1() {
		System.out.println("Target.exe1()");
	}

	@Override
	public void exe2(String str) {
		System.out.println("Target.exe2(" + str + ")");
	}

}

 基本的组件我们创建完成了,看看如何利用这些组件:

 

 

package spring3.aop.aop3;

import java.lang.reflect.Proxy;

public class ProxyMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		Object obj = Proxy.newProxyInstance(Interface1.class.getClassLoader(),
				new Class<?>[] { Interface1.class, Interface2.class },
				new DynamicProxyHandler(new Target()));

		Interface1 if1 = (Interface1) obj;
		if1.do1();
		if1.do2("test");
		Interface2 if2 = (Interface2) obj;
		if2.exe1();
		if2.exe2("test");
	}
}

 运行结果:

 

 

----START----
Target.do1()
----END----
----START----
Target.do2(test)
----END----
----START----
Target.exe1()
----END----
----START----
Target.exe2(test)
----END----

 以上就是java的动态代理,现在我来讲解下测试累的main方法

 

在main中

通过静态方法Proxy.newProxyInstance()来创建动态的代理。

这个方法需要三个参数:

①类加载器:可以通过已加载对象,获得类加载器。例如:Interface1.class.getClassLoader()

②希望被代理的接口列表,是个Class数组。例如:new Class<?>[] { Interface1.class, Interface2.class }

③java.lang.reflect.InvocationHandler接口的一个实现类。

 

动态代理就是将所有调用重定向到调用处理器(DynamicProxyHandler),一般会向调用处理器传递一个目标对象(例如:DynamicProxyHandler的构造函数public DynamicProxyHandler(Object proxied)),调用器在在执行中介任务时,将请求转发给目标对象。

0
0
分享到:
评论

相关推荐

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    了解这些基础知识可以帮助我们更好地掌握 Spring AOP 的实现细节。在分析源码时,可以参考作者的源码注释和相关文章,以便更深入地理解每一步操作。 总的来说,Spring AOP 通过动态代理技术实现了切面的插入,使得...

    spring aop的jar包

    8. **org.springframework.asm-3.0.5.RELEASE.jar**:这个库提供了对Java字节码的读取、修改和生成的功能,Spring AOP在动态代理过程中可能会用到。 9. **aopalliance-1.0.jar**:AOP Alliance是AOP框架间的一个互...

    springAOP配置动态代理实现

    一、Spring AOP基础知识 1. **什么是AOP**:AOP是一种编程范式,用于处理系统中的横切关注点,即那些跨越多个类或方法的共同功能,如事务管理、日志记录等。AOP通过切面(Aspect)将这些关注点与业务逻辑分离,提高...

    spring-aop.rar_java aop_spring aop

    【标题】"spring-aop.rar_java aop_spring aop" 涉及的主要知识点是Spring框架中的面向切面编程(AOP)以及Java基础知识。这个压缩包可能包含了一个简单的Spring AOP应用示例,同时也涵盖了Java的一些核心概念,如...

    模拟spring aop【一】基于jdk动态代理实现的aop

    本篇文章将探讨如何通过JDK动态代理实现Spring AOP的基础知识。 首先,我们要理解什么是JDK动态代理。在Java中,动态代理机制允许我们在运行时创建一个实现了特定接口的新类。这个新类的实例可以代理目标对象,执行...

    spring AOP 引入jar包,spring IOC 引入Jar包

    5. **代理(Proxy)**:Spring AOP 使用动态代理技术创建对象,有两种代理方式:JDK 动态代理和 CGLIB 代理。前者适用于接口实现类,后者适用于没有接口的类。 6. **注解使用**:如 @Aspect、@Before、@After、@...

    spring 4.* 缺少jar spring-cglib-repack-3.2.5.jar_spring-objenesis-repack-2.6.jar

    在Spring框架4.*版本中,可能会遇到一个常见问题,即缺少`spring-cglib-repack-3.2.5.jar`和`spring-objenesis-repack-2.6.jar`这两个jar...了解这些基础知识对于理解和优化Spring应用的性能、处理相关问题都非常重要。

    spring aop所需jar包

    - **代理模式**:Spring支持两种代理,JDK动态代理和CGLIB代理。JDK代理适用于实现了接口的类,而CGLIB代理则用于没有实现接口的类。 - **注解驱动的AOP**:通过在类或方法上使用特定的注解(如`@Aspect`, `@...

    spring AOP入门教程

    本教程将带你了解Spring AOP的基础知识,帮助你入门这一强大技术。 ### 一、什么是AOP AOP是一种编程范式,旨在解决程序中的横切关注点问题,这些关注点通常与业务逻辑无关,但又需要在多个地方被调用,如日志记录...

    初探spring aop内部实现 java

    对于接口,Spring使用Java动态代理(JDK Proxy)创建代理对象;而对于类,Spring则使用CGLIB库生成子类代理。这两种方式都是在运行时生成代理对象,从而在方法调用前后插入切面逻辑。 接下来,我们转向DataSource的...

    代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)与SpringAOP的3种配置方式案例工程代码

    本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...

    Spring-AOP .pptx

    - **Spring AOP**:基于纯Java实现,运行时通过动态代理进行织入,使用JDK或CGLib动态代理。 4. **基础知识** - Spring AOP通过动态代理技术在运行时织入增强代码,采用JDK动态代理或CGLib动态代理两种机制。 - ...

    Spring之使用AOP缘由(5-回顾)

    了解了这些基础知识,我们可以通过以下几个步骤在Spring中使用AOP: 1. 定义切面:创建一个类,并使用`@Aspect`注解标记为切面。 2. 定义切点:在切面类中,使用`@Pointcut`定义切点表达式。 3. 编写通知:使用`@...

    spring aop简单应用示例

    本示例将深入探讨Spring AOP的基础知识,以及如何在实际应用中使用它。 首先,我们来看"LogProfilter.java",这很可能是实现一个日志拦截器的类。在Spring AOP中,这样的类通常被称为切面(Aspect)。切面是封装了...

    spring-aop.pdf 源码电子书

    - `AspectException.java`定义了一个异常类,用于表示所有的AOP基础架构异常。从类的继承结构来看,`AspectException`是运行时异常(RuntimeException),代表这类异常是不检查的(unchecked)。它们通常被认为是...

    SpringAOP简单项目实现

    总结,这个"SpringAOP简单项目实现"涵盖了Spring AOP的基础知识,包括切面、通知、切入点的定义与配置,以及如何在实际项目中使用Maven进行构建和依赖管理。对于初学者来说,这是一个很好的实践案例,能够帮助他们...

    Spring AOP源码笔记

    Spring AOP基础** - **切⾯编程**: AOP允许开发者将横切关注点(如日志、事务、安全性等)定义为独立的模块,称为切面。切面可以包含通知(advice)、切入点(pointcut)和其他元数据。 - **通知(Advice)**: 通知...

    程序员编程指南 - Java、Spring、SpringBoot等等基础-进阶-源码知识点 & 面试宝典 - 建议使用Obsi

    基础知识涉及Spring的核心概念,如Bean管理、XML与注解配置、IoC容器。进阶部分将涵盖Spring MVC、数据访问(如JdbcTemplate和Hibernate集成)、事务管理、Spring Boot的自动配置等。源码分析可以帮助你理解Spring的...

    spring aop实例

    **一、Spring AOP基础知识** 1. **切面(Aspect)**:切面是跨越多个对象的行为或关注点的模块化。在Spring AOP中,切面由通知(advises)和切点(pointcuts)定义。 2. **通知(Advice)**:通知是在特定连接点上...

    spring_aop1.rar_java aop_spring mvc 例子

    6. **Spring MVC基础知识**:虽然主要讲解AOP,但实例可能也会涵盖Spring MVC的基础,如DispatcherServlet、ModelAndView、@RequestMapping等。 7. **运行和测试**:实例可能包括如何配置和启动Spring项目,以及...

Global site tag (gtag.js) - Google Analytics