Spring基础-IOC-DI-AOP

第一部分:Spring基础

文章目录

    • 第一部分:Spring基础
      • 一、核心概念
      • 1.什么是Spring?
      • 2.Spring架构
      • 3.Spring优势
    • 二、控制反转
      • 1.为什么要控制反转?
      • 2.组件化方式编程案例(Test01_di)
      • 3.采用组件化思维,装配打印机(Test01_di)
    • 三、面向切面编程(AOP)方面编程
      • 1.什么是AOP?
      • 2.如何实现AOP?
      • 3. 使用 AOP 实现日志处理( Test02_aop )

一、核心概念

  • 控制反转(IOC:Inversion of Control)/依赖注入(DI:Dependency Injection)
  • AOP(Aspect Oriented Programming)

1.什么是Spring?

Spring:轻量级集成框架
设计目标:使现有技术更加易用,推进编码最佳实践
设计理念:Spring是面向 Bean 的编程
内容 
    - IOC容器
    - AOP实现
    - 数据访问支持
    - 简化JDBC/ORM框架
    - 声明式事务
      web集成

2.Spring架构

在这里插入图片描述

3.Spring优势

  • 低侵入设计
  • 独立于各种应用服务器
  • 依赖注入特性将组件关系透明化,降低了耦合度
  • 面向切面编程特性允许将通用任务进行集中式处理
  • 与第三方框架的良好整合

二、控制反转

控制反转:将创建对象的"控制"反转给容器。程序从容器中获取对象。

1.为什么要控制反转?

根本目标:实现系统的易维护、可插拔
首先,将组件对象的控制权从代码本身转移到外部容器,要求:
- 解耦合。实现每个组件时只关注组件内部的事情
- 采用组件化的思想:分离关注点,使用接口,不再关注实现
- 依赖的注入:将组件的构建和使用分开
- 要点:明确定义组件间的接口

2.组件化方式编程案例(Test01_di)

1.加包

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.2.13.RELEASE</spring.version>
<log4j.version>1.2.17</log4j.version>
<junit.version>4.12</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>

2.定义问候类

package com.by.entity;
public class HelloSpring {
// 问候的内容
private String content;
public HelloSpring() {
}
public void hello(){
System.out.println("Hello, " + content);
}
// setter/getter

3.添加配置文件di.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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--配置 bean 对象-->
<bean id="helloSpring" class="com.by.entity.HelloSpring">
<property name="content" value="IoC"></property>
</bean>
</beans>

4.测试类

package com.by;
import static org.junit.Assert.assertTrue;
import com.by.entity.HelloSpring;
import com.by.entity.Saying;
import com.by.printer.Printer;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppTest
{
public void test01_simple(){
ApplicationContext ac = new ClassPathXmlApplicationContext("di.xml");
HelloSpring hs = (HelloSpring)ac.getBean("helloSpring");
hs.hello();
((ClassPathXmlApplicationContext) ac).close();
}

3.采用组件化思维,装配打印机(Test01_di)

  1. 创建 maven 项目,并加包(如上例)
  2. 面向接口方式创建打印机,包括:墨盒接口和实现类;纸张接口和实现类(见
    JavaOOP 接口)
  3. 创建 resources/di.xml 文件装配打印机
<!--案例:Printer-->
<bean id="a4" class="com.by.printer.paper.A4Paper"></bean>
<bean id="b5" class="com.by.printer.paper.B5Paper"></bean>
<bean id="black" class="com.by.printer.ink.BlackInk"></bean>
<bean id="color" class="com.by.printer.ink.ColorInk"></bean>
<bean id="printer" class="com.by.printer.Printer">
<property name="ink" ref="black"></property>
<property name="paper" ref="a4"></property>
</bean>
  1. 测试。
@Test
public void test03_printer(){
ApplicationContext ac = new ClassPathXmlApplicationContext("di.xml");
Printer printer = (Printer)ac.getBean("printer");
printer.print();
}

三、面向切面编程(AOP)方面编程

1.什么是AOP?

方面:是指程序中的某些琐碎而又必须完成的工作。比如:日志、事务管理、安全认证等
等。它们散布在程序的各个角落,但又必须做,不可或缺。
AOP(Aspect Oreinted Programming):就是将分散在程序中的工作,例如:日志、安
全、事务管理等(方面),将这些工作从业务中分离出来,进行一次性处理。

在这里插入图片描述

2.如何实现AOP?

AOP 的目标:让我们可以“专心做事”
AOP 原理:将复杂的需求分解出不同方面,将散布在系统中的公共功能集中解决。采用 代
理机制 组装起来运行,在不改变原程序的基础上对代码段进行增强处理,增加新的功能

在这里插入图片描述

所谓面向切面编程,是一种通过预编译和运行期动态代理的方式实现在不修改源代码的情
况下给程序动态添加功能的技术

3. 使用 AOP 实现日志处理( Test02_aop )

在这里插入图片描述

1.加包aspectj

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>

2.业务逻辑方法

public class User {
private Integer id;
private String name;
private Integer age;
public User() {
}
// setter/getter 略
}
package com.by.service;
import com.by.entity.User;
public class UserService {
// 添加用户
public int addUser(User user){
System.out.println("插入用户 User:" + user);
return 1;
}
}

3.定义日志增强功能 LoggerAdvice

package com.by.advice;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import java.util.Arrays;
// 日志增强
public class LoggerAdvice {
private static Logger logger = Logger.getLogger(LoggerAdvice.class);
// 前置增强
public void before(JoinPoint jp){
logger.debug("前置增强:调用 " + jp.getTarget() + " 的 " + jp.getSignature(
Arrays.toString(jp.getArgs()));
}
// 后置增强
public void afterReturning(JoinPoint jp, Object ret){
logger.debug("后置增强:调用 " + jp.getTarget() + " 的 " + jp.getSignature(
Arrays.toString(jp.getArgs()) + ",结果:" + ret);
}
}

4.配置增强 di.xml

<!--业务逻辑类-->
<bean id="userService" class="com.by.service.UserService"></bean>
<!--增强类-->
<bean id="loggerAdvice" class="com.by.advice.LoggerAdvice"></bean>
<!--增强配置类-->
<aop:config>
<aop:pointcut id="service" expression="execution(public * com.by.service..*.*(..))
<aop:aspect ref="loggerAdvice">
<aop:before method="before" pointcut-ref="service"></aop:before>
<aop:after-returning method="afterReturning" pointcut-ref="service" returning
</aop:aspect>
</aop:config>

5.测试。直接运行业务方法,可看到增强的结果。

@Test
public void test_aop(){
ApplicationContext ac = new ClassPathXmlApplicationContext("di.xml");
UserService userService = (UserService)ac.getBean("userService");
User user = new User(1000, "石头", 30);
userService.addUser(user);
System.out.println("-------------------------------------------------------");
userService.delete(1000);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI时代Python量化交易实战:ChatGPT引领新时代

文章目录 《AI时代Python量化交易实战&#xff1a;ChatGPT让量化交易插上翅膀》关键点内容简介作者简介购买链接 《AI时代架构师修炼之道&#xff1a;ChatGPT让架构师插上翅膀》关键点内容简介作者简介 赠书活动 《AI时代Python量化交易实战&#xff1a;ChatGPT让量化交易插上翅…

MATLAB - 读取双摆杆上的 IMU 数据

系列文章目录 前言 本示例展示了如何从安装在双摆杆上的两个 IMU 传感器生成惯性测量单元 (IMU) 读数。双摆使用 Simscape Multibody™ 进行建模。有关使用 Simscape Multibody™ 构建简易摆的分步示例&#xff0c;请参阅简易摆建模&#xff08;Simscape Multibody&#xff09…

设计模式(4)--对象行为(2)--命令

1. 意图 将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请 求日志&#xff0c;以及支持可撤销的操作。 2. 四种角色 接收者(Receiver)、抽象命令(Command)、具体命令(Concrete Command)、请求者(Invoker) 3. 优点…

【NI-RIO入门】使用其他文本语言开发CompactRIO

1.FPGA 接口Python API Getting Started — FPGA Interface Python API 19.0.0 documentation 2.FPGA接口C API FPGA 接口 C API 是用于 NI 可重配置 I/O (RIO) 硬件&#xff08;例如 NI CompactRIO、NI Single-Board RIO、NI 以太网 RIO、NI FlexRIO、NI R 系列多功能 RIO 和…

Python生成圣诞节贺卡-代码案例剖析【第18篇—python圣诞节系列】

文章目录 ❄️Python制作圣诞节贺卡&#x1f42c;展示效果&#x1f338;代码&#x1f334;代码剖析 ❄️Python制作圣诞树贺卡&#x1f42c;展示效果&#x1f338;代码&#x1f334;代码剖析&#x1f338;总结 &#x1f385;圣诞节快乐&#xff01; ❄️Python制作圣诞节贺卡 …

【数字通信原理】复习笔记

哈喽&#xff89;hi~ 小伙伴们许久没有更新啦~ 花花经历了漫长的考试周~ 要被累成花干啦。今天来更新《数字通信原理》手写笔记给需要的小伙伴~ &#xff08;注:这是两套笔记&#xff0c;是需要结合来看的哦~&#xff09; 第一套的笔记请结合bilibili:张锦皓的复习课程来哦。 第…

sql_lab之sqli中的报错注入,less13

报错注入&#xff08;less-13&#xff09; 正常报错注入&#xff1a; 1.输入用户名和密码123 123显示登录错误 2.输入用户名和密码123’ 123显示登录错误 123后面有’)说明是’)注入 3.查询数据库名 1) and updatexml(<a><b></b></a>,concat(1111…

二维码智慧门牌管理系统升级:强化用户管理合规性

文章目录 前言一、功能优化和多层级管理二、强大的合规性与权限配置三、提升管理效率与系统安全性 前言 随着科技迅速发展&#xff0c;二维码智慧门牌管理系统已经成为各组织机构首选的入口&#xff0c;提高了信息管理效率并确保了数据安全。然而&#xff0c;用户需求变化和法…

<HarmonyOS第一课>运行Hello World

下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&#xff0c;首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网&#xff0c;单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和…

OC学习笔记--基础篇

本文简要介绍了一些oc的基础类型&#xff0c;包括数组、字典、字符串、消息传递、类、对象、方法、属性、协议和转发&#xff0c;希望对你有帮助。 OC数据类型 打印—类似print NSlog("hello word");数组 NSMutableArray &#xff08;可变数组&#xff09;和 NSAr…

音画欣赏|《同杯万古尘》

《同杯万古尘》 尺寸&#xff1a;69x35cm 陈可之2023年绘 《拟古十二首-其九》 李白 生者为过客&#xff0c;死者为归人。 天地一逆旅&#xff0c;同悲万古尘。 月兔空捣药&#xff0c;扶桑已成薪。 白骨寂无言&#xff0c;青松岂知春。 前后更叹息&#xff0c;浮荣安足珍&am…

【SpringMVC】REST(Representation State Transfer)ful开发

REST全称Representation State Transfer&#xff0c;表现形式状态转换 文章目录 1. 为什么提出了REST&#xff1f;2. RESTful入门案例案例代码修改请求方式修改成RESTful风格&#xff0c;并以POST方式提交 RESTful格式下传参RESTful入门案例总结RequestBody&#xff0c;Reques…

2023 Intellij IDEA的热部署配置

第一步&#xff1a;导入依赖 <!--热部署--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency>第二步&#xff1a;配置idea

【Git 小妙招】学习多人协作场景(万字图文讲解+实战练习)

文章目录 前言1. 多人协作(场景一)2. 多人协作(场景二)3. 解决一个问题总结 前言 还记得我们学习 Git 是为了什么吗? 当然是实现多人协作了. 在学习了解博主前面关于 Git 的文章后, 我们就可以模拟来进行一些超超超简单的多人协作场景了. 本文就简单举两个多人协作的例子. 关…

C++ 强制类型转换static_cast<typeName>

C允许通过强制类型转换机制显式地进行类型转换。强制类型转换的格式有两种。 如&#xff1a; 为将存储在变量nData中的int值转换为long类型&#xff0c;可以使用下面的表达式中的一种&#xff1a; (long)nData …

Unity 问题 之 ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时,动态变化时无法及时刷新更新适配界面的问题

Unity 问题 之 ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时&#xff0c;动态变化时无法及时刷新更新适配界面的问题 目录 Unity 问题 之 ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时&#xff0c;动态变化时无法及时刷新更新适配界面的问题 一、简单介绍…

js中将数字转成中文

文章目录 一、实现二、最后 一、实现 如果要将数字10、100和1000转换成中文的"十"、“一百"和"一千”&#xff0c;可以使用以下 JavaScript 代码实现&#xff1a; function numberToChinese(num) {const chineseNums [零, 一, 二, 三, 四, 五, 六, 七, …

最新版 JESD79-5B,2022年,JEDEC 内存SDRAM规范

本标准定义了DDR5 SDRAM规范&#xff0c;包括特性、功能、交流和直流特性、封装以及球/信号分配。本标准旨在为x4、x8和x16 DDR5 SDRAM设备定义符合JEDEC标准的8 Gb至32 Gb的最低要求。该标准是基于DDR4标准&#xff08;JESD79-4&#xff09;和DDR、DDR2、DDR3和LPDDR4标准的一…

IP应用场景的规划

IP地址作为互联网通信的基石&#xff0c;在现代社会中扮演着至关重要的角色。本文将深入探讨IP地址在不同应用场景中的规划与拓展&#xff0c;探讨其在网络通信、安全、商业、医疗和智能城市等领域的关键作用与未来发展趋势。 IP地址的基本原理 IP地址是分配给网络上设备的数…

NC65 查询单据所处的流程状态以及流程平台客户端工具类

1、查询单据所处的流程状态 nc.bs.wfengine.engine.EngineService的queryFlowStatus()方法 /*** 查询单据所处的流程状态* * param billId* param billType* param result* return* throws DbException*/public int queryFlowStatus(String billId, String billType, int flo…