当前位置: 首页 > news >正文

关于Spring基础了解

Spring简介

Spring框架是一个开源的Java应用框架,旨在简化企业级应用程序的开发。它提供了一系列强大的工具和服务,帮助开发者构建高质量的Java应用程序。Spring框架的核心理念是使开发过程更加模块化、可测试和可维护。

主要特性

  1. 依赖注入(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方法注入,使得单元测试更加容易。 灵活的配置:可以通过配置文件或注解轻松修改依赖关系,而无需修改代码。

  1. 面向切面编程(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());
}

}

优势:

模块化:将横切关注点分离出来,使得业务逻辑更加清晰。 可复用:切面可以应用于多个类或方法,提高了代码的复用性。 动态性:切面可以在运行时动态地应用到目标对象上,无需修改业务逻辑代码。

  1. 声明式事务管理 定义:通过简单的配置,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);
}

}

优势:

简化事务管理:开发者不需要手动编写事务管理代码,只需配置即可。 细粒度控制:可以针对不同的方法或类配置不同的事务管理策略。 一致性:事务管理规则集中配置,便于维护和管理。

  1. 强大的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等。 数据绑定:自动将请求参数绑定到控制器方法的参数上,简化了数据处理。

  1. 集成测试支持 定义: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工具,可以模拟外部系统的行为。

  1. 多种数据访问技术的支持 定义: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是一个强大的安全框架,提供了以下主要功能:

  1. 认证(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、数据库等认证源。

  1. 授权(Authorization) 定义:控制用户对资源的访问权限。

实现方式:

// Controller with authorization @Controller @RequestMapping("/admin") public class AdminController { @PreAuthorize("hasRole('ADMIN')") @GetMapping("/dashboard") public String adminDashboard() { return "admin/dashboard"; } }

优势:

细粒度控制:可以对特定方法或URL进行权限控制。 方法级别的安全:支持在方法级别上进行权限检查。

  1. 保护常见安全漏洞 定义:提供针对常见安全漏洞的防护措施。

实现方式:

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应用框架&#xff0c;旨在简化企业级应用程序的开发。它提供了一系列强大的工具和服务&#xff0c;帮助开发者构建高质量的Java应用程序。Spring框架的核心理念是使开发过程更加模块化、可测试和可维护。 主要特性 依赖注入&#xff08…...

输入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的属性&#xff0c;方法 Vscode中图标含意 list 与 iterator 的区别&#xff0c;尤其yield的用法 2 方法 知乎搜索DataLoader的属性&#xff0c;方法 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 中用于将数据集拆分为训练集和测试集的函数。这个函数非常有用&#xff0c;因为在机器学习中&#xff0c;我们通常需要将数据集分为训…...

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&#xff08;Structured Query Language&#xff09;作为一种强大的数据库查询语言&#xff0c;广泛应用于各种数据库管理系统中。在SQL查询中&#xff0c;EXISTS子句是一种非常实用的工具&#xff0c;用于检查子查询中是否存在至少一行数…...

33.Java冒泡排序

冒泡排序&#xff1a; 一种排序的方式&#xff0c;对要进行排序的数据中相邻的数据进行两两比较&#xff0c;将较大的数据放在后面&#xff0c;依次对所有的数据进行操作&#xff0c;直至所有数据按要求完成排序. package Javase;import sun.security.util.ByteArrayTagOrder…...

Docker容器ping不通外网问题排查及解决

Docker容器ping不通外网问题排查及解决 解决方案在最下面&#xff0c;不看过程的可直接拉到最下面。 一台虚拟机里突然遇到docker容器一直访问外网失败&#xff0c;网上看到这个解决方案&#xff0c;这边记录一下。 首先需要明确docker的网桥模式&#xff0c;网桥工作在二层…...

JavaScript 库 number-precision 如何使用?

number-precision 是一个 JavaScript 库&#xff0c;主要用于处理 JavaScript 中的数字精度问题。它提供了一些方法&#xff0c;帮助你进行数字运算时保持精度&#xff0c;尤其是在涉及到浮点数运算时&#xff0c;它能够避免传统 JavaScript 中精度丢失的问题。 例如&#xff…...

faiss库中ivf-sq(ScalarQuantizer,标量量化)代码解读-2

文件ScalarQuantizer.h 主要介绍这里面的枚举以及一些函数内容&#xff1a;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 浅复制&#xff1a;dup 方法创建对象的浅复制。 不复制冻结状态&#xff1a;dup 不会复制对象的冻结状态。 不复制单例方法&#xff1a;dup 不会复制对象的单例方法。 deep_dup 深复制&#xff1a;deep_dup 方法创建对象的深复制&#xff0c;递归复制嵌套的对象。…...

原生微信小程序画表格

wxml部分&#xff1a; <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代理池一、引言二、步骤一&#xff1a;获取代理IP1、第一步&#xff1a;爬取代理IP2、第二步&#xff1a;验证代理IP的有效性 三、步骤二&#xff1a;构建IP代理池四、使用示例1、完整的使用示例2、注意事项3、处理网络问题 五、总结 Python实现IP代理池 …...

互联网直播/点播EasyDSS视频推拉流平台视频点播有哪些技术特点?

在数字化时代&#xff0c;视频点播应用已经成为我们生活中不可或缺的一部分。监控技术与视频点播的结合正悄然改变着我们获取和享受媒体内容的方式。这一变革不仅体现在技术层面的进步&#xff0c;更深刻地影响了我们。 EasyDSS视频直播点播平台是一款高性能流媒体服务软件。E…...

32.4 prometheus存储磁盘数据结构和存储参数

本节重点介绍 : prometheus存储磁盘数据结构介绍 indexchunkshead chunksTombstoneswal prometheus对block进行定时压实 compactprometheus 查看支持的存储参数 prometheus存储示意图 内存和disk之间的纽带 wal WAL目录中包含了多个连续编号的且大小为128M的文件&#xff0c…...

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访问端口&#xff08;相当于向外部提供可访问端口&#xff09; 4.将tomcat项目放在服务器tomcat的webapps里面 5.在mysql里创建项目数据库&#xff0c;运行sql创建表和导入数据 6.在配置文…...

剪映自动批量替换视频、图片素材教程,视频批量复刻、混剪裂变等功能介绍

一、三种批量替换模式的区别 二、混剪裂变替换素材 三、分区混剪裂变替换素材 四、按组精确替换素材 五、绿色按钮教程 &#xff08;一&#xff09;如何附加音频和srt字幕 &#xff08;二&#xff09;如何替换固定文本的内容和样式 &#xff08;三&#xff09;如何附加…...

el-dialog中调用resetFields()方法重置表单报错

前言 在开发中&#xff0c;弹框和表单是两个常见的组件&#xff0c;它们通常一起使用以实现用户交互和数据输入。然而&#xff0c;当我们尝试在弹框中调用表单的 resetFields() 方法时&#xff0c;有时会遇到报错的情况。 一、用法错误 确保 this.$refs[ruleForm].resetFields…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...