前端进阶全栈计划:Spring扫盲

07-08 1183阅读

Spring扫盲

前端进阶全栈计划:Spring扫盲

spring 和 springboot的关系?

类比前端:vue.js和nuxt.js的关系

Spring Boot 是基于 Spring 框架的快速开发工具,简化了 Spring 应用的配置和部署。

spring核心特性

1. 依赖注入

依赖注入是Spring框架的核心功能之一。它允许你通过配置将对象的依赖关系注入到对象中,而不是在代码中直接创建依赖对象。这使得代码更加松散耦合,更容易测试和维护。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service // 1. 标注这个类是一个Spring服务组件
public class UserService {
    
    // 2. 声明一个UserRepository类型的成员变量,这个变量会被Spring容器注入依赖
    private final UserRepository userRepository;
    @Autowired // 3. 使用@Autowired注解指示Spring在创建UserService实例时注入UserRepository依赖
    public UserService(UserRepository userRepository) {
        // 4. 通过构造函数注入,将传入的UserRepository实例赋值给成员变量
        this.userRepository = userRepository;
    }
    // 5. 服务类的方法可以使用注入的UserRepository进行数据库操作
    public List findAllUsers() {
        return userRepository.findAll();
    }
}

2. 面向切面编程(AOP)

允许你将横切关注点(如日志记录、事务管理、安全性等)从业务逻辑中分离出来。这使得代码更加清晰,并且可以更容易地重用这些横切关注点。

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect // 1. 标注这个类是一个Aspect(切面),定义横切关注点
@Component // 2. 将这个类声明为Spring的组件,使得Spring容器可以管理它的生命周期
public class LoggingAspect {
    
    @Before("execution(* com.example.service.*.*(..))") // 3. 定义一个前置通知,在目标方法执行之前运行
    public void logBefore(JoinPoint joinPoint) {
        // 4. JoinPoint参数提供对连接点(目标方法)的访问
        System.out.println("Method called: " + joinPoint.getSignature().getName());
        // 5. 输出目标方法的签名(名称)
    }
}

3. 模块化架构

Spring框架是模块化的,你可以根据需要选择和使用不同的模块。常用模块包括:

  • Spring Core:提供依赖注入和核心容器。
  • Spring AOP:提供面向方面编程支持。
  • Spring ORM:提供与ORM框架(如Hibernate)的集成。
  • Spring MVC:提供Web应用开发的支持。
  • Spring Security:提供安全性支持。
  • Spring Data:简化数据访问层的开发。

    4. 声明式事务管理

    Spring提供了声明式事务管理,你可以使用注解或XML配置来定义事务边界,而无需在代码中显式管理事务。

    // 标注这个类为一个服务类,通常由Spring IOC容器管理
    @Service
    public class TransactionalService {
        // 使用@Transactional注解表示该方法是一个事务性操作
        // 声明式事务管理:使用注解的方式来管理事务,无需手动控制事务的开始、提交和回滚
        @Transactional
        public void performTransactionalOperation() {
            // 在这个方法中执行的所有数据库操作会在一个事务中进行
            // 如果方法执行过程中抛出未捕获的运行时异常,则事务会被回滚
            // 否则,事务会在方法执行完毕后提交
        }
    }
    

    5. 数据访问抽象

    Spring提供了对JDBC、JPA、Hibernate等数据访问技术的抽象和简化,使得数据访问层的代码更加简洁和容易维护。

     @Repository
      public interface UserRepository extends JpaRepository {
          // Spring Data JPA repository interface
      }
    

    6. spring mvc

    Spring MVC是一个强大的Web框架,提供了用于构建Web应用程序的工具和功能。它遵循Model-View-Controller(MVC)设计模式,分离了业务逻辑、视图和控制器。

      @Controller
      public class UserController {
          @GetMapping("/users")
          public String getUsers(Model model) {
              model.addAttribute("users", userService.findAll());
              return "userList";
          }
      }
    

    7. spring security

    Spring Security是一个功能强大的安全框架,提供了全面的认证和授权功能。它可以保护Web应用、方法调用以及提供基于声明的安全性配置。

    // 使用@Configuration注解标记这是一个配置类
    @Configuration
    // 通过@EnableWebSecurity注解开启Spring Security的功能
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
      
      // 重载configure方法以配置如何通过拦截器保护请求
      @Override
      protected void configure(HttpSecurity http) throws Exception {
          http
              // 对请求进行授权
              .authorizeRequests()
                  // 指定路径 "/admin/**" 下的请求需要具备 "ADMIN" 角色
                  .antMatchers("/admin/**").hasRole("ADMIN")
                  // 除了 "/admin/**" 外的所有请求都需要认证
                  .anyRequest().authenticated()
                  .and()
              // 配置表单登录
              .formLogin()
                    // 允许所有用户访问我们的登录页(例如登录页面,失败页面等)
                  .permitAll();
      }
    }
    

    8. 远程访问和消息传递

    Spring提供了对远程调用(如RMI、Hessian、Burlap、HTTP Invoker)和消息传递(如JMS、AMQP)的支持,简化了分布式系统的开发。

    // 使用@Component注解标记这个类为Spring的组件。
    // 这意味着Spring会在启动时自动扫描并注册这个类的实例到Spring应用上下文中。
    @Component
    public class MessageReceiver {
        
        // @JmsListener注解标记这个方法为一个JMS消息监听器方法,用于接收消息。
        // destination属性指定了这个监听器所监听的目的地(队列或主题)的名称。
        @JmsListener(destination = "queue.name")
        public void receiveMessage(String message) {
            // 当消息到达指定的目的地时,此方法会被调用,并将接收到的消息作为参数传入。
            // 这里仅将接收到的消息打印到控制台。
            System.out.println("Received message: " + message);
        }
    }
    

    9. 外部化配置

    Spring支持将应用配置外部化,通过application.properties或application.yml文件,以及环境变量、命令行参数等方式进行配置管理。

     # application.properties
      server.port=8080
    

    10. 测试支持

    Spring提供了全面的测试支持,允许你使用Spring的依赖注入和上下文管理来编写单元测试和集成测试。

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    import java.util.List;
    import static org.junit.Assert.assertNotNull;
    @RunWith(SpringRunner.class) // 1. 使用SpringRunner来运行测试,这个类是Spring和JUnit的集成支持
    @SpringBootTest // 2. 标注这是一个Spring Boot的测试类,启动整个Spring上下文
    public class UserServiceTest {
        @Autowired // 3. 自动注入UserService实例
        private UserService userService;
        @Test // 4. 标注这是一个测试方法
        public void testFindAllUsers() {
            // 5. 调用UserService的findAll方法
            List users = userService.findAll();
            // 6. 断言结果不为null
            assertNotNull(users);
        }
    }
    
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]