Spring底层机制环境搭建

文章目录

    • 1.模块创建和依赖引入
        • 1.聚合模块,下面有一个myspring
        • 2.查看父模块是否管理了子模块
        • 3.myspring模块引入基本包
    • 2.进行环境搭建
        • 1.目录概览
        • 2.UserController.java
        • 3.UserService.java
        • 4.UserDao.java
        • 5.AppMain.java
        • 6.beans.xml
        • 7.测试
        • 8.配置UserController.java为多例的,然后测试
        • 9.UserService调用add方法,然后测试
        • 10.引入Bean后置处理器
          • 1.位置
          • 2.MyBeanPostProcessor.java
          • 3.UserService.java 设置初始化方法
          • 4.beans.xml配置扫描
          • 5.测试
          • 6.注意事项
        • 11.引入AOP
          • 1.目录
          • 2.SmartAnimal.java
          • 3.SmartDog.java
          • 4.SmartAnimalAspect.java
          • 5.beans.xml开启aop注解并扫描aop包
          • 6.AppMain.java 测试AOP
          • 6.简单分析AOP和后置处理器的关系
    • 3.抛出问题
        • 1.bean是怎么注入容器的?
        • 2.为什么加了@Autowired就能被依赖注入?
        • 3.单例多例是怎么实现的?
        • 4.Bean的后置处理器是怎么实现的?
        • 5.原生Spring的AOP是如何实现的?
    • 4.将代码放到远程仓库
        • 1.VCS -》 share
        • 2.查看仓库

1.模块创建和依赖引入

1.聚合模块,下面有一个myspring

CleanShot 2024-08-04 at 13.50.33@2x

2.查看父模块是否管理了子模块

CleanShot 2024-08-04 at 13.51.05@2x

3.myspring模块引入基本包
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.8</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.8</version></dependency>
</dependencies>

2.进行环境搭建

1.目录概览

CleanShot 2024-08-04 at 14.06.39@2x

2.UserController.java
package com.sunxiansheng.myspring.component;import org.springframework.stereotype.Component;/*** Description: 就是一个Controller组件* @Author sun* @Create 2024/8/4 13:53* @Version 1.0*/
@Component
public class UserController {
}
3.UserService.java
package com.sunxiansheng.myspring.component;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;/*** Description: 一个Service组件* @Author sun* @Create 2024/8/4 13:54* @Version 1.0*/
@Component
public class UserService {/*** 依赖注入UserDao*/@Autowiredprivate UserDao userDao;public void add() {System.out.println("UserService 调用了UserDao的add方法");userDao.add();}}
4.UserDao.java
package com.sunxiansheng.myspring.component;import org.springframework.stereotype.Component;/*** Description: 一个Dao组件* @Author sun* @Create 2024/8/4 13:53* @Version 1.0*/
@Component
public class UserDao {public void add() {System.out.println("UserDao add...");}}
5.AppMain.java
package com.sunxiansheng.myspring;import com.sunxiansheng.myspring.component.UserController;
import com.sunxiansheng.myspring.component.UserDao;
import com.sunxiansheng.myspring.component.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** Description: 启动类* @Author sun* @Create 2024/8/4 13:59* @Version 1.0*/
public class AppMain {public static void main(String[] args) {// 从类路径下加载beans.xml配置文件ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");// 从容器中获取UserController对象,这里获取两次,看是否是同一个对象UserController userController1 = (UserController) ioc.getBean("userController");UserController userController2 = (UserController) ioc.getBean("userController");System.out.println("userController1 == userController2 ? " + (userController1 == userController2));// 从容器中获取UserService对象UserService userService = (UserService) ioc.getBean("userService");System.out.println("userService = " + userService);// 从容器中获取UserDao对象UserDao userDao = (UserDao) ioc.getBean("userDao");System.out.println("userDao = " + userDao);}}
6.beans.xml
<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置自动扫描的包 --><context:component-scan base-package="com.sunxiansheng.myspring.component"/></beans>
7.测试

CleanShot 2024-08-04 at 14.09.09@2x

8.配置UserController.java为多例的,然后测试

CleanShot 2024-08-04 at 14.11.14@2x

CleanShot 2024-08-04 at 14.11.24@2x

9.UserService调用add方法,然后测试

CleanShot 2024-08-04 at 14.13.20@2x

CleanShot 2024-08-04 at 14.13.29@2x

10.引入Bean后置处理器
1.位置

CleanShot 2024-08-04 at 14.38.08@2x

2.MyBeanPostProcessor.java
package com.sunxiansheng.myspring.process;import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;/*** Description: Bean的后置处理器* @Author sun* @Create 2024/8/4 14:19* @Version 1.0*/
@Component // 将这个类加入到容器中
public class MyBeanPostProcessor implements BeanPostProcessor {/*** 在每个Bean的初始化方法之前执行* @param bean* @param beanName* @return*/@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {// 这里可以提前对bean进行一些处理System.out.println("postProcessBeforeInitialization..."+beanName+"=>"+bean.getClass());return bean;}/*** 在每个Bean的初始化方法之后执行* @param bean* @param beanName* @return*/@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {System.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean.getClass());return bean;}}
3.UserService.java 设置初始化方法

CleanShot 2024-08-04 at 14.38.34@2x

4.beans.xml配置扫描

CleanShot 2024-08-04 at 14.40.15@2x

5.测试

CleanShot 2024-08-04 at 14.40.32@2x

6.注意事项
  • bean的后置处理器在初始化方法调用前后执行
  • 触发时机为单例的第一次getBean和多例的每次getBean,也就是,每个Bean都会经过Bean的后置处理器处理
11.引入AOP
1.目录

CleanShot 2024-08-04 at 15.18.09@2x

2.SmartAnimal.java
package com.sunxiansheng.myspring.aop;/*** Description: SmartAnimal* @Author sun* @Create 2024/8/4 14:51* @Version 1.0*/
public interface SmartAnimal {public float getSum(float a, float b);public float getSub(float a, float b);}
3.SmartDog.java
package com.sunxiansheng.myspring.aop;import org.springframework.stereotype.Component;/*** Description: SmartDog* @Author sun* @Create 2024/8/4 14:51* @Version 1.0*/
@Component // 交给Spring容器管理
public class SmartDog implements SmartAnimal {@Overridepublic float getSum(float a, float b) {System.out.println("SmartDog...getSum...res=" + (a + b));return a + b;}@Overridepublic float getSub(float a, float b) {System.out.println("SmartDog...getSub...res=" + (a - b));return a - b;}
}
4.SmartAnimalAspect.java
package com.sunxiansheng.myspring.aop;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;import java.util.Arrays;/*** Description: 切面类* @Author sun* @Create 2024/8/4 14:53* @Version 1.0*/
@Component // 交给Spring容器管理
@Aspect // 标注这是一个切面类
public class SmartAnimalAspect {/*** @param joinPoint 保存了要切入的方法的信息* @Before 前置通知* execution(。。。) 切入表达式,表明要切入的方法,格式:格式:访问修饰符+返回类型 全类名 方法名(参数类型)*/@Before(value = "execution(public float com.sunxiansheng.myspring.aop.SmartDog.getSub(float, float))")public void before(JoinPoint joinPoint) {// 获取方法签名Signature signature = joinPoint.getSignature();System.out.println("方法执行开始-日志-方法名-" + signature.getName()+ "-参数" + Arrays.asList(joinPoint.getArgs()));// 还可以获取目标对象,这样就可以反射进行任何操作了SmartDog target = (SmartDog) joinPoint.getTarget();System.out.println("目标对象-" + target.getClass());}/*** @param joinPoint 保存了要切入的方法的信息* @AfterReturning 返回通知*/@AfterReturning(value = "execution(public float com.sunxiansheng.myspring.aop.SmartDog.getSub(float, float))")public void afterReturning(JoinPoint joinPoint) {Signature signature = joinPoint.getSignature();System.out.println("方法执行正常结束-日志-方法名-" + signature.getName());}/*** @param joinPoint* @AfterThrowing 异常通知*/@AfterThrowing(value = "execution(public float com.sunxiansheng.myspring.aop.SmartDog.getSub(float, float))")public void throwing(JoinPoint joinPoint) {Signature signature = joinPoint.getSignature();System.out.println("方法出现异常-日志-方法名-" + signature.getName());}/*** @param joinPoint* @After 后置通知*/@After(value = "execution(public float com.sunxiansheng.myspring.aop.SmartDog.getSub(float, float))")public void after(JoinPoint joinPoint) {Signature signature = joinPoint.getSignature();System.out.println("方法最终执行完毕-日志-方法名-" + signature.getName());}/*** 环绕通知* @param joinPoint* @return* @throws Throwable*/@Around("execution(public float com.sunxiansheng.myspring.aop.SmartDog.getSub(float, float))")public Object logMethodExecution(ProceedingJoinPoint joinPoint) throws Throwable {MethodSignature signature = (MethodSignature) joinPoint.getSignature();// 获取方法信息String methodName = signature.getMethod().getName();String className = signature.getDeclaringType().getSimpleName();System.out.println("环绕通知 method " + className + "." + methodName);// 获取目标对象Object targetObject = joinPoint.getTarget();// 环绕通知获取目标对象System.out.println("环绕通知获取目标对象:" + targetObject);try {// 前置通知:环绕通知获取参数System.out.println("环绕通知获取参数:" + Arrays.asList(joinPoint.getArgs()));Object result = joinPoint.proceed();  // 执行目标方法// 返回通知:环绕通知获取结果System.out.println("环绕通知获取结果:" + result);return result;} catch (Exception e) {// 异常通知throw e;} finally {// 最终通知System.out.println("环绕通知 method " + className + "." + methodName);}}}
5.beans.xml开启aop注解并扫描aop包

CleanShot 2024-08-04 at 15.19.30@2x

6.AppMain.java 测试AOP

CleanShot 2024-08-04 at 15.19.55@2x

CleanShot 2024-08-04 at 15.27.37@2x

6.简单分析AOP和后置处理器的关系

CleanShot 2024-08-04 at 15.41.14@2x

3.抛出问题

1.bean是怎么注入容器的?
2.为什么加了@Autowired就能被依赖注入?
3.单例多例是怎么实现的?
4.Bean的后置处理器是怎么实现的?
5.原生Spring的AOP是如何实现的?

4.将代码放到远程仓库

1.VCS -》 share

CleanShot 2024-08-04 at 14.44.28@2x

2.查看仓库

CleanShot 2024-08-04 at 14.45.31@2x

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/411954.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gptk是什么意思?Mac电脑如何在crossover里安装gptk2.0测试版?借助GPTK玩《原神》《黑神话悟空》游戏

很人多都听说使用 gptk2.0 beta 可以让《黑神话&#xff1a;悟空》等游戏的帧数提高&#xff0c;但自己并不知道如何安装&#xff0c;下面就给大家说下如何在crossover里安装 gptk2.0 beta 。安装前请先确认自己的电脑里已经安装好了crossover软件。 Game Porting Toolkit 简介…

数字化转型升级探索(二)

在数字化转型升级的探索中&#xff0c;我们计划通过整合前沿技术如人工智能、物联网和大数据&#xff0c;全面改造传统业务流程&#xff0c;打造智能化、数据驱动的业务架构&#xff0c;实现从数据采集、处理到分析的全链条数字化&#xff0c;以提升决策效率、优化运营管理&…

stm32-USB-1

1. USB简介 USB&#xff0c; 英文全称&#xff1a;Universal Serial Bus&#xff0c;即通用串行总线 USB提供适合各种应用的传输协议&#xff0c;而且协议标准向下兼容 优缺点 2. USB2.0拓扑结构 USB是一种主从结构的系统&#xff0c;数据交换只能发生在主从设备之间&#…

【STM32】写Keil程序的注意事项

看正点原子的资料使用Keil写STM32程序的时候&#xff0c;总是在不断学习&#xff0c;不断探索。后续又学到啥再更新 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 Keil设置 1.1 字体设置 1.2 快捷键设置 1.3 快速前往前一操作位置/后一操作位…

esp8266根据httpserver状态,调用网络唤醒,实现一键开机

esp8266根据httpserver状态&#xff0c;调用网络唤醒&#xff0c;实现一键开机 一.开发板程序二. 服务端三.服务端状态变更 一.开发板程序 #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiUdp.h> #include <ArduinoJson.h>/…

Autosar(Davinci) --- 创建一个OS TASK

目录 前言 一、认识OS 二、创建一个Basic Task 三、创建一个Extended Task 四、Task Mapping 五、生成代码 六、代码集成与编译 七、烧录&调试 八、Basic Task & Extended Task代码分析 前言 所有的runnable都是基于在TASK上运行的,那么我们这章就讲解,如何…

分享5款支持论文写作网站先稿后付的网站!

在当今学术研究和学术写作领域&#xff0c;AI论文写作工具已经成为不可或缺的助手。这些工具不仅能够提高写作效率&#xff0c;还能帮助研究人员生成高质量的论文内容。特别是那些提供“先稿后付”服务模式的网站&#xff0c;更是为用户提供了极大的便利和保障。以下是五款值得…

【Qt窗口】—— 状态栏

目录 1.1 状态栏的创建 1.2 在状态栏中显示实时消息 1.3 在状态栏中显示永久消息 状态栏是应用程序中输出简要信息的区域。⼀般位于主窗口的最底部&#xff0c;⼀个窗⼝中最多只能有⼀个状态栏。在Qt中&#xff0c;状态栏是通过QStatusBar类来实现的。在状态栏中可以显示的消…

2024118读书笔记|《岳阳楼记》——天高地迥,觉宇宙之无穷;兴尽悲来,识盈虚之有数

2024118读书笔记|《岳阳楼记》——天高地迥&#xff0c;觉宇宙之无穷&#xff1b;兴尽悲来&#xff0c;识盈虚之有数 爱莲说陋室铭小石潭记醉翁亭记赤壁赋桃花源记归去来兮辞木兰辞阿房宫赋滕王阁序岳阳楼记 《岳阳楼记》范仲淹&#xff0c;都是背过的古文&#xff0c;挺不错的…

并查集【算法 12】

并查集 (Union-Find) 的基础概念与实现 并查集&#xff08;Union-Find&#xff09;是一种用于处理不相交集合&#xff08;disjoint sets&#xff09;的数据结构&#xff0c;常用于解决连通性问题。典型的应用场景包括动态连通性问题&#xff08;如网络节点连通性检测&#xff0…

【STM32】FMC

FMC功能与FSMC类似&#xff0c;但比FSMC更强大&#xff0c;但仅在F4 / F7 / H7等高级一点的MCU上支持&#xff0c;F1不支持。虽然我的是F103&#xff0c;但顺便都看了。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目…

Axure 9 使用

一、界面初识 二、基础功能 1.菜单栏 1.1文件 新建文件&#xff1a;axure9包含四种文件.rp代表原型文件&#xff0c;.rplib代表元件库文件&#xff0c;.rpteam 团队项目文件 .html 网页文件 偏好设置&#xff1a;备份&#xff0c;需要备份文件再从备份中恢复 创建项目团…

二叉树前序,中序,后序非递归遍历(Java)

1. 思路&#xff1a; 首先创建一个栈和顺序表&#xff0c;按照根左右的前序遍历顺序去遍历这棵树&#xff0c;一直往左孩子方向遍历&#xff0c;每遍历到一个结点就入栈并且加入到顺序表里&#xff0c;如果没有左孩子了&#xff0c;就拿出栈顶元素&#xff0c;看它是否有右孩子…

智能学习辅助系统——后端部分

目录 前言 一、准备工作 1.需求&环境搭建 1.1需求说明 1.2环境搭建 2.开发规范 2.1 开发规范-REST 2.2 开发规范-统一响应结果 3.开发流程 二、部门管理 1.查询部门 &#xff08;1&#xff09;原型和需求 &#xff08;2&#xff09;接口文档 &#xff08;3&…

Unity2D游戏开发-Pak木鱼

在接下来文章里我会以Unity为主一起制作游戏 在unity 里如何制作一个简单的敲木鱼游戏&#xff1f; 创建一个2D场景&#xff08;本人使用Unity2023&#xff09; (每个一段时间要申请一个个人许可证) 点击下方蓝色按钮创建 将以下素材拖动到Assets文件夹中 这张图随意命名我…

深入理解DPO(Direct Preference Optimization)算法

目录 1. 什么是DPO&#xff1f;2. Bradley-Terry模型2.1 奖励模型的训练 3. 从PPO到DPO4. DPO的简单实现5. 梯度分析Ref 1. 什么是DPO&#xff1f; 直接偏好优化&#xff08;Direct Preference Optimization, DPO&#xff09;是一种不需要强化学习的对齐算法。由于去除了复杂的…

SQL Server中如何自动抓取阻塞

背景 当发数据库生阻塞时&#xff0c;可以通过SQL语句来获取当前阻塞的会话情况&#xff0c;可以得到下面的信息 说明&#xff1a;会话55阻塞了会话53。两个会话都执行了update test set fid10 where fid0。 但我们也经常碰到客户生产环境出现阻塞&#xff0c;由于不会抓取或者…

还在拼接字符串生成XML?(Java)

FreeMarker是一个功能强大的Java模板引擎&#xff0c;广泛应用于生成动态内容&#xff0c;如HTML、XML和其他文本格式。本文将介绍FreeMarker的基本使用方法&#xff0c;并提供一个更丰富的XML模板示例&#xff0c;以及模板标签和标识的含义。 1. 引入依赖 <dependency>…

三分钟总结开源流程表单的优势特点

实现流程化办公&#xff0c;可以借助低代码技术平台、开源流程表单的优势特点。作为当前较为理想的平台产品&#xff0c;低代码技术平台凭借够灵活、好操作、可视化界面的优势特点&#xff0c;得到了通信业、医疗、高校等很多行业客户朋友的喜爱与支持。今天一起来看看开源流程…

联华证券-新手炒股入门指南:学习路径与注意事项

学习炒股是一个循序渐进的过程&#xff0c;以下是入门建议以及需要注意的事项&#xff1a; 学习炒股的入手步骤 掌握基础知识&#xff1a; 股票市场基础&#xff1a;了解什么是股票、股市的运作机制、股票的种类等基本概念。 常用术语&#xff1a;熟悉如市盈率&#xff08;P/…