【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日志并进行多维度分析。
相关文章
|
23天前
|
XML Java 开发者
Spring Boot中的AOP实现
Spring AOP(面向切面编程)允许开发者在不修改原有业务逻辑的情况下增强功能,基于代理模式拦截和增强方法调用。Spring Boot通过集成Spring AOP和AspectJ简化了AOP的使用,只需添加依赖并定义切面类。关键概念包括切面、通知和切点。切面类使用`@Aspect`和`@Component`注解标注,通知定义切面行为,切点定义应用位置。Spring Boot自动检测并创建代理对象,支持JDK动态代理和CGLIB代理。通过源码分析可深入了解其实现细节,优化应用功能。
|
2月前
|
XML 安全 Java
|
3月前
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
112 0
|
8天前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
82 29
|
5天前
|
XML Java 测试技术
Spring AOP—通知类型 和 切入点表达式 万字详解(通俗易懂)
Spring 第五节 AOP——切入点表达式 万字详解!
55 25
|
5天前
|
XML 安全 Java
Spring AOP—深入动态代理 万字详解(通俗易懂)
Spring 第四节 AOP——动态代理 万字详解!
52 24
|
23天前
|
开发框架 运维 监控
Spring Boot中的日志框架选择
在Spring Boot开发中,日志管理至关重要。常见的日志框架有Logback、Log4j2、Java Util Logging和Slf4j。选择合适的日志框架需考虑性能、灵活性、社区支持及集成配置。本文以Logback为例,演示了如何记录不同级别的日志消息,并强调合理配置日志框架对提升系统可靠性和开发效率的重要性。
|
2月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
1月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
73 8
|
3月前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
202 53