6.AOP+IoC/DI(注解方式)---简单

SpringBoot是如何实现AOP和IOC的 SpringBoot是如何自动实现IOC和AOP的 一、概念解析(AOP & IOC/DI) 本文主要是通过代码实现Spring Boot中的IOC和AOP配置。一些概念性的东西可以去我的博客了解。这里的AOP和IOC是属于Spring容器框架的范畴。和SpringBoot关系不大,因为Spring Boot的初中是整合简化了Spring和Spring MVC的开发。 1、关于IOC/DI的概念分析(简单全面)。☞点击链接前往; 这一片文章是多年前在学习使用Spring的过程中整理的。里面包括了很 阅读详情

一.注解:

1.Dao接口的实现类:
@Repository("userDao") 让Spring创建一个名字叫“userDao”的UserDaoImpl实例
在这里插入图片描述
2.Service接口的实现类
@Service("userService") 让Spring创建一个名字叫“userService”的UserServiceImpl实例
在这里插入图片描述
3.AddUserServlet.java
在这里插入图片描述

4.aop层.
在这里插入图片描述

配置环绕增强
@Aspect 声明当前类是一个切面
@Around("execution(* cn..*.*(..))") 声明环绕增强
ProceedingJoinPoint:用于环绕通知,使用proceed()方法来执行目标方法:

在这里插入图片描述
在这里插入图片描述
4.1前置和后置增强
在这里插入图片描述
@Before("execution(* cn..*.*(..))") 前置增强
@AfterReturning("execution(* cn..*.*(..))") 后置增强
在这里插入图片描述
4.2异常处理和最终增强
@AfterThrowing("execution(* cn..*.*(..))") 异常处理增强
@After("execution(* cn..*.*(..))") 最终增强
在这里插入图片描述

二.使用IoC创建Bean和创建增强(注解方式)

需要的包:
在这里插入图片描述


注意:POJO实体类要实现Serializable可序列化接口
在这里插入图片描述
1.UserDao.java

package cn.qf.spring.dao;
import cn.qf.spring.pojo.User;

public interface UserDao {
	public int addUser(User user);
}

2.UserDaoImpl.java

package cn.qf.spring.dao.impl;

import org.springframework.stereotype.Repository;
import cn.qf.spring.dao.UserDao;
import cn.qf.spring.pojo.User;

//使用注解的方式使用IoC创建Bean
//注解一定紧挨类
//@Repositor 用来创建dao中类的对象
@Repository("userDao")
public class UserDaoImpl implements UserDao{
	
	public int addUser(User user) {
		System.out.println("保存用户数据到数据库中");
		return 0;
	}
	
}

3.UserService.java

package cn.qf.spring.service;

import cn.qf.spring.pojo.User;

public interface UserService {
	public boolean addUser(User user);
}

4.UserServiceImpl.java(自动装配)

package cn.qf.spring.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.qf.spring.dao.UserDao;
import cn.qf.spring.pojo.User;
import cn.qf.spring.service.UserService;

//@Service 只能用在service层中
@Service("userService")
public class UserServiceImpl implements UserService{
	//声明UserDao类型的属性
	//为dao属性注入值
	//@Resource 是jdk内的注解,到Bean工厂中找名字是userDao的Bean,赋值给dao属性
	//@Resource(name="userDao")
	//@Autowired 是spring内的注解,根据属性的类型查找对应的Bean,找到后进行赋值
	
	@Autowired
	private UserDao dao;
	
	public boolean addUser(User user) {
		int ret = dao.addUser(user);
		if (ret==1) {
			return true;
		}else {
			return false;
		}
	}

}

5.aop层
5.1.前置和后置增强

package cn.qf.spring.aop;

import java.util.Arrays;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

//使用注解声明当前类是一个切面
@Aspect
public class OperLog {
	//获取log4j对象
	private static final Logger logger = Logger.getLogger(OperLog.class);
	
	//先配置切入点pointcut
	@Pointcut("execution(* cn..*.*(..))")
	public void pointCut() {}; //相当于切入点的Id
	
	//前置增强
	@Before("pointCut()")
	public void beforeLog(JoinPoint jp) {
		logger.debug("执行了"+jp.getTarget()+"对象,创建了"+jp.getSignature()
		+"方法,方法的参数列表是:"+Arrays.toString(jp.getArgs()));
	}
	//后置增强
	@AfterReturning("pointCut()")
	public void afterLog(JoinPoint jp,Object result) {
		logger.debug(jp.getSignature()+"方法执行结束,返回值为:"+result);
	}
}

5.2.异常处理和最终增强

package cn.qf.spring.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;

//使用注解声明当前类是一个切面
@Aspect
public class ExceptionLog {
	private static final Logger logger = Logger.getLogger(ExceptionLog.class);
	
	//配置切入点,在设置增强方法过程中配置
	//异常处理增强
	@AfterThrowing(pointcut = "execution(* cn..*.*(..))")
	public void afterException(JoinPoint jp,RuntimeException ex) {
		logger.error(jp.getTarget()+"对象里的"+jp.getSignature()+"方法发生异常,异常信息如下:"
					+ex.getMessage());
	}
	
	//最终增强
	@After("execution(* cn..*.*(..))")
	public void runFinally(JoinPoint jp) {
		logger.debug(jp.getSignature()+"执行结束");
	}
	
}

5.3.环绕增强

package cn.qf.spring.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

//使用注解声明当前类是一个切面
@Aspect
public class Arround {
	private static final Logger logger = Logger.getLogger(Arround.class);
	//声明环绕增强
	@Around("execution(* cn..*.*(..))")
	public Object aroundLog(ProceedingJoinPoint jp) {
		Object result = null;
		//前置增强
		logger.debug("执行了"+jp.getTarget()+"对象里的"+jp.getSignature()+"方法");
		
		try {
			result = jp.proceed();
		} catch (Throwable e) {
			//异常处理增强
			logger.error(jp.getSignature()+"方法发生异常:"+e.getMessage());
		} finally {
			logger.debug(jp.getSignature()+"方法执行结束");
		}
		//后置增强
		logger.debug(jp.getSignature()+"的执行结果是:"+result);
		return result;
	}
}

6.controller层
AddUserServlet.java
在这里插入图片描述

7.配置文件
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.2.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
	
	<!-- 告知spring 扫描指定的包 -->
	<context:component-scan base-package="cn.qf.spring.service,cn.qf.spring.dao"></context:component-scan>
	<bean class="cn.qf.spring.aop.Arround"></bean>
	<!-- 启用springAop的注解方式 -->
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
面试官:谈谈你对IOC和AOP的理解及AOP四种实现方式 IOC控制反转(IOC)是一种设计思想,就是将原本在程序中需要手动创建对象,现在交由Spring管理创建。举个例子,原本我们要在A类中调用B类的方法,就要直接在A中new出B类对象,然后调用B类中的方法,虽然能实现效果,不过存在一个问题,更改需求会对源代码进行修改,这是大忌。现在创建B对象就交给了Spring,在Spring中,B类对象被看成Bean对象(Spring中类就是Bean),这个Bean对象由spring容器进行创建和管理,当我们在配置文件中配置下的AOP。... 阅读详情

相关推荐

Python程序—定子故障三相永磁同步电动机振动与电流数据集

1.0 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为2.26%: 匝间短路故障,严重度为2.70%: 匝间短路故障,严重度为3.35%: 匝间短路故障,严重度为4.41%: 匝间短路故障,严重度为6.48%: 匝间短路故障,严重度为12.17%: 匝间短路故障,严重度为21.69%1.5 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为1.57%: 匝间短路故障,严重度为1.88%: 匝间短路故障,严重度为2.34%

m0_66465741的博客 1318

Spring AOP之@Around,@AfterReturning使用、切不进去问题解决

本文主要举几个工作中典型AOP的实操案例,还有经常出现的问题(切不进去,ctrl+左键跳不到被切方法中)等等。

大吉的博客 3万+

保姆级QFIL线刷教程:从驱动安装到成功刷机的完整避坑指南(Win10/11实测)

本文提供了一份详细的QFIL线刷教程,涵盖从驱动安装到成功刷机的完整流程,特别针对Win10/11系统进行了实测。文章重点解决了EDL模式下的常见问题,如Download Fail和COM Port识别错误,并提供了实用的避坑技巧和故障排除方案,帮助用户实现零失误操作。

weixin_29245767的博客 763

abjectj--@AfterReturning讲解

1、@AfterReturning有两个参value、returning,vlue=excution()标明切片的切入位置,returning切入的目标类的返回值。@AfterReturning注解的切面方法是在目标方法执行后执行。 doOther方法是接口的实现方法,该方法新建并且返回一个对象student public Student doOther(String name, String age) { Student s = new Student(); s.s

qq_39071012的博客 1万+

Landsat9 地表温度反演方法

landsat9地表温度反演及缺失值处理方法

xiangliu12345的博客 3916

RAGFlow 离线部署:解决cl100k_base.tiktoken问题

摘要 本文详细解决了RAGFlow离线部署时tiktoken缓存文件下载失败的问题。通过分析tiktoken库的缓存机制,一次性不改代码解决.

baidu_25691461的博客 830

AspectJ 切面注解中五种通知注解:@Before、@After、@AfterReturning、@AfterThrowing、@Around

要在 Spring 中声明 AspectJ 切面, 只需要在 IOC 容器中将切面声明为 Bean 实例. 当在 Spring IOC 容器中初始化 AspectJ 切面之后, Spring IOC 容器就会为那些与 AspectJ 切面相匹配的 Bean 创建代理。 在切面类中需要定义切面方法用于响应响应的目标方法,切面方法即为通知方法,通知方法需要用注解标识,AspectJ 支持 5 种类型的

u010502101的博客 17万+

时频分析之STFT:短时傅里叶变换的原理与代码实现(非调用Matlab API)

STFT function [STFT, f, t] = mystft(x, win, hop, nfft, fs) % function: [STFT, f, t] = stft(x, win, hop, nfft, fs) % % Input: % x - signal in the time domain % win - analysis window function % hop - hop size % nfft - numb

frostime的博客 13万+

@AfterReturning

1.作用:外部文件提取本部文件的参构造函数的返回值(即提取返回值,这也是它叫returning的原因),并可以在主语句输出后,外部添加进一两句语句(即添加一两个功能) 2.@AfterReturning的属性值,pointcut/value和returning.      pointcut/value:其实pointcut和value这两宝贝作用是一样的,只不过pointcut设定之后valu

IT_COOKIE_SAM的博客 4920

想学嵌入式但没开发板?试试这个免费的STM32虚拟仿真平台(含LVGL界面教程)

本文介绍如何利用免费的STM32虚拟仿真平台学习嵌入式开发,特别适合预算有限或零硬件基础的学习者。通过详细的LVGL界面开发教程,展示虚拟仿真在嵌入式学习中的高效性和实用性,涵盖环境搭建、代码实现到实机迁移的全流程,助力快速掌握嵌入式开发核心技能。

weixin_29266647的博客 306

大数据运维面试题及答案

1. 架构组成:- 2 个 NameNode(Active 活跃节点、Standby 备用节点),实时同步元数据(通过 JournalNode 集群,默认 3 个节点,存储 edits 日志,Active 写入、Standby 读取以保持元数据一致);- 容错性强:通过 RDD 的 “ lineage(血缘)” 机制,任务失败时可快速重算,无需从头执行。:集群 “大脑”,管理元数据(文件目录、块位置),实时响应客户端请求,数据存于内存,元数据镜像(fsimage)和编辑日志(edits)持久化到磁盘;

weixin_42795092的博客 905

spring-后置通知 @AfterReturning

后置通知 在目标方法执行之后,增加的业务功能,由于目标方法执行之后执行,所以可以获取到目标方法返回值,该注解是 returning属性就是用于指定接收方法返回值的变量名的。 所有被注解后置通知的方法,除了可以加入JoinPoint参数外,还可以包含一个用于接收返回值的变量,该变量最好使用Object类型的,目标方法的返回值可以是任何类型的。 后置定义方法,方法是实现切面功能 方法定义要求 public公共方法 方法没有返回值 void 方法名称自定义 方法有参数,推荐使用Object,参数名自定义,用于接

qq_40813329的博客 4836

【ArcGIS Pro微课1000例】0073:ArcGIS Pro3.5.2学习版下载及安装教程

ArcGIS Pro 3.5.2安装教程摘要:系统需Windows10及以上,8GB内存(推荐32GB)。安装步骤:1)安装.NET 8.0运行环境;2)执行主程序安装包,按向导完成基础安装;3)安装升级补丁;4)替换AfCore.dll文件并导入注册表。注意安装后删除临时文件节省空间。软件下载地址包含在百度网盘链接。安装过程需依次完成环境配置、主程序安装、补丁更新及破解步骤。

智慧空间实验室 1772

spring基础知识(IOC、DI、AOP)

一、spring概述 Spring 的主要作用就是为代码“解耦”,降低代码间的耦合度。就是让对象和对象(模块和模块)之间关系不是使用代码关联,而是通过配置来说明。减轻对项目模块之间的管理,类和类之间的管理, 帮助开发人员创建对象,管理对象之间的关系。 Spring 根据代码的功能特点,使用 Ioc 降低业务对象之间耦合度。IoC 使得主业务在相互调用过程中,不用再自己维护关系了,即不用再自己创建要使用的对象了。而是由 Spring 容器统一管理,自动“注入”,注入即赋值。 而 AOP 使得系统级服务得..

qq_38151401的博客 7201

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Spring框架 IOC/DI AOP 常用注解总结

文章目录前言1.Spring1.1Spring介绍1.2传统项目开发的弊端1.2.1编辑Dog类1.2.2编辑Cat类1.2.3编辑测试类1.2.4测试问题总结:1.3面向接口变成1.3.1业务说明1.3.2封装Pet接口1.3.3编辑2个实现类1.3.4编辑User测试类1.3.5面向接口开发小结1.4Spring-IOC(Inversion of Control)1.4.1 面向接口编程弊端1.4.2 IOC调用原理图1.5 Spring-IOC 入门案例1.5.1 准备Dog类1.5.2 准备spri

weixin_47790139的博客 2682

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Spring 核心概念深度解析:IOC、DI 与 AOP

摘要: Spring框架通过IOC、DI和AOP三大核心机制革新了Java开发模式。IOC将对象控制权交给容器,降低耦合度;DI作为IOC的具体实现,提供构造器、Setter和字段三种注入方式。AOP则通过切面编程解决横切关注点问题,支持五种通知类型和两种代理方式。三者协同工作,使Spring成为高效、灵活的企业级开发框架,广泛应用于日志、事务、安全等场景,显著提升代码模块化和可维护性。(149字)

Java是世界上最好的语言 1904

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

[2025]关于spring的ioc和aop?ioc和DI的区别,ioc是怎么实现的?aop是怎么实现的?

ioc的好处1:使用者不用关心引用bean的实现细节,譬如对于A a = new A(c,d,e,f);来说,如果要使用A,那还要把c,d,e,f多个类全都感知一遍,这显然是非常麻烦且不合理的 2:不用创建多个相同的bean导致浪费。 3:Bean的修改使用方无需感知。同样是上面的例子,假如说BeanA需要修改,如果没有IOC的话,所有引用到A的其他bean都需要感知这个逻辑,并且做对应的修改。但是如果使用了IOC,其他bean就完全不用感知到对于Spring的IOC来说,它是IOC思想的一种实现方式。

gwndjsh的博客 1542

地基Spring框架中的​​IOC 、AOP ​​ 和 ​​DI

spring框架核心:IOC、AOP、DI

qq_37679639的博客 1170

再次理解 Spring 中的 IOC、DI、AOP 与多态

IOC(Inversion of Control)是一种设计原则,它将对象的创建和依赖关系的管理从应用程序代码中转移到框架或容器中。在 Spring 中,IOC 容器负责创建和管理 Bean 的生命周期。将对象的创建权力反转给Spring框架!DI(Dependency Injection)是 IOC 的一种实现方式,它通过将依赖关系注入到对象中,而不是由对象自己创建依赖。

秃头之旅 1198

Spring的IOC,DI和AOP

spring的优点 ①IOC和DI降低了组件之间的耦合性 ,让程序员更专注于业务逻辑 ②容器提供了众多的辅助类,能加快应用的开发 ③spring对于主流的应用框架提供了集成支持,如hibernate,mybatis,Struts等 ④spring属于低侵入式设计,代码的污染极低 ⑤容器提供了AOP技术,利用它可以方便的实现权限拦截等功能 ⑥创建对象默认是单例的,不需要再使用单例模式进行...

不羁朔风的博客 7425

对于Spring IOC、DI、AOP的理解?

IoC(Inversion of Control)即控制反转,是一种设计原则,用于减少代码间的耦合。传统编程中,对象的创建和依赖管理由程序自身控制,而IoC将这些职责交给容器或框架处理。依赖注入是一种设计模式,用于实现IoC。对象的依赖关系不由对象自己创建,而是由外部容器注入。对象只需要声明它需要什么依赖,而不需要关心依赖的具体实现和创建过程。

H___Hkk的博客 1293

Spring IOC(DI)+AOP

IOC容器其实就是一个Map,key是每个bean对象的ID,value是bean对象本身。IOC 容器负责创建bean对象并管理bean的生命周期。某个接口,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib,基于继承的方式,生成一个被代理对象的子类来作为代理(Cglib动态代理的核心是MethodInterceptor接口和Enhancer类);:指的是对象创建(实例化、管理)的权力。

2301_78423465的博客 1997

Spring IOC、DI及AOP详解与实战

本文深入解析Spring框架核心的IOC、DI及AOP概念,以通俗易懂的方式阐述其原理与应用。文章先通过生动比喻介绍IOC(控制反转)概念,对比传统"霸道总裁"式对象创建与Spring"甩手掌柜"式管理;接着讲解依赖倒置原则、Spring容器工作流程,并提供手写简易IOC容器示例;随后阐述DI(依赖注入)与IOC的关系及实现方式。整体语言风趣,结构清晰,注重实战应用,帮助读者掌握Spring精髓。

码道源码 1114

【Spring框架三大核心特性】——IoC、DI、AOP

本文讲解 Spring 框架三大核心特性:控制反转(IoC),将对象创建等控制权交予 Spring 容器,实现解耦与灵活配置;依赖注入(DI),作为 IoC 的实现,通过构造器、Setter 方法等自动注入依赖,简化代码且便于动态替换;面向切面编程(AOP),分离日志、事务等横切关注点为切面,利用动态代理织入目标方法,实现代码复用与业务逻辑纯净,三者共同支撑 Spring 高内聚、低耦合的设计。

Mr.Ja的博客 1428

IOC/DI、AOP相关原理

这里写目录标题IOC/DI为什么IOC就降低了耦合性AOPORM IOC/DI   IOC全称是Inversion of Control 就是控制反转的意思,DI全称是Dependency Injection就是依赖注入的意思。这俩其实是对同一个原理的不同叫法,实际上是一回事。   在传统的程序中当我们需要通过对象去调用某个类的方法时都是这样,在需要某个对象时new一个对象然后调用它,比如这样: public class Test{ public void save(){ ManagerObject

晰中的博客 1万+

浅谈spring--AOP与IOC / DI

Spring 是一个开源框架,主要优势是其分层架构,分层架构允许选择使用哪一个组件。 七大模块组成包含Spring Core,AOP,ORM,DAO,Web,Context,Web MVC。 Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 对象的方式。组件都可以单独存在,或者与其他一个或多个模块联合实现。  Spring Core Core模块是Spring的核...

九之的博客 9728
上一篇: 5.增强(xml配置方式)
下一篇: 7.springAop原理
cuichen97
博客等级 码龄7年 34粉丝 209原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值