`

使用动态代理面向切面编程(AOP)

 
阅读更多

模型类

User.java

package com.test.model;

public class User {
	private String username;
	private String password;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}

 

接口

UserDAO.java

package com.test.dao;

import com.test.model.User;

public interface UserDAO {
	public void save(User user);
}

 

实现接口类

UserDAOImpl.java

 

package com.test.dao.impl;

import com.test.dao.UserDAO;
import com.test.model.User;

public class UserDAOImpl implements UserDAO {
	public void save(User user) {
		System.out.println("user saved!");
	}
}

 

拦截器

MyInterceptor.java

package com.test.interceptor;

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

public class MyInterceptor implements InvocationHandler {
	// 被代理对象
	private Object target;

	public Object getTarget() {
		return target;
	}

	public void setTarget(Object target) {
		this.target = target;
	}

	public void beforeMethod(Method m) {
		System.out.println(m.getName() + " start!");
	}

	@Override
	public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
		beforeMethod(m);
		// m方法被"被代理对象"调用
		m.invoke(target, args);
		
		return null;
	}

}

 

Junit测试类

UserServiceTest.java

package com.test.service;

import java.lang.reflect.Proxy;

import org.junit.Test;

import com.test.dao.UserDAO;
import com.test.dao.impl.UserDAOImpl;
import com.test.interceptor.MyInterceptor;
import com.test.model.User;

public class UserServiceTest {

	@Test
	public void testProxy() {
		// 创建被代理对象
		UserDAO userDAO = new UserDAOImpl();
		// 创建拦截器对象
		MyInterceptor myInterceptor = new MyInterceptor();
		// 设置被代理对象
		myInterceptor.setTarget(userDAO);
		// 产生代理对象
		// 第一个参数:用哪个ClassLoader来产生代理对象
		// 第二个参数:产生的代理对象实现了哪些接口,这里也可以用userDAO.getClass().getInterfaces()
		// 第三个参数:当产生这个代理对象后,调用它里面的方法时,用哪个Handler进行处理
		UserDAO userDAOProxy = (UserDAO) Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), new Class[] { UserDAO.class }, myInterceptor);
		System.out.println(userDAOProxy.getClass().getName());//打印的值:$Proxy4,说明它是一个代理对象
		userDAOProxy.save(new User());
	}
}

 

执行测试方法后,打印:

$Proxy4

save start!

user saved!

 

分享到:
评论

相关推荐

    spring使用动态代理面向切面编程(AOP) xml

    在Spring框架中,面向切面编程(AOP)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。本篇文章将深入探讨如何使用Spring的动态代理机制实现AOP...

    面向切面编程aop简介

    面向切面编程(AOP,Aspect Oriented Programming)是Spring框架的重要组成部分,它提供了一种在不修改原有业务代码的基础上,插入额外功能的编程模型。Spring AOP使得开发者能够更方便地实现如日志记录、事务管理、...

    Spring面向切面编程AOP

    面向切面编程(AOP,Aspect Oriented Programming)是Spring框架中的一个重要特性,它提供了一种模块化和声明式的方式来处理程序中的横切关注点,如日志、事务管理、安全控制等。AOP的核心概念包括切面、通知、连接...

    spring使用动态代理面向切面编程(AOP) annotation

    在Spring框架中,面向切面编程(AOP)是一种强大的设计模式,它允许开发者将关注点从业务逻辑中分离出来,比如日志记录、事务管理、性能监控等。本篇文章将深入探讨如何利用Spring的注解来实现AOP,以及其背后的动态...

    面向切面编程

    ### 面向切面编程(AOP) 面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,它旨在提高模块化程度,通过将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,使得代码更加清晰、...

    Spring-aop面向切面编程实例

    面向切面编程(Aspect-Oriented Programming,AOP)是Spring框架的核心特性之一,它提供了一种优雅的方式来处理系统的横切关注点,如日志、事务管理、性能监控和权限控制等。在Spring中,AOP主要通过代理模式实现,...

    AOP_使用spring框架进行面向切面编程

    面向切面编程(AOP)是一种编程范式,它旨在减少代码中的重复部分,特别是那些与核心业务逻辑无关但又必须处理的交叉关注点,如日志、事务管理、安全控制等。Spring框架是Java领域中实现AOP的常用工具,它通过提供...

    AOP面向切面编程.ppt

    AOP面向切面编程.ppt

    面向切面 aop

    面向切面编程(AOP,Aspect Oriented Programming)是一种编程范式,旨在将系统中的关注点分离,使得代码更加模块化,易于维护和扩展。在传统的面向对象编程(OOP)中,业务逻辑往往与日志、事务管理、权限控制等横...

    AOP面向切面编程总结

    ### AOP面向切面编程详解 #### 一、AOP概览 AOP(Aspect-Oriented Programming,面向切面编程)是一种编程思想和技术,它作为OOP(面向对象编程)的一种补充,主要解决了OOP在处理横切关注点方面的不足。在传统的...

    Chapter 6_ 使用Spring进行面向切面编程(AOP)

    面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。 除了类(classes)以外,AOP提供了 切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理。

    aop 面向切面编程 demo

    面向切面编程(AOP)是一种编程范式,它旨在将关注点分离,使得系统中的核心业务逻辑与系统服务(如日志、事务管理、权限控制等)可以解耦...实践AOP需要对面向切面编程的概念有清晰的理解,同时熟悉所选库的使用方式。

    .net AOP 面向切面编程很好的例子

    spect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题。AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的...

    AOP面向切面编程实例

    面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,它旨在提高软件的模块化程度,通过将关注点分离到不同的“切面”中来实现。在.NET环境中,AOP通常通过拦截器(Interceptor)或动态代理...

    面向切面编程 动态代理的经典例子

    面向切面编程(AOP,Aspect Oriented Programming)是一种编程范式,旨在将关注点分离,使得业务逻辑和系统服务(如日志、事务管理、权限控制等)能够解耦。这种编程方式允许程序员定义“切面”,这些切面封装了特定...

    Spring AOP面向切面三种实现

    在IT行业中,Spring框架是Java企业级应用开发的首选,其强大的功能之一就是AOP(面向切面编程)。本文将详细解析Spring AOP的三种实现方式,帮助你深入理解这一重要概念。 首先,理解AOP的基本概念至关重要。AOP是...

    Spring 动态代理和aop切面编程例子

    在Spring框架中,动态代理和AOP(面向切面编程)是两个重要的概念,它们极大地增强了代码的可维护性和灵活性。下面将详细讲解这两个概念及其实际应用。 动态代理,是Spring提供的一种机制,允许我们在不修改原对象...

    基于框架的Web开发-面向切面编程AOP入门.doc

    总的来说,面向切面编程AOP是一种强大的工具,用于管理横切关注点,它使我们能够编写更加模块化、可重用的代码,特别是在大型企业级应用中,如Web开发,它可以极大地提升代码质量和开发效率。通过合理使用AOP,我们...

    面向切面(AOP)

    面向切面编程(AOP,Aspect-Oriented Programming)是一种编程思想和技术,它允许开发者将横切关注点(cross-cutting concerns)从业务逻辑中分离出来。本文将深入解析AOP的基本概念及其在JavaEE环境下的实现原理。 ...

Global site tag (gtag.js) - Google Analytics