【spring框架】AOP介绍

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:
什么是AOP
1.面向切面编程(Aspect-Oriented-Programming)
a)是面向对象的思维方式的有力补充。
下面利用之前写过的模拟Spring的工程给大家演示什么是AOP。

假设我们现在需要在UserDaoImpl类的save方法中add数据代码前后加日志信息:
即是加业务逻辑。
方法1:直接加代码:
package cn.edu.hpu.dao.Impl;

import cn.edu.hpu.dao.UserDao;
import cn.edu.hpu.model.User;

public class UserDaoImpl implements UserDao{


	public void save(User u) {
		
	    System.out.println("save start....");
		
	    System.out.println("add success!!");


	    System.out.println("save end....");
	}
}

方法2:(继承模式)
写一个UserDaoImpl2继承UserDaoImpl
package cn.edu.hpu.dao.Impl;


import cn.edu.hpu.model.User;


public class UserDaoImpl2 extends UserDaoImpl{


	@Override
	public void save(User u) {
		System.out.println("save start....");
		super.save(u);
		System.out.println("save end....");
	}
	
	
}
在beans.xml初始化UserDaoImpl2


方法3:(组合模式)
写一个UserDaoImpl2实现UserDao接口
package cn.edu.hpu.dao.Impl;


import cn.edu.hpu.dao.UserDao;
import cn.edu.hpu.model.User;


public class UserDaoImpl3 implements UserDao{
	
	private UserDao userDao=new UserDaoImpl();
	
	public void save(User u) {
		System.out.println("save start....");
		userDao.save(u);
		System.out.println("save end....");
	}
}
好处:可以互相之间来回的组合(可以换成new UserDaoImpl2();)


对于上面的方法3,如果逻辑bean非常多,那么需要引入非常多的bean,这时候每一个bean都要加上日志代码,工作量非常大。


解决办法:
写了一个LogIntercept的类,定义所有的日志代码:
package cn.edu.hpu.aop;


//日志的拦截器
public class LogIntercept {
	public void beforeMethod(){
		System.out.println("save start...");
	}
	
	public void afterMethod(){
		System.out.println("save end...");
	}
}


在业务逻辑的实现里这样使用:
package cn.edu.hpu.dao.Impl;


import cn.edu.hpu.aop.LogIntercept;
import cn.edu.hpu.dao.UserDao;
import cn.edu.hpu.model.User;


public class UserDaoImpl4 implements UserDao{
	
	private UserDao userDao=new UserDaoImpl();
	
	public void save(User u) {
		new LogIntercept().beforeMethod();
		userDao.save(u);
		new LogIntercept().afterMethod();
	}
}

但是这样做还是有问题:
使用组合模式的时候,虽然这个LogIntercept可以加到任何bean上面,还是没有解决一个问题,就是我要加到某个bean上面去的时候,必须得做一个新的类(如UserImpl5),把原来的那个bean组合进来。

解决方法:你要让我加到哪个bean上面,你干脆给我写个配置文件,我就动态的把逻辑加到那个bean上面。这就是AOP。

你在XML初始化bean的时候,加一个标签,告诉程序我要加一个逻辑。例如:
<!--这里的Log标签是假想的,不存在-->
<beans>
	<bean id="u" class="cn.edu.hpu.dao.Impl.UserDaoImpl" />
            <Log method="beforeMethod"/>
	    <Log method="afterMethod"/>
        </bean>
	
	<bean id="userService" class="cn.edu.hpu.service.UserService" >
		<property name="userDAO" bean="u"/>
	</bean>
	
</beans>
这里就可以将日志逻辑注入了。
但是你写<Log method="beforeMethod"/>等标签程序会帮你产生一个组合的类吗?很显然不能,所以这个时候你想要动态的产生我们想要的那个类,就要使用"动态代理"了。


JDK中可以实现动态代理:
利用proxy和invocationhandler
具体细节详见动态代理的文章: http://blog.csdn.net/acmman/article/details/44276397

下一篇总结我会利用动态代理实现AOP,并解释AOP:http://blog.csdn.net/acmman/article/details/44276427


转载请注明出处:http://blog.csdn.net/acmman/article/details/44276369

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
XML 安全 Java
|
2月前
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
79 0
|
20天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
6天前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
36 8
|
15天前
|
Java 开发者 Spring
理解和解决Spring框架中的事务自调用问题
事务自调用问题是由于 Spring AOP 代理机制引起的,当方法在同一个类内部自调用时,事务注解将失效。通过使用代理对象调用、将事务逻辑分离到不同类中或使用 AspectJ 模式,可以有效解决这一问题。理解和解决这一问题,对于保证 Spring 应用中的事务管理正确性至关重要。掌握这些技巧,可以提高开发效率和代码的健壮性。
45 13
|
27天前
|
IDE Java 测试技术
互联网应用主流框架整合之Spring Boot开发
通过本文的介绍,我们详细探讨了Spring Boot开发的核心概念和实践方法,包括项目结构、数据访问层、服务层、控制层、配置管理、单元测试以及部署与运行。Spring Boot通过简化配置和强大的生态系统,使得互联网应用的开发更加高效和可靠。希望本文能够帮助开发者快速掌握Spring Boot,并在实际项目中灵活应用。
48 5
|
1月前
|
缓存 Java 数据库连接
Spring框架中的事件机制:深入理解与实践
Spring框架是一个广泛使用的Java企业级应用框架,提供了依赖注入、面向切面编程(AOP)、事务管理、Web应用程序开发等一系列功能。在Spring框架中,事件机制是一种重要的通信方式,它允许不同组件之间进行松耦合的通信,提高了应用程序的可维护性和可扩展性。本文将深入探讨Spring框架中的事件机制,包括不同类型的事件、底层原理、应用实践以及优缺点。
69 8
|
2月前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
2月前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
84 5
|
2月前
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
85 8