`

Spring中AOP的模拟实现

阅读更多

什么是AOP?
面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面
1.面向切面编程提供声明式事务管理
2.spring支持用户自定义的切面

面向切面编程(aop)是对面向对象编程(oop)的补充,
面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,
是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。

aop框架具有的两个特征:
1.各个步骤之间的良好隔离性
2.源代码无关性

前提:要实现AOP的模拟就要知道动态代理,Spring中使用了两种动态代理方式,一种是基于JDK的动态代理,一种是基于CGlib的动态代理。为什么会有两种,那是因为JDK的动态代理只能是针对接口。

 

先看下面的代码dao层
package com.lbx.dao;

import com.lbx.model.User;

public interface UserDAO {
	public void save(User user);
	//public void delete();
}
 dao实现层
package com.lbx.dao.impl;

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

public class UserDAOImpl implements UserDAO {

	@Override
	public void save(User user) {
		
		System.out.println("a user saved!!!");

	}
	
	/*public void delete(){
		System.out.println("UserDAOImpl.delete()");
	}
*/
}
 现在我们要在User的save之前和之后做一些处理(拦截器),我们先看一种最简单的方法(在类中加代码)
package com.lbx.dao.impl;

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

public class UserDAOImpl1 implements UserDAO {

	@Override
	public void save(User user) {
		
		System.out.println("method start....");
		
		System.out.println("a user saved!!!");
		
		System.out.println("method stoped...");

	}

}
 显然,这是可以的,但是这样明显就不好,第一代码没可重用性,第二这是在知道源码的情况下,现实中我们有很多情况都不知道源码,在这种情况下,明显这方式就不行了。下面就是第二种解决方案:
package com.lbx.dao.impl;

import com.lbx.model.User;

public class UserDAOImpl2 extends UserDAOImpl{

	public void save(User user) {
		
		System.out.println("method start....");
		super.save(user);
		System.out.println("method stoped.....");
		
	}

}
 先让一个类实现了那个接口,然后要用的类继承那个实现类,这样也可以达到目的(其实这就是一种“组合模式”),这种方式在一定的程度上是利用的资源,代码的重用性。但是还是不好,当我们要做很多的处理的时候,这样我们就要组合和多的类,明显就不好。下面是第三种:使用动态代理。                       先看处理方法(拦截器)
package com.lbx.interceptor;

public class UserInterceptor {

	//第一个拦截方法
	public void method1(){
		System.out.println("UserInterceptor.method1()");
	}
	
	//第二个拦截方法
	public void method2(){
		System.out.println("UserInterceptor.method2()");
	}
	
}
 产生代理的类,实现InvocationHandler接口
package com.lbx.interceptor;

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

public class ProxyHandler implements InvocationHandler {
	
	//创建需要代理的目标对象
	private Object targer;
	//创建拦截器的实例
	UserInterceptor u = new UserInterceptor();
	
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result = null;

		//if(method.getName().equals("save")){
			u.method1();
			result = method.invoke(targer, args);
			u.method2();
		//}else{
			//result = method.invoke(targer, args);
		//}
		
		return result;
	}
	
	//用于设置传人目标对象的方法
	public void setTarger(Object o){
		this.targer = o;
	}

}
 获得代理的实例类
package com.lbx.interceptor;

import java.lang.reflect.Proxy;

import com.lbx.dao.impl.UserDAOImpl;

public class UserProxyFactory {

	public static Object getProxy(Object object){
		ProxyHandler p = new ProxyHandler();
		p.setTarger(object);
		return Proxy.newProxyInstance(UserDAOImpl.class.getClassLoader(), object.getClass().getInterfaces(), p);
	} 
	
}
 服务层使用动态代理
package com.lbx.service;

import com.lbx.dao.UserDAO;
import com.lbx.dao.impl.UserDAOImpl;
import com.lbx.interceptor.UserProxyFactory;
import com.lbx.model.User;

public class UserService {
	
	//private UserDAO userDAO = new UserDAOImpl1();   //第一种就是写死,直接在方法里写
	//private UserDAO userDAO = new UserDAOImpl2();     //第二种就是通过继承来实现(方法执行前后加一些业务逻辑)
	//private UserDAO userDAO = new UserDAOImpl3();       //第三种是通过组合来完成的
	UserDAO userDAO = new UserDAOImpl();
	UserDAO u = null;
	
	Object object = UserProxyFactory.getProxy(userDAO);
	
	/*public UserDAO getUserDAO() {
		return userDAO;
	}

	public void setUserDAO(UserDAO userDAO) {
		this.userDAO = userDAO;
	}*/

	/*public void add(User user){
		this.userDAO.save(user);
	}*/
	
	public void add(User user){
		if(object instanceof UserDAO){
			u = (UserDAO)object;
		}
		u.save(user);
		//u.delete();
	}
	
}
 


分享到:
评论

相关推荐

    Spring AOP简单模拟

    本文将深入探讨Spring AOP的基本概念、工作原理,并通过简单的模拟实现来帮助理解。 首先,我们需要了解AOP的核心概念: 1. **切面(Aspect)**:切面是包含横切关注点的模块,如日志、事务等。在Spring AOP中,切...

    以注解方式模拟Spring IoC AOP

    在Spring框架中,依赖注入(Inversion of Control, IoC)和面向切面编程(Aspect Oriented Programming, AOP)是两大核心特性。本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 #...

    chapter05_aop地铁_用SpringAOP模拟乘坐地铁服务_

    在本教程中,我们将深入探讨如何使用Spring AOP(面向切面编程)来模拟实际生活中乘坐地铁...在本教程的"chapter05"中,你将找到更详细的代码示例和步骤,帮助你进一步理解如何利用Spring AOP模拟地铁服务的各个方面。

    SpringAOP整合Hibernate并使用事务(模拟买书的过程)

    在本示例中,我们将探讨如何整合Spring AOP(面向切面编程)与Hibernate ORM框架,并利用它们来实现事务管理,模拟一个简单的买书过程。这个过程将涉及到数据库操作,事务的开始、提交和回滚,以及AOP在处理事务中的...

    模拟实现spring IOC AOP的例子

    在本文中,我们将深入探讨如何模拟实现Spring框架中的两个核心特性:Inversion of Control(IoC,控制反转)和Aspect-Oriented Programming(AOP,面向切面编程)。这两个概念在现代Java应用开发中占据着重要的地位...

    SpringIOC和AOP实现机制模拟

    Spring框架是Java开发中不可或缺的一部分,它通过提供控制反转(IOC)和面向切面编程(AOP)等核心特性,极大地简化了企业级应用的构建。让我们深入探讨这两个概念及其在Spring中的实现机制。 首先,Spring的控制...

    个人用java动态代理模拟实现spring aop

    在本主题中,我们将探讨如何使用Java动态代理来模拟实现Spring AOP的功能。 首先,我们需要了解Java中的两种动态代理机制:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,适用于目标对象实现了接口的情况...

    模拟spring aop技术

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组件,它提供了一种在不修改源代码的情况下,通过代理模式来实现横切关注点(如日志、事务管理等)的机制。在实际开发中,AOP大大...

    Spring切面AOP编程的简单模拟实现

    本教程将通过模拟Spring AOP来阐述如何实现一个简单的切面编程。我们将讨论以下几个核心概念:切面、通知、连接点和代理。 首先,我们要理解什么是切面。在AOP中,切面是关注点的模块化,它结合了“横切关注点”...

    Spring IOC AOP MVC 简单例子

    在`SpringAOP`目录中,可能包含了定义切面、通知(advice)、切入点(pointcut)等内容。AOP的实现通常通过定义切面类,其中包含通知方法,并通过切入点表达式确定这些通知在何时何地执行。这使得代码更加模块化,...

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

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,这些切面可以包含业务逻辑的某一部分,比如日志、事务管理或安全控制。切面可以在多个对象中统一地应用,提高了代码的复用性...

    通过动态代理模拟Spring AOP

    总的来说,通过Java的动态代理模拟Spring AOP可以帮助我们理解AOP的基本原理,并在实际项目中实现一些简单的切面逻辑。然而,对于更复杂的需求,如跨越多个方法的事务管理,Spring AOP提供了更全面的解决方案。熟悉...

    Spring模拟aop静态代理案例

    本案例"Spring模拟aop静态代理案例"旨在帮助开发者深入理解Spring AOP在实际应用中的运作方式,特别是静态代理的概念。 AOP(Aspect Oriented Programming)是一种编程范式,它允许程序员将关注点(如日志、事务...

    spring 4.2.6和AOP模块架包

    Spring框架是Java开发中的一个核心库,主要用于处理依赖注入、面向切面编程(AOP)以及企业级应用开发。在这个版本中,Spring团队继续致力于提升框架的易用性、可扩展性和性能。 首先,让我们深入了解一下Spring的...

    SpringAOP的实现机制(底层原理)、应用场景等详解,模拟过程的实例

    这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好地理解和利用Spring AOP来提高您的应用程序的可维护性和可扩展性。 内容亮点: JDK动态...

    spring-aop demo及junit测试

    在Spring AOP的测试中,我们通常会创建一个测试类,模拟方法调用,然后验证切面是否按预期工作。 例如: ```java import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation....

    Spring_AOP_Demo

    现在,我们来详细探讨Spring AOP及其在实际应用中的使用。 一、Spring AOP概念 Spring AOP是基于动态代理实现的,它提供了一种模块化处理系统横切关注点的方式。所谓横切关注点,是指那些跨越多个对象、方法的业务...

    spring IOC AOP simulation.rar

    在这个名为"spring IOC AOP simulation"的压缩包文件中,我们可以深入学习并模拟这两个关键概念的工作原理。 **IoC(控制反转)**是Spring框架的核心,它将对象的创建和管理权从代码中分离出来,交给了容器。在传统...

    以注解方式模拟Spring_IoC,AOP

    本文将通过注解方式来模拟Spring的IoC和AOP,帮助你深入理解这两个概念的实现原理。 **一、依赖注入(IoC)** 依赖注入是Spring框架的核心特性,它使得对象之间的依赖关系由容器管理,而不是由对象自身管理。在...

Global site tag (gtag.js) - Google Analytics