关于Spring底子相识

[复制链接]
发表于 2025-12-18 04:42:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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;
  1. @Autowired
  2. public UserService(UserRepository userRepository) {
  3.    this.userRepository = userRepository;
  4. }
  5. ​
  6. public User getUserById(int id) {
  7.    return userRepository.findById(id);
  8. }
复制代码
}

上风:

低沉耦合度:对象不再负责管理本身的依赖,而是由外部容器管理,低沉了对象之间的耦合度。 进步可测试性:依赖关系可以通过构造函数或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()); }
  1. @After("execution(* com.example.service.*.*(..))")
  2. public void logAfter(JoinPoint joinPoint) {
  3.    System.out.println("After method: " + joinPoint.getSignature());
  4. }
复制代码
}

上风:

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

  •         声明式事件管理 界说:通过简单的设置,Spring框架可以在方法调用前后自动管理事件的开始、提交和回滚。
实现方式:
// UserService.java @Service public class UserService { private final UserRepository userRepository;
  1. @Autowired
  2. public UserService(UserRepository userRepository) {
  3.    this.userRepository = userRepository;
  4. }
  5. ​
  6. @Transactional
  7. public void createUser(User user) {
  8.    userRepository.save(user);
  9. }
复制代码
}

上风:

简化事件管理:开发者不必要手动编写事件管理代码,只需设置即可。 细粒度控制:可以针对差别的方法或类设置差别的事件管理计谋。 同等性:事件管理规则会集设置,便于维护和管理。

  •         强大的MVC框架 界说:Spring MVC是Spring框架的一部门,用于构建Web应用步伐。它依照MVC(Model-View-Controller)筹划模式。
实现方式:
// UserController.java @Controller @RequestMapping("/users") public class UserController { private final UserService userService;
  1. @Autowired
  2. public UserController(UserService userService) {
  3.    this.userService = userService;
  4. }
  5. ​
  6. @GetMapping("/{id}")
  7. public String getUserById(@PathVariable int id, Model model) {
  8.    User user = userService.getUserById(id);
  9.    model.addAttribute("user", user);
  10.    return "userDetails";
  11. }
  12. ​
  13. @PostMapping
  14. public String createUser(@ModelAttribute User user) {
  15.    userService.createUser(user);
  16.    return "redirect:/users";
  17. }
复制代码
}

上风:

机动的哀求处理处罚:支持多种哀求映射方式,如注解、XML设置等。 丰富的视图剖析:支持多种视图技能,如JSP、Thymeleaf、FreeMarker等。 数据绑定:自动将哀求参数绑定到控制器方法的参数上,简化了数据处理处罚。

  •         集成测试支持 界说:Spring框架提供了丰富的API和工具,简化了单位测试和集成测试的编写。
实现方式:
// UserServiceTest.java @RunWith(SpringRunner.class) @SpringBootTest public class UserServiceTest { @Autowired private UserService userService;
  1. @MockBean
  2. private UserRepository userRepository;
  3. ​
  4. @Test
  5. public void testGetUserById() {
  6.    User expectedUser = new User(1, "John Doe");
  7.    when(userRepository.findById(1)).thenReturn(expectedUser);
  8. ​
  9.    User actualUser = userService.getUserById(1);
  10.    assertEquals(expectedUser, actualUser);
  11. }
复制代码
}

上风:

自动化测试:可以轻松地举行自动化测试,进步测试覆盖率。 集成测试:支持完备的Spring应用上下文加载,方便举行集成测试。 Mocking支持:提供了强大的Mocking工具,可以模拟外部体系的活动。

  •         多种数据访问技能的支持 界说:Spring框架支持多种数据访问技能,如JDBC、ORM框架(如Hibernate、MyBatis)等。
实现方式:
// UserRepositoryImpl.java @Repository public class UserRepositoryImpl implements UserRepository { private final JdbcTemplate jdbcTemplate;
  1. @Autowired
  2. public UserRepositoryImpl(JdbcTemplate jdbcTemplate) {
  3.    this.jdbcTemplate = jdbcTemplate;
  4. }
  5. ​
  6. @Override
  7. public User findById(int id) {
  8.    String sql = "SELECT * FROM users WHERE id = ?";
  9.    return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));
  10. }
复制代码
}

上风:

同一的数据访问抽象:提供了同一的数据访问抽象层,简化了数据库操纵。 事件管理:支持多种事件管理计谋,确保数据的同等性。 非常转换:自动将数据库非常转换为Spring框架的非常,便于处理处罚。 安全性 Spring框架的安全性重要通过其子项目Spring Security来实现。Spring Security是一个强大的安全框架,提供了以下重要功能:

  •         认证(Authentication) 界说:验证用户身份的过程。
实现方式:
// SecurityConfig.java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService;
  1. @Override
  2. protected void configure(HttpSecurity http) throws Exception {
  3.    http
  4.        .authorizeRequests()
  5.            .antMatchers("/", "/home").permitAll()
  6.            .anyRequest().authenticated()
  7.        .and()
  8.        .formLogin()
  9.            .loginPage("/login")
  10.            .permitAll()
  11.        .and()
  12.        .logout()
  13.            .permitAll();
  14. }
  15. ​
  16. @Override
  17. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  18.    auth.userDetailsService(userDetailsService);
  19. }
复制代码
}

用户详情服务:
// UserDetailsServiceImpl.java @Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private UserRepository userRepository;
  1. @Override
  2. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  3.    User user = userRepository.findByUsername(username);
  4.    if (user == null) {
  5.        throw new UsernameNotFoundException("User not found");
  6.    }
  7.    return new org.springframework.security.core.userdetails.User(
  8.        user.getUsername(), user.getPassword(), getAuthorities(user.getRoles())
  9.    );
  10. }
  11. ​
  12. private Collection<? extends GrantedAuthority> getAuthorities(List<Role> roles) {
  13.    return roles.stream()
  14.        .map(role -> new SimpleGrantedAuthority(role.getName()))
  15.        .collect(Collectors.toList());
  16. }
复制代码
}

上风:

多认证方式:支持多种认证方式,如表单登录、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框架。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表