【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

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
2月前
|
Java Spring
聊聊你对SpringBoot框架的理解 ?
SpringBoot是Spring家族中流行的子项目,旨在简化Spring框架开发的繁琐配置。它主要提供三大功能:starter起步依赖简化依赖管理,自动配置根据条件创建Bean,以及内嵌Web服务器支持Jar包运行,极大提升了开发效率。
107 0
|
4月前
|
监控 安全 Java
Spring AOP实现原理
本内容主要介绍了Spring AOP的核心概念、实现机制及代理生成流程。涵盖切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)等关键概念,解析了JDK动态代理与CGLIB代理的原理及对比,并深入探讨了通知执行链路和责任链模式的应用。同时,详细分析了AspectJ注解驱动的AOP解析过程,包括切面识别、切点表达式匹配及通知适配为Advice的机制,帮助理解Spring AOP的工作原理与实现细节。
|
18天前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
16天前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
|
2月前
|
NoSQL Java 数据库连接
SpringBoot框架
Spring Boot 是 Spring 家族中最流行的框架,旨在简化 Spring 应用的初始搭建与开发。它通过自动配置、起步依赖和内嵌服务器三大核心功能,大幅减少配置复杂度,提升开发效率。开发者可快速构建独立运行的 Web 应用,并支持多种数据访问技术和第三方集成。
|
3月前
|
Java API 网络架构
基于 Spring Boot 框架开发 REST API 接口实践指南
本文详解基于Spring Boot 3.x构建REST API的完整开发流程,涵盖环境搭建、领域建模、响应式编程、安全控制、容器化部署及性能优化等关键环节,助力开发者打造高效稳定的后端服务。
389 1
|
2月前
|
缓存 安全 Java
Spring 框架核心原理与实践解析
本文详解 Spring 框架核心知识,包括 IOC(容器管理对象)与 DI(容器注入依赖),以及通过注解(如 @Service、@Autowired)声明 Bean 和注入依赖的方式。阐述了 Bean 的线程安全(默认单例可能有安全问题,需业务避免共享状态或设为 prototype)、作用域(@Scope 注解,常用 singleton、prototype 等)及完整生命周期(实例化、依赖注入、初始化、销毁等步骤)。 解析了循环依赖的解决机制(三级缓存)、AOP 的概念(公共逻辑抽为切面)、底层动态代理(JDK 与 Cglib 的区别)及项目应用(如日志记录)。介绍了事务的实现(基于 AOP
|
2月前
|
存储 缓存 NoSQL
Spring Cache缓存框架
Spring Cache是Spring体系下的标准化缓存框架,支持多种缓存(如Redis、EhCache、Caffeine),可独立或组合使用。其优势包括平滑迁移、注解与编程两种使用方式,以及高度解耦和灵活管理。通过动态代理实现缓存操作,适用于不同业务场景。
225 0
|
2月前
|
消息中间件 NoSQL Java
SpringBoot框架常见的starter你都用过哪些 ?
本节介绍常见的Spring Boot Starter,分为官方(如Web、AOP、Redis等)与第三方(如MyBatis、MyBatis Plus)两类,用于快速集成Web开发、数据库、消息队列等功能。
188 0