Spring注解-Spring-boot-SpingAOP
Spring各个模块
Test
对应spring-test.jar. Spring提供的测试工具, 可以整合JUnit测试, 简化测试环节.
Core Container
Spring的核心组件, 包含了Spring框架最基本的支撑.
Beans, 对应spring-beans.jar. Spring进行对象管理时依赖的jar包.
Core, 对应spring-core.jar, Spring核心jar包.
Context, 对应spring-context.jar, Spring容器上下文对象.
SpEL, 对应spring-expression.jar, Spring表达式语言.
AOP
面向切面编程, 对应spring-aop.jar.
Aspects
AspectJ的具体实现,面向切面编程的另一种实现。对应spring-aspects.jar
Instrumentation
服务器代理接口的具体实现。对应spring-instrument.jar
Messaging
集成messaging api和消息协议提供支持。对应spring-messaging.jar
Data Access/Integration
Spring对数据访问层的封装
JDBC, 对应spring-jdbc.jar. Spring对jdbc的封装, 当需要使用spring连接数据库时使用. spring-jdbc.jar需要依赖spring-tx.jar.
Transactions, 对应spring-tx.jar. 事务管理
ORM, 对应spring-orm.jar. spring整合第三方orm框架需要使用的jar包, 例如Hibernate框架.
Web
Spring对javax下的接口或类做的扩展功能.
spring-web.jar, 对Servlet, filter, Listener等做的增强.
spring-webmvc.jar, 实际上就是SpringMVC框架. 需要依赖spring环境和spring-web.jar
学习Spring其实就是在分别学习Spring所有模块的功能。随着Spring框架的不断发展,在Spring官方压缩包中包含的模块对应的jar也越来越多。
IoC/DI
IoC(Inversion of Control)中文名称:控制反转。
DI(dependency injection )依赖注入。属于同一件事情的两个名称。
容器(Container):放置所有管理对象的对象。其本质是在容器对象里面有一个全局Map对象,map对象中放置所有被管理的对象。Spring中容器是指ApplicationContext接口及子接口或实现类。
beans:容器中所有被管理的对象称为beans。如果单说其中一个对象可称为bean。
Spring支持的注解
@Repository、@Service、@Controller、@Configuration都是@Component注解的子注解,作用相同。
注解名称 | 解释 |
---|---|
@Component | 实例化Bean,默认名称为类名收字母变小写。支持自定义名称 |
@Repository | @Component子标签。作用和@Component一样。用在持久层 |
@Service | @Component子标签。作用和@Component一样。用在业务层 |
@Controller | @Component子标签。作用和@Component一样。用在控制器层 |
@Configuration | @Component子标签。作用和@Component一样。用配置类 |
@Autowired | 自动注入。默认byType,如果多个同类型bean,使用byName(默认通过属性名查找是否有同名的bean,也可以通过@Qualifier(“bean名称”),执行需要注入的Bean名称) |
@Resource | 非Spring注解。默认byName,如果没找到,使用byType。 |
创建Spring项目
Spring项目想要运行起来必须包含:
- spring-context.jar。spring上下文依赖,它依赖了下面的四个jar。
- spring-core.jar。Spring 核心jar包。它依赖了spring-jcl.jar
- spring-aop.jar。Spring AOP基本支持。
- spring-expression.jar。Spring的表达式语言支持。
- spring-beans.jar。Spring容器的bean管理。
- spring-jcl.jar。Spring 4版本时是common-logging.jar。从5开始Spring自己对日志进行了封装。
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.16</version></dependency></dependencies>
AOP基本概念
功能: 不修改源码的基础上就能添加新的业务逻辑
AspectJ实现AOP
概念:
Pointcut:切点。就是表达式,通过表达式说明哪些方法是join point
join point: 切入点。就是我们平时说的目标方法,或说对哪个方法做扩展,做增强。
Advice:通知,增强内容。
Weaving:织入。织入就是把Advice添加到join point的过程。
Aspect:切面。即join point + Advice
注解实现
1.导入jar包
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.明确切入点(要增强的方法)
package org.example.service;
//切入点
public class DemoServiceImpl {public void show(){System.out.println("abc");}
}
3.编写通知类,并在停止类上加上@Aspect注解表识这是一个通知类和@Component注解将这个类的实例对象放入spring容器中
@Component
@Aspect
public class MyAdvice{@Pointcut("execution(* org.example.service.DemoServiceImpl.show())")//切点public void pointCut(){//配置切点}//前置通知,在切入点执行前执行该方法@Before("pointCut()")public void before(){System.out.println("hello");}//后置通知,在切入点执行之后,执行该方法@After("pointCut()")public void after(){System.out.println("after");}//环绕通知@Around("pointCut()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {//环绕前执行:在@Before之前执行System.out.println("around" + "before");//使用joinPoint.proceed()执行切入点,该方法可以拦截目标方法的返回值,可以对返回值处理后,在该方法的最后返回Object proceed = joinPoint.proceed();//环绕后执行:在@After之前执行,有异常不执行System.out.println("around" + "after");//返回拦截处理后的返回值return proceed;}// 在目标方法执行完成,并返回一个返回值后实施增强。@AfterReturning(value = "pointCut()")public void afterReturning() {System.out.println("AfterReturning advice...");}//目标方法执行时出现异常后执行@AfterThrowing(value = "pointCut()")public void afterThrowing() {System.out.println("AfterThrowing advice...");}
}
代理模式
代理模式是Java常见的设计模式之一。
简单来说: 想在A类中调用B类的实例方法,但是不直接调用,而是调用C类实例的方法a(),同时在a()中调用B类实例的方法并对其做一定程度的增强.这就是代理模式
代理设计模式包括:静态代理和动态代理。
静态代理: 代理对象由程序员自己编写
//1.创建接口
public interface MyInterface {void testMethod();
}
//2.创建实际要调用的对象
//真实对象
public class MyTrueClass implements MyInterface{@Overridepublic void testMethod() {System.out.println("我是方法.....");}
}//3.创建代理对象
public class MyStaticProxyClass implements MyInterface {//代理方法@Overridepublic void testMethod() {//其他代码System.out.println("扩展代码上...");//调用真实对象的真实方法MyTrueClass myTrueClass=new MyTrueClass();myTrueClass.testMethod();//其他代码System.out.println("扩展代码下....");}
}
4.测试
public class Test {public static void main(String[] args) {//传统方式:直接调用MyInterface myInterface=new MyTrueClass();myInterface.testMethod();//代理方式: 间接调用,调用代理对象的代理方法MyInterface myInterface1=new MyStaticProxyClass();myInterface1.testMethod();}
}
1.JDK动态代理
//1.创建接口
interface MyInterface{void show();
}
//2.创建实际要调用的对象
//真实对象
class MyTrueObject implements MyInterface{@Overridepublic void show() {System.out.println("hello world");}
}
//2.创建代理对象
class MyjdkProxy{public static Object getProxyInstance(Object tag){return Proxy.newProxyInstance(MyjdkProxy.class.getClassLoader(),new Class[]{MyInterface.class},new InvocationHandler() {//这个方法的左右就是将原方法暴露给用户,方便对其进行功能加强/*这个方法的作用就是暴露给用户进行功能扩展方法proxy:代理类对象method:需要调用的真实对象中方法对象args:用户输入的参辫*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//扩展功能System.out.println(new Date() + " " + "okk");//通过反射调用Object invoke = method.invoke(tag, args);return invoke;}});}
}
//测试获取代理对象
public class Teachher {public static void main(String[] args) {MyInterface proxyInstance = (MyInterface) MyjdkProxy.getProxyInstance(new MyTrueObject());proxyInstance.show();}
}
流程: Proxy.newProxyInstance(MyjdkProxy.class.getClassLoader(),new Class[]{MyInterface.class},new InvocationHandler() {}
第一个参数获取类加载器
第二个参数传入真实调用对象实现的接口,用来在内部创建一个和真实调用对象一样的实现这个接口的所有方法的类,在类中调用invoke()方法,这个invoke()调用的就是在第三个参数中重写的invoke()方法.
第三个参数: 重写invoke方法
2.Cglib动态代理
Cblig动态是第三方提供的技术,需要导入jar包,并且是基于继承的。
<dependencies><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version></dependency></dependencies>
class ClassTrue{public void show(){System.out.println("hello world");}
}public class Student {public static Object getProxy(Object tag){//创建Enhancer对象Enhancer enhancer = new Enhancer();//设置父类class类型enhancer.setSuperclass(ClassTrue.class);//设置回调函数enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {//扩展方法System.out.println(new Date());//调用真实目标中的方法Object invoke = method.invoke(tag, objects);//返回return invoke;}});//产生代理对象,并返回Object o = enhancer.create();return o;}
}//测试
class Demo{public static void main(String[] args) {ClassTrue proxy = (ClassTrue)Student.getProxy(new ClassTrue());proxy.show();}
}
AOP底层代理模式: SpringAOP底层默认使用的JDK动态代理,但是同时也支持cglib动态代理。需要配置Cglib的依赖以及在Spring的配置文件中开启Cglib动态代理
Spring声明式事务
声明式事务是基于AOP实现的。程序员只需要编写调用持久层代码和业务逻辑代码。把开启事务的代码放在前置通知中,把事务回滚和事务提交的代码放在了后置通知中
springboot:
1.在启动类上加入@EnableTransactionManagement //开启事务管理注解模式 最新的版本可以省略
2.只需要在方法上增加注解@Transactional
事务传播行为
1.默认情况下都认为每个方法都是没有事务的。
2.整个调用最终都是在调用者里面统一提交回滚。
3.在声明式事务中,如果是同一个类的多个方法相互调用,所有事务传播行为只生效第一个,其他跟随主要在NEVER和REQUIRED_NEW中出现。
4.如果希望测试效果,必须把方法放入到多个不同的类中进行测试。
**REQUIRED:**默认值。如果当前有事务则加入到事务中。如果当前没有事务则新增事务。
**SUPPORTS:**如果当前有事务就在事务中执行,如果当前没有事务,就在非事务状态下执行.
**NEVER:**必须在非事务状态下执行,如果当前没有事务,正常执行,如果当前有事务,报错.
**NOT_SUPPORTED:**必须在非事务下执行,如果当前没有事务,正常执行,如果当前有事务,把当前事务挂起.
**MANDATORY:**必须在事务内部执行,如果当前有事务,就在事务中执行,如果没有事务,报错.(可以配置在入口方法)
**REQUIRES_NEW:**必须在事务中执行,如果当前没有事务,新建事务,如果当前有事务,把当前事务挂起. 在重新建一个事务。(调用者统一提交回滚),两个事务
NESTED:必须在事务状态下执行.如果没有事务,新建事务,如果当前有事务,创建一个嵌套事务.
事务隔离级别
出现的问题:
脏读:
事务A没有提交事务,事务B读取到事务A未提交的数据,这个过程称为脏读。读取到的数据叫做脏数据。
不可重复读:(针对数据的修改)
当事务A读取到表中一行数据时,同时另一个事务修改这行数据,事务A读取到的数据和表中真实数据不一致。
幻读:(针对数据的添加)
事务A对表做查询全部操作,事务B向表中新增一条数据。事务A查询出来的数据和表中数据不一致,称为幻读。
对应的解决问题的事务的隔离级别:
READ_UNCOMMITTED:读未提交(存在问题: 脏读,幻读,不可重复读)
READ_COMMITTED:读已提交(存在问题: 幻读,不可重复读)
REPEATABLE_READ:可重复读(存在问题: 幻读)
SERIALIZABLE: 串行读来通过牺牲性能解决脏读、不可重复度、幻读问题。
Bean的生命周期
实例化 -> 属性赋值 -> 初始化 -> 销毁
相关文章:

Spring注解-Spring-boot-SpingAOP
Spring各个模块 Test 对应spring-test.jar. Spring提供的测试工具, 可以整合JUnit测试, 简化测试环节. Core Container Spring的核心组件, 包含了Spring框架最基本的支撑. Beans, 对应spring-beans.jar. Spring进行对象管理时依赖的jar包. Core, 对应spring-core.jar,…...

使用Shell传参解决DataPhin中PySpark不支持中文的问题
使用Shell传参解决DataPhin中PySpark不支持中文的问题 背景 笔者开发PySpark任务时【别问为神马不用Java和Scala打Jar包的方式,PySpark不需要打包所以开发效率极高,早点搞完早点下班】,遇到一个令所有SQL Boy都很头疼的问题,那就…...

【CDH】cloudera manger 如何开启Debug 日志调试模式
前言 在安装 Cloudera Manger 时,遇到报错,需要开启Debug 日志级别来排查下问题原因。这里记录下 CM 如何开启 Debug 级别。 方法一:为整个服务启动DEBUG 如果 CM 无法启动,则可以为整个服务器启用 DEBUG 或 TRACE。 警告&…...
SQL Server 用户授权与回收
创建xxbbbb账号,账号可以在Company_report20221019.dbo.qfacccmprf表中进行select、 insert,update,delete --创建登录账号 create login xxbbbb with password12345#---创建用户 use Company_report20221019 create user xxbbbb for login xxbbbb---将qfacccmprf表…...

电脑出现乱码的原因以及解决方法
在日常使用电脑的过程中,经常会遇到电脑出现乱码,那么为什么会出现乱码呢?出现乱码又该怎么解决呢?下面我们一起来了解一下。 出现乱码的原因 系统乱码:主要是Windows中显示乱码,比如菜单、桌面、启动界面…...
网络工程师笔记
第一天: 编码就是转化为数字信号;调制就是转化为模拟信号; 调制: 1、基带调制(不改变频率,只改变波形) 2、带通调制(迁移到较高的频段进行传输) (1&…...
linux用户添加用户组与目录切换用户组的操作记录
linux用户添加到多个组 usermod -G groupname username (这种会把用户从其他组中去掉,只属于该组) 如:usermod -G git git (git只属于git组) usermod -a -G groupname username (把用户添加到这个组,之前所属组不影响) 如:usermod…...
在CentOS 7上使用二进制文件安装单节点Kubernetes的详细步骤:
确保您的系统已经安装了Docker和etcd。如果没有,请按照以下命令安装它们: yum install docker etcd 启动Docker服务并将其设置为开机自启: systemctl start docker systemctl enable docker 下载所需的Kubernetes二进制文件。您可以从以下网…...

iCollections for mac 8.0.6.80608 保持Mac桌面的整洁
应用介绍 iCollections允许您在桌面上创建区域,以便您可以排序和排列图标。这可以帮助您将相关项目保持在一起,以便文件(图片,文档,屏幕截图,应用程序等)井井有条且易于查找。 小麦测试可以按照…...

学习HM微博项目第8天
步骤:发微博01-导航栏内容 -> 发微博02-自定义TextView -> 发微博03-完善TextView和发送微博按钮 -> 发微博04-显示工具条 -> 发微博05-封装工具条和相册 -> 发微博06-发送微博 发微博01-导航栏内容 APP的演示操作: 从APP的演示操作中可…...

十五、存储过程与函数
一、存储过程概述 1、简介 含义:存储过程的英文是 Stored Procedure 。它的思想很简单,就是一组经过 预先编译 的 SQL 语句的封装 执行过程:存储过程预先存储在 MySQL 服务器上,需要执行的时候,客户端只需要向服务器…...

php实现助记词转TRX,ETH 私钥和钱包地址
TRX助记词转地址网上都是Java,js或其他语言开发的示例,一个简单的功能需要依赖其他环境来实现表示不能忍,毕竟php是世界上最好的语言。【狗头】 一、知识准备 要实现助记词转TRX私钥和地址,先需要知道助记词和私钥钱包地址之间的…...

浅析可观测系统中sdk的不同引入方式的利与弊
文章前提是不考虑sw的方式引入,同时不考虑在nginx等自动注入js脚本的方式,那么基本就是两种大的形式:cdn引入和本地引入其中cdn引入有两种:cdn同步cdn异步本地引入有两种:npm本地js文件参考知识提前先补充一张图片正文…...
Google Earth导入经纬高(txt文件)
目录 一、提取GNSS数据生成txt文本文件 二、Google Earth导入txt文件 1、启动Google Earth 2、打开vig_result.txt...

Unity客户端开发工程师的进阶之路
UWA技能成长系统是UWA根据学员的职业发展目标,提供技能学习的推荐路径,再将所需学习内容按难易等多维度,设计分成多个学习阶段,可以循序渐进地进行学习。 进入技能成长体系,目标选择高级客户端开发工程师(U…...
2023年全国最新高校辅导员精选真题及答案34
百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 72.心理发展的特点是()。 A.方向性与不可逆性 B.连续性与阶段性…...
chatGPT身份指令
充当 Linux 终端 我想让你充当 Linux 终端。我将输入命令,您将回复终端应显示的内容。我希望您只在一个唯一的代码块内回复终端输出,而不是其他任何内容。不要写解释。除非我指示您这样做,否则不要键入命令。当我需要用英语告诉你一些事情时&…...

基于springboot实现私人健身与教练预约管理系统【源码+论文】分享
基于springboot实现私人健身与教练预约管理系统演示开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea M…...
网络技术领域术语大全,含中英文及缩写,强烈建议收藏!
你好,这里是网络技术联盟站。 今天给大家分享的是网络技术领域相关的术语大全,在文末,我已经将本文整理成一个pdf文档了,大家可以下载到本地以便查阅。 自主访问控(DAC:Discretionary Access Control) 自主访问控制(DAC)是一个…...

C++源码剖析——vector和array
前言:之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。 摘要:本文描述了llvm中libcxx的std::vector的实现。 关键字&…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...