Spring中AOP的模拟实现

本文介绍了面向切面编程(AOP)的概念及其在Spring框架中的应用,并通过具体示例展示了如何使用Spring的两种动态代理机制(JDK动态代理和CGLib动态代理)实现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();
	}
	
}
 


标题基于Python的汽车之家网站舆情分析系统研究AI更换标题第1章引言阐述汽车之家网站舆情分析的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义说明汽车之家网站舆情分析对汽车行业及消费者的重要性。1.2国内外研究现状概述国内外在汽车舆情分析领域的研究进展与成果。1.3论文方法及创新点介绍本文采用的研究方法及相较于前人的创新之处。第2章相关理论总结和评述舆情分析、Python编程及网络爬虫相关理论。2.1舆情分析理论阐述舆情分析的基本概念、流程及关键技术。2.2Python编程基础介绍Python语言特点及其在数据分析中的应用。2.3网络爬虫技术说明网络爬虫的原理及在舆情数据收集中的应用。第3章系统设计详细描述基于Python的汽车之家网站舆情分析系统的设计方案。3.1系统架构设计给出系统的整体架构,包括数据收集、处理、分析及展示模块。3.2数据收集模块设计介绍如何利用网络爬虫技术收集汽车之家网站的舆情数据。3.3数据处理与分析模块设计阐述数据处理流程及舆情分析算法的选择与实现。第4章系统实现与测试介绍系统的实现过程及测试方法,确保系统稳定可靠。4.1系统实现环境列出系统实现所需的软件、硬件环境及开发工具。4.2系统实现过程详细描述系统各模块的实现步骤及代码实现细节。4.3系统测试方法介绍系统测试的方法、测试用例及测试结果分析。第5章研究结果与分析呈现系统运行结果,分析舆情数据,提出见解。5.1舆情数据可视化展示通过图表等形式展示舆情数据的分布、趋势等特征。5.2舆情分析结果解读对舆情分析结果进行解读,提出对汽车行业的见解。5.3对比方法分析将本系统与其他舆情分析系统进行对比,分析优劣。第6章结论与展望总结研究成果,提出未来研究方向。6.1研究结论概括本文的主要研究成果及对汽车之家网站舆情分析的贡献。6.2展望指出系统存在的不足及未来改进方向,展望舆情
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值