关于Spring基础了解
Spring简介
Spring框架是一个开源的Java应用框架,旨在简化企业级应用程序的开发。它提供了一系列强大的工具和服务,帮助开发者构建高质量的Java应用程序。Spring框架的核心理念是使开发过程更加模块化、可测试和可维护。
主要特性
-
依赖注入(Dependency Injection, DI) 定义:DI是一种设计模式,用于实现控制反转(Inversion of Control, IoC)。通过DI,对象的依赖关系由外部容器管理,而不是由对象自己创建。
实现方式:
XML配置:
<!-- applicationContext.xml --> <bean id="userService" class="com.example.service.UserService"> <property name="userRepository" ref="userRepository"/> </bean>
<bean id="userRepository" class="com.example.repository.UserRepositoryImpl"/>
注解配置:
// UserRepository.java public interface UserRepository { User findById(int id); }
// UserRepositoryImpl.java @Repository public class UserRepositoryImpl implements UserRepository { @Override public User findById(int id) { // 实现查找用户逻辑 return new User(); } }
// UserService.java @Service public class UserService { private final UserRepository userRepository;
@Autowired public UserService(UserRepository userRepository) {this.userRepository = userRepository; } public User getUserById(int id) {return userRepository.findById(id); }
}
优势:
降低耦合度:对象不再负责管理自己的依赖,而是由外部容器管理,降低了对象之间的耦合度。 提高可测试性:依赖关系可以通过构造函数或setter方法注入,使得单元测试更加容易。 灵活的配置:可以通过配置文件或注解轻松修改依赖关系,而无需修改代码。
-
面向切面编程(Aspect-Oriented Programming, AOP) 定义:AOP允许开发者将横切关注点(如日志记录、事务管理)从业务逻辑中分离出来,封装成独立的模块。
实现方式:
// LoggingAspect.java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service..(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("Before method: " + joinPoint.getSignature()); }
@After("execution(* com.example.service.*.*(..))") public void logAfter(JoinPoint joinPoint) {System.out.println("After method: " + joinPoint.getSignature()); }
}
优势:
模块化:将横切关注点分离出来,使得业务逻辑更加清晰。 可复用:切面可以应用于多个类或方法,提高了代码的复用性。 动态性:切面可以在运行时动态地应用到目标对象上,无需修改业务逻辑代码。
-
声明式事务管理 定义:通过简单的配置,Spring框架可以在方法调用前后自动管理事务的开始、提交和回滚。
实现方式:
// UserService.java @Service public class UserService { private final UserRepository userRepository;
@Autowired public UserService(UserRepository userRepository) {this.userRepository = userRepository; } @Transactional public void createUser(User user) {userRepository.save(user); }
}
优势:
简化事务管理:开发者不需要手动编写事务管理代码,只需配置即可。 细粒度控制:可以针对不同的方法或类配置不同的事务管理策略。 一致性:事务管理规则集中配置,便于维护和管理。
-
强大的MVC框架 定义:Spring MVC是Spring框架的一部分,用于构建Web应用程序。它遵循MVC(Model-View-Controller)设计模式。
实现方式:
// UserController.java @Controller @RequestMapping("/users") public class UserController { private final UserService userService;
@Autowired public UserController(UserService userService) {this.userService = userService; } @GetMapping("/{id}") public String getUserById(@PathVariable int id, Model model) {User user = userService.getUserById(id);model.addAttribute("user", user);return "userDetails"; } @PostMapping public String createUser(@ModelAttribute User user) {userService.createUser(user);return "redirect:/users"; }
}
优势:
灵活的请求处理:支持多种请求映射方式,如注解、XML配置等。 丰富的视图解析:支持多种视图技术,如JSP、Thymeleaf、FreeMarker等。 数据绑定:自动将请求参数绑定到控制器方法的参数上,简化了数据处理。
-
集成测试支持 定义:Spring框架提供了丰富的API和工具,简化了单元测试和集成测试的编写。
实现方式:
// UserServiceTest.java @RunWith(SpringRunner.class) @SpringBootTest public class UserServiceTest { @Autowired private UserService userService;
@MockBean private UserRepository userRepository; @Test public void testGetUserById() {User expectedUser = new User(1, "John Doe");when(userRepository.findById(1)).thenReturn(expectedUser); User actualUser = userService.getUserById(1);assertEquals(expectedUser, actualUser); }
}
优势:
自动化测试:可以轻松地进行自动化测试,提高测试覆盖率。 集成测试:支持完整的Spring应用上下文加载,方便进行集成测试。 Mocking支持:提供了强大的Mocking工具,可以模拟外部系统的行为。
-
多种数据访问技术的支持 定义:Spring框架支持多种数据访问技术,如JDBC、ORM框架(如Hibernate、MyBatis)等。
实现方式:
// UserRepositoryImpl.java @Repository public class UserRepositoryImpl implements UserRepository { private final JdbcTemplate jdbcTemplate;
@Autowired public UserRepositoryImpl(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate; } @Override public User findById(int id) {String sql = "SELECT * FROM users WHERE id = ?";return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class)); }
}
优势:
统一的数据访问抽象:提供了统一的数据访问抽象层,简化了数据库操作。 事务管理:支持多种事务管理策略,确保数据的一致性。 异常转换:自动将数据库异常转换为Spring框架的异常,便于处理。 安全性 Spring框架的安全性主要通过其子项目Spring Security来实现。Spring Security是一个强大的安全框架,提供了以下主要功能:
-
认证(Authentication) 定义:验证用户身份的过程。
实现方式:
// SecurityConfig.java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService;
@Override protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/home").permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService); }
}
用户详情服务:
// UserDetailsServiceImpl.java @Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private UserRepository userRepository;
@Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username);if (user == null) {throw new UsernameNotFoundException("User not found");}return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), getAuthorities(user.getRoles())); } private Collection<? extends GrantedAuthority> getAuthorities(List<Role> roles) {return roles.stream().map(role -> new SimpleGrantedAuthority(role.getName())).collect(Collectors.toList()); }
}
优势:
多认证方式:支持多种认证方式,如表单登录、HTTP基本认证、OAuth2等。 灵活的认证源:可以轻松集成LDAP、数据库等认证源。
-
授权(Authorization) 定义:控制用户对资源的访问权限。
实现方式:
// Controller with authorization @Controller @RequestMapping("/admin") public class AdminController { @PreAuthorize("hasRole('ADMIN')") @GetMapping("/dashboard") public String adminDashboard() { return "admin/dashboard"; } }
优势:
细粒度控制:可以对特定方法或URL进行权限控制。 方法级别的安全:支持在方法级别上进行权限检查。
-
保护常见安全漏洞 定义:提供针对常见安全漏洞的防护措施。
实现方式:
CSRF保护:默认开启,可以通过配置禁用或自定义。 XSS保护:可以通过Thymeleaf等模板引擎自动转义输出。 SQL注入保护:通过使用参数化查询或ORM框架自动防止。 优势:
自动防护:许多安全防护措施是自动启用的,无需额外配置。 可定制:可以根据需要自定义安全策略。 优点 降低组件间的耦合度:
通过DI机制,组件之间的依赖关系更加清晰,降低了耦合度,提高了系统的灵活性。 提高了代码的可重用性和可测试性:
Spring框架鼓励良好的编程实践,如编程到接口而非实现,这有助于提高代码质量和可测试性。 简化了Java EE开发:
Spring框架对Java EE开发进行了简化,减少了繁琐的配置和编码工作,提高了开发效率。 强大的社区支持:
拥有庞大的开发者社区和丰富的文档资源,遇到问题时容易找到解决方案。 模块化设计:
Spring框架采用了模块化设计,可以根据需要选择和使用不同的模块,避免了不必要的依赖。 高性能:
通过缓存、连接池等机制,Spring框架可以显著提高应用程序的性能。 缺点 学习曲线陡峭:
对于初学者来说,Spring框架的学习曲线可能比较陡峭,需要一定的时间去理解和掌握。 过度配置问题:
虽然Spring提倡使用注解减少XML配置,但在某些情况下,项目中仍然可能存在大量的配置信息,这可能会导致项目结构复杂化。 性能开销:
尽管Spring框架在大多数情况下都能高效运行,但在某些特定场景下,如高并发环境下,其内部的反射机制和代理模式可能会引入额外的性能开销。 启动时间较长:
对于大型项目,Spring框架的初始化和启动时间可能较长,影响开发效率。 内存占用较高:
Spring框架管理和维护了大量的Bean实例,可能会占用较多的内存资源。 总结 Spring框架凭借其强大的功能和灵活的设计,成为了现代Java应用开发中的首选框架之一。它不仅简化了开发过程,还提供了丰富的安全性和测试支持,使得应用程序更加健壮和可靠。然而,开发者也需要根据具体项目的需求和团队的技术背景,合理选择和使用Spring框架及其相关组件。希望这些深入和专业的介绍能帮助您更好地理解和使用Spring框架。
相关文章:
关于Spring基础了解
Spring简介 Spring框架是一个开源的Java应用框架,旨在简化企业级应用程序的开发。它提供了一系列强大的工具和服务,帮助开发者构建高质量的Java应用程序。Spring框架的核心理念是使开发过程更加模块化、可测试和可维护。 主要特性 依赖注入(…...
输入json 达到预览效果
下载 npm i vue-json-pretty2.4.0 <template><div class"newBranchesDialog"><t-base-dialogv-if"addDialogShow"title"Json数据配置"closeDialog"closeDialog":dialogVisible"addDialogShow":center"…...
DataLoade类与list ,iterator ,yield的用法
1 问题 探索DataLoader的属性,方法 Vscode中图标含意 list 与 iterator 的区别,尤其yield的用法 2 方法 知乎搜索DataLoader的属性,方法 pytorch基础的dataloader类是 from torch.utils.data.dataloader import Dataloader 其主要的参数如下&…...
model_selection.train_test_split函数介绍
目录 model_selection.train_test_split函数实战 model_selection.train_test_split函数 model_selection.train_test_split 是 Scikit-Learn 中用于将数据集拆分为训练集和测试集的函数。这个函数非常有用,因为在机器学习中,我们通常需要将数据集分为训…...
Springboot 读取 resource 目录下的Excel文件并下载
代码示例: GetMapping("/download") public void download(HttpServletResponse response) {try {String filename "测试.xls";OutputStream outputStream response.getOutputStream();// 获取springboot resource 路径下的文件InputStream inputStream…...
SQL EXISTS 子句的深入解析
SQL EXISTS 子句的深入解析 引言 SQL(Structured Query Language)作为一种强大的数据库查询语言,广泛应用于各种数据库管理系统中。在SQL查询中,EXISTS子句是一种非常实用的工具,用于检查子查询中是否存在至少一行数…...
33.Java冒泡排序
冒泡排序: 一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,依次对所有的数据进行操作,直至所有数据按要求完成排序. package Javase;import sun.security.util.ByteArrayTagOrder…...
Docker容器ping不通外网问题排查及解决
Docker容器ping不通外网问题排查及解决 解决方案在最下面,不看过程的可直接拉到最下面。 一台虚拟机里突然遇到docker容器一直访问外网失败,网上看到这个解决方案,这边记录一下。 首先需要明确docker的网桥模式,网桥工作在二层…...
JavaScript 库 number-precision 如何使用?
number-precision 是一个 JavaScript 库,主要用于处理 JavaScript 中的数字精度问题。它提供了一些方法,帮助你进行数字运算时保持精度,尤其是在涉及到浮点数运算时,它能够避免传统 JavaScript 中精度丢失的问题。 例如ÿ…...
faiss库中ivf-sq(ScalarQuantizer,标量量化)代码解读-2
文件ScalarQuantizer.h 主要介绍这里面的枚举以及一些函数内容:QuantizerType、RangeStat、ScalarQuantizer、train、compute_codes、decode、SQuantizer、FlatCodesDistanceComputer、get_distance_computer、select_InvertedListScanner QuantizerType 量化类型…...
性能测试工具Grafana、InfluxDB和Collectd的搭建
一、性能监控组成简介 1、监控能力分工:这个系统组合能够覆盖从数据采集、存储到可视化的整个监控流程。Collectd可以收集各种系统和应用的性能指标,InfluxDB提供高效的时序数据存储,而 Grafana 则将这些数据以直观的方式呈现出来。2,实时性能监控:对于需要实时了解系统状…...
【ruby on rails】dup、deep_dup、clone的区别
一、区别 dup 浅复制:dup 方法创建对象的浅复制。 不复制冻结状态:dup 不会复制对象的冻结状态。 不复制单例方法:dup 不会复制对象的单例方法。 deep_dup 深复制:deep_dup 方法创建对象的深复制,递归复制嵌套的对象。…...
原生微信小程序画表格
wxml部分: <view class"table__scroll__view"><view class"table__header"><view class"table__header__item" wx:for"{{TableHeadtitle}}" wx:key"index">{{item.title}}</view></…...
Python实现IP代理池
文章目录 Python实现IP代理池一、引言二、步骤一:获取代理IP1、第一步:爬取代理IP2、第二步:验证代理IP的有效性 三、步骤二:构建IP代理池四、使用示例1、完整的使用示例2、注意事项3、处理网络问题 五、总结 Python实现IP代理池 …...
互联网直播/点播EasyDSS视频推拉流平台视频点播有哪些技术特点?
在数字化时代,视频点播应用已经成为我们生活中不可或缺的一部分。监控技术与视频点播的结合正悄然改变着我们获取和享受媒体内容的方式。这一变革不仅体现在技术层面的进步,更深刻地影响了我们。 EasyDSS视频直播点播平台是一款高性能流媒体服务软件。E…...
32.4 prometheus存储磁盘数据结构和存储参数
本节重点介绍 : prometheus存储磁盘数据结构介绍 indexchunkshead chunksTombstoneswal prometheus对block进行定时压实 compactprometheus 查看支持的存储参数 prometheus存储示意图 内存和disk之间的纽带 wal WAL目录中包含了多个连续编号的且大小为128M的文件,…...
C7.【C++ Cont】范围for的使用和auto关键字
目录 1.知识回顾 2.范围for 格式 使用 运行结果 运行过程 范围for的本意 作用 注意 3.底层分析范围for的执行过程 反汇编代码 分析 4.auto关键字 格式 基本用法 在范围for中使用auto 1.知识回顾 for循环的使用参见25.【C语言】循环结构之for文章 2.范围for C…...
联通云服务器部署老项目tomcat记录
1.先在服务器上安装mysql和tomcat 2.tomcat修改端口 3.在联通云运控平台配置tomcat访问端口(相当于向外部提供可访问端口) 4.将tomcat项目放在服务器tomcat的webapps里面 5.在mysql里创建项目数据库,运行sql创建表和导入数据 6.在配置文…...
剪映自动批量替换视频、图片素材教程,视频批量复刻、混剪裂变等功能介绍
一、三种批量替换模式的区别 二、混剪裂变替换素材 三、分区混剪裂变替换素材 四、按组精确替换素材 五、绿色按钮教程 (一)如何附加音频和srt字幕 (二)如何替换固定文本的内容和样式 (三)如何附加…...
el-dialog中调用resetFields()方法重置表单报错
前言 在开发中,弹框和表单是两个常见的组件,它们通常一起使用以实现用户交互和数据输入。然而,当我们尝试在弹框中调用表单的 resetFields() 方法时,有时会遇到报错的情况。 一、用法错误 确保 this.$refs[ruleForm].resetFields…...
分布式系统接口,如何避免重复提交
分布式系统接口,如何避免重复提交 1、基于Token的幂等设计原理实现步骤技术选型 2、基于Token的幂等设计原理实现步骤适用场景 3、幂等性设计原理实现方式 4、分布式锁原理实现方式适用场景 5、请求去重原理实现方式 6.前端防护原理实现方式适用场景 7.延迟队列原理…...
AI 声音:数字音频、语音识别、TTS 简介与使用示例
在现代 AI 技术的推动下,声音处理领域取得了巨大进展。从语音识别(ASR)到文本转语音(TTS),再到个性化声音克隆,这些技术已经深入到我们的日常生活中:语音助手、自动字幕生成、语音导…...
【论文速读】| 人工智能驱动的网络威胁情报自动化
基本信息 原文标题:AI-Driven Cyber Threat Intelligence Automation 原文作者:Shrit Shah, Fatemeh Khoda Parast 作者单位:加拿大圭尔夫大学计算机科学学院 关键词:网络威胁情报,AI自动化,攻击技术和…...
什么是域名监控?
域名监控是持续跟踪全球域名系统(DNS)中变化以发现恶意活动迹象的过程。组织可以对其拥有的域名进行监控,以判断是否有威胁行为者试图入侵其网络。他们还可以对客户的域名使用这种技术以执行类似的检查。 你可以将域名监控比作跟踪与自己实物…...
vue3 发送 axios 请求时没有接受到响应数据
<script setup> import Edit from ./components/Edit.vue import axios from axios import { onMounted,ref } from vue// TODO: 列表渲染 //装数据的列表 const list ref([]) const count ref(0) const getList async () > {//通过发送 /list 请求从后端拿到列表数…...
前端使用fontfaceobserver库实现字体设置
要使用FontFaceObserver来加载设置项目本地的字体,先确保字体文件位于项目中或者可以从服务端获取到,这样就可以使用FontFaceObserver来检测并加载这些字体 主要有以下几步: npm或者yarn安装引入fontfaceobserver字体资源引入和font-face配置…...
【人工智能】Python常用库-PyTorch常用方法教程
PyTorch 是一个强大的开源深度学习框架,以其灵活性和动态计算图而广受欢迎。以下是 PyTorch 的详细教程,涵盖从基础到实际应用的使用方法。 1. 安装与导入 1.1 安装 PyTorch 访问 PyTorch 官方网站,根据系统、Python 版本和 CUDA 支持选择安…...
Android Studio安装TalkX AI编程助手
文章目录 TalkX简介编程场景 TalkX安装TalkX编程使用ai编程助手相关文章 TalkX简介 TalkX是一款将OpenAI的GPT 3.5/4模型集成到IDE的AI编程插件。它免费提供特定场景的AI编程指导,帮助开发人员提高工作效率约38%,甚至在解决编程问题的效率上提升超过2倍…...
#渗透测试#红蓝攻防#HW#漏洞挖掘#漏洞复现02-永恒之蓝漏洞
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
gitlab自动打包python项目
现在新版的gitlab可以不用自己配置runner什么的了 直接写.gitlab-ci.yml文件就行,这里给出一个简单的依靠setup把python项目打包成whl文件的方法 首先写.gitlab-ci.yml文件,放到项目根目录里 stages: # List of stages for jobs, and their or…...
classipress wordpress 主题/网站seo哪里做的好
刚刚接触编程的小伙伴都会有这样几个疑问:为什么我安装完所谓的JDK还是什么的鬼的之后都找不到一个可以直接运行的程序?安装完之后好像还需要配置一个叫做环境变量的东西,据说很重要。到底怎么样才算配置成功,感觉电脑总是在欺负小…...
苏州吴中区做网站价格/网上销售平台
SpaceVim 是一个模块化的 Vim IDE,针对 C/C 语言的支持主要依靠 lang#c 模块以及与之相关的其它模块。的这篇文章主要介绍如何使用 SpaceVim 搭建 C/C 的开发环境,侧重介绍跟 C/C 开发相关使用技巧。在阅读这篇文章之前,可以先阅读《使用 Vim…...
赣州经开区疫情最新情况/浙江搜索引擎优化
给大家分享个自己制作的大美人桂纶镁的电子相册,希望大家喜欢!~下载地址转载于:https://blog.51cto.com/haiyang457/1127634...
东莞推广网站排名/网站制作策划
一、多重共线性及其危害我有一组自变量:它们满足下列关系:那么我们称这四个变量间存在多重共线性。这就意味着,一个变量可以被另外几个变量来解释,这就会带来两个后果1、尽管系数估计的无偏性没有收到影响,但是不幸的是…...
棋牌网站开发多少钱/免费加客源软件
添加链接描述 数论: 三种情况: 1.找到最大的数,如果这个数是<0,说明都是负数或0,找到最大的负奇数既答案 2.最大的正数和为奇数,为答案, 3.最大的正数和为偶数,判断减去最小正奇数…...
怎么做网站下单/nba最新消息交易情况
前言 最近开发的页面以及功能大都以表格为主,接口获取来的 JSON 数据大都是需要经过处理,比如时间戳需要转换,或者状态码的转义。对于这样的问题,各大主流框架都提供了类似于过滤的方法,在 Vue 中,一般是在…...