关于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框架。

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

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

相关文章

Java 反射(Reflection)

Java 反射&#xff08;Reflection&#xff09; Java 反射&#xff08;Reflection&#xff09;是一个强大的特性&#xff0c;它允许程序在运行时查询、访问和修改类、接口、字段和方法的信息。反射提供了一种动态地操作类的能力&#xff0c;这在很多框架和库中被广泛使用&#…

深入浅出剖析典型文生图产品Midjourney

2022年7月,一个小团队推出了公测的 Midjourney,打破了 AIGC 领域的大厂垄断。作为一个精调生成模型,以聊天机器人方式部署在 Discord,它创作的《太空歌剧院》作品,甚至获得了美国「数字艺术/数码摄影」竞赛单元一等奖。 这一事件展示了 AI 在绘画领域惊人的创造力,让人们…

【Linux】磁盘 | 文件系统 | inode

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 模电好难啊&#xff…

PHP 去掉特殊不可见字符 “\u200e“

描述 最近在排查网站业务时&#xff0c;发现有数据匹配失败的情况 肉眼上完全看不出问题所在 当把字符串 【M24308/23-14F‎】复制出来发现 末尾有个不可见的字符 使用删除键或左右移动时才会发现 最后测试通过 var_dump 打印 发现这个"空字符"占了三个长度 &#xf…

【C#设计模式(15)——命令模式(Command Pattern)】

前言 命令模式的关键通过将请求封装成一个对象&#xff0c;使命令的发送者和接收者解耦。这种方式能更方便地添加新的命令&#xff0c;如执行命令的排队、延迟、撤销和重做等操作。 代码 #region 基础的命令模式 //命令&#xff08;抽象类&#xff09; public abstract class …

使用zabbix监控k8s

一、 参考文献 小阿轩yx-案例&#xff1a;Zabbix监控kubernetes云原生环境 手把手教你实现zabbix对Kubernetes的监控 二、部署经验 关于zabbix监控k8s&#xff0c;总体来说是分为两块内容&#xff0c;一是在k8s集群部署zabbix-agent和zabbix- proxy。二是在zabbix进行配置。…

ThingsBoard规则链节点:GCP Pub/Sub 节点详解

目录 引言 1. GCP Pub/Sub 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 数据传输 3.2 数据分析 3.3 事件通知 3.4 任务调度 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0…

10.机器学习--集成学习

机器学习领域有一个强大的思路&#xff1a;集成学习&#xff0c;该方法在诸多机器学习竞赛中往往能够获得最优的结果。集成学习的基本思想实际上非常简单&#xff1a;三个臭皮匠顶一个诸葛亮&#xff0c;即将多个模型组合在一起获得的效果往往要强于单一模型。 目录 集成学习…

结构体详解+代码展示

系列文章目录 &#x1f388; &#x1f388; 我的CSDN主页:OTWOL的主页&#xff0c;欢迎&#xff01;&#xff01;&#xff01;&#x1f44b;&#x1f3fc;&#x1f44b;&#x1f3fc; &#x1f389;&#x1f389;我的C语言初阶合集&#xff1a;C语言初阶合集&#xff0c;希望能…

深度解析猎板 PCB树脂塞孔工艺

PCB 的树脂塞孔工艺是一种在印制电路板制造过程中广泛应用的重要技术&#xff0c;以下是猎板PCB批量工厂对PCB树脂塞孔该工艺的详细介绍&#xff1a; 猎板 PCB树脂塞孔工艺目的 防止短路&#xff1a;在 PCB 制造中&#xff0c;若过孔未被有效封堵&#xff0c;锡膏可能会从孔内…

扫雷-完整源码(C语言实现)

云边有个稻草人-CSDN博客 在学完C语言函数之后&#xff0c;我们就有能力去实现简易版扫雷游戏了&#xff08;成就感满满&#xff09;&#xff0c;下面是扫雷游戏的源码&#xff0c;快试一试效果如何吧&#xff01; 在test.c里面进行扫雷游戏的测试&#xff0c;game.h和game.c…

当前就业形势下C++方向后端开发学习指南

文章目录 1. C后端开发的职业方向1.1 C的应用领域1.2 后端开发的职业选择 2. 当前就业形势分析2.1 C开发者的市场需求2.2 C开发者的薪资水平 3. 学习路线3.1 入门阶段&#xff1a;掌握基础知识3.2 进阶阶段&#xff1a;掌握后端开发的核心技术3.2.1 数据库与C3.2.2 网络编程 3.…

FFmpeg 简介与编译

1. ffmpeg 简介&#xff1a; FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec&#xff0c;为了保证高可移…

【论文复现】BERT论文解读及情感分类实战

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ BERT论文解读及情感分类实战 简介BERT文章主要贡献BERT模型架构技术细节任务1 Masked LM&#xff08;MLM&#xff09;任务2 Next Sentence P…

Flink高可用配置(HA)

从Flink架构中我们可以看到,JobManager这个组件非常重要,是中心协调器,负责任务调度和资源管理。默认情况下,每个Flink集群只有一个JobManager实例。这会产生单点故障(SPOF):如果JobManager崩溃,则无法提交新程序,正在运行的程序也会失败。通过JobManager的高可用性,…

【Rabbitmq篇】高级特性----事务,消息分发

目录 事务 消息分发 应用场景 1. 限流 2.负载均衡 事务 RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,因此RabbitMQ也支持事务机制.SpringAMQP也提供了对事务相关的操作.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的,要么全部成功,要么全部失败. 何为原…

优先算法 —— 双指针系列 - 有效三角形的个数

1. 有效三角形的个数 题目链接&#xff1a; 611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/valid-triangle-number/description/ 2. 题目解析 以示例1为例&#xff1a; 3. 优化 我们都知道&#xff0c;判断三角形的方法就是两边相…

【H2O2|全栈】Node.js(2)

目录 前言 开篇语 准备工作 npm 概念 常见指令 项目中的包 创建项目 启动项目 服务器搭建 express 基本步骤 搭建应用 创建路由 监听端口 启动服务器 面试相关 结束语 前言 开篇语 本系列博客分享Node.js的相关知识点&#xff0c;本章讲解npm与服务器的简单…

Android 13 Aosp 默认允许应用动态权限

图库 frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java 修改 public void grantDefaultPermissions(int userId) {DelayingPackageManagerCache pm new DelayingPackageManagerCache();grantPermissionsToSysCompon…

【NLP高频面题 - LLM架构篇】LLM对Transformer都有哪些优化?

【NLP高频面题 - LLM架构篇】LLM对Transformer都有哪些优化&#xff1f; ⚠︎ 重要性&#xff1a;★★★ &#x1f4af; NLP Github 项目&#xff1a; NLP 项目实践&#xff1a;fasterai/nlp-project-practice 介绍&#xff1a;该仓库围绕着 NLP 任务模型的设计、训练、优化、…