一篇文章带你了解Java SpringBoot四大核心组件

一篇文章带你了解Java Spring Boot四大核心组件

Java Spring Boot 是一款快速开发 Web 应用的框架,它提供了很多优秀的解决方案以方便我们快速构建一个可部署、高可扩展、易于维护的应用程序。在 Spring Boot 之中,有四大核心组件,它们是 Spring MVCSpring Data JPASpring SecurityThymeleaf。在本文中,我们将会详细讲解这四个组件是如何工作以及如何在我们的应用程序中使用它们。

1. Spring MVC

Spring MVC 是 Spring 框架的一部分,主要用于开发 Web 应用程序。它通过 MVC 的设计模式,将应用程序分为三部分:模型视图控制器。Controller 负责接收请求,Model 负责处理数据,View 负责渲染页面并返回给客户端。在 Spring Boot 中,只需要在 Controller 类上添加注解 @RestController@Controller 并实现相应的业务逻辑即可。

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

上面的代码示例中,我们创建了一个名为 HelloController 的类并添加了 @RestController 注解,这样就可以说明这是一个控制器。@GetMapping("/hello") 指定了 URL 路径,当用户访问 /hello 时,将触发 hello() 方法并返回字符串 Hello, World!

2. Spring Data JPA

Spring Data JPA 是 Spring Boot 中常用的一个模块,它简化了对数据库的操作,使用它可以省去大量的数据访问层代码。Spring Data JPA 从基础模块 Spring Data 开始,它的主要思想是将不同的数据源抽象为一致的数据访问模式,方便我们进行统一管理。

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

上面的代码示例中,我们使用 Spring Data JPA 定义了一个 UserRepository 接口,继承了 JpaRepository 接口并将实体类 User 和其主键类型 Long 作为泛型参数。其中,findByUsername(String username) 方法可用于根据用户名查找用户实体对象。

3. Spring Security

Spring Security 是 Spring Boot 中常用的安全框架,用于处理认证、授权和基于 web 的安全性。它基于过滤器和拦截器实现了一系列安全机制,包括基于角色的访问控制、基于表单的身份验证、基于方法的安全性控制等。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  @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.inMemoryAuthentication()
        .withUser("user").password("{noop}password").roles("USER");
  }
}

上面的代码示例中,我们创建了一个 WebSecurityConfig 类,并在类上使用了注解 @EnableWebSecurity,指定开启 Spring Security 功能。在 configure(HttpSecurity http) 方法中,规定了用户访问路径 /home/ 不需要进行身份认证即可访问,其他的请求则需要进行身份认证。在 configure(AuthenticationManagerBuilder auth) 方法中,通过 inMemoryAuthentication() 方法配置了一个用户,该用户的用户名为 user,密码为 password,角色为 USER

4. Thymeleaf

Thymeleaf 是一款服务器端 Java 模板引擎,可用于构建 Web 应用程序的前端视图。它可以将模板和数据合成 HTML 的形式返回给客户端,方便展示数据和动态生成页面。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Home</title>
</head>
<body>
    <h1 th:text="${message}"></h1>
</body>
</html>

上面的代码示例中,我们使用了 Thymeleaf 的语法,通过在 HTML 标签上添加 Thymeleaf 命名空间(xmlns:th="http://www.thymeleaf.org")来引入 Thymeleaf 的语法。其中,th:text 方法用于将 message 变量的值渲染至页面中。

示例应用程序

为了感受 Spring Boot 四大核心组件的完整使用,我们可以简单写一个演示应用程序。在这个应用程序中,我们使用了 Spring MVC、Spring Data JPA、Spring Security 和 Thymeleaf。

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
@Data
@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String username;

    private String password;

    private String email;

    public User() {}

    public User(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }
}
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}
@Controller
public class UserController {
    @Autowired
    private UserRepository userRepository;

    @GetMapping("/register")
    public String register(Model model) {
        model.addAttribute("user", new User());
        return "register";
    }

    @PostMapping("/register")
    public String register(@ModelAttribute User user) {
        userRepository.save(user);
        return "redirect:/login";
    }
}
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsServiceImpl userDetailsService;

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/register", "/login").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
                .logout()
                .logoutSuccessUrl("/login")
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }
}
@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(username);
        }
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), Collections.emptyList());
    }
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Register</title>
</head>
<body>
    <form action="#" th:action="@{/register}" th:object="${user}" method="post">
        <label for="username">Username:</label>
        <input type="text" th:field="*{username}" id="username"/>

        <label for="password">Password:</label>
        <input type="password" th:field="*{password}" id="password"/>

        <label for="email">Email:</label>
        <input type="email" th:field="*{email}" id="email"/>

        <input type="submit" value="Register"/>
    </form>
</body>
</html>

这个演示应用程序中,我们创建了一个名为 UserController 的控制器,处理用户注册的逻辑。其中,register(Model model) 方法负责渲染页面,register(@ModelAttribute User user) 方法接收用户提交的表单数据并保存到数据库中。在 WebSecurityConfig 中,我们配置了 Spring Security 的相关功能,使用了 BCryptPasswordEncoder 密码加密算法。在注册页面中,我们使用了 Thymeleaf 进行页面渲染。

这个示例程序可以通过访问 /register 进入用户注册页面,输入信息后提交表单即可完成注册。完成注册后,用户可以访问 /login 进行登录,登录后即可访问 /hello 欢迎页面和用户信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一篇文章带你了解Java SpringBoot四大核心组件 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • Java从零编写汽车租赁系统全程分析

    Java从零编写汽车租赁系统全程分析 简介 本文讲解如何使用Java从零编写汽车租赁系统。主要包括以下内容: 项目需求分析 搭建开发环境 编写实体类 编写DAO层 编写Service层 编写Controller层 实现前端界面 项目需求分析 汽车租赁系统需要实现以下功能: 用户可以在系统中注册账号,并登录系统。 用户可以浏览车辆信息,并根据条件筛选车辆。 用…

    Java 2023年5月24日
    00
  • 详细聊一聊java中封装的那点事

    接下来我将为大家讲解“详细聊一聊 Java 中封装的那点事”的攻略。 什么是封装? 封装是面向对象编程中的三大特性之一,它是指隐藏对象的属性和实现细节,仅对外部暴露一些必要的接口来与外部交互,这样可以更好地保护对象的数据,避免不必要的访问和修改。 在 Java 中,通常使用访问修饰符来实现封装,包括:public(公有的)、private(私有的)和 pro…

    Java 2023年5月26日
    00
  • 基于JAVA文件中获取路径及WEB应用程序获取路径的方法

    获取路径是编写Java程序和Web应用程序时经常遇到的一件事情,本文将介绍基于Java文件、WEB应用程序的获取路径的方法。 基于Java文件获取路径的方法 Java程序可以通过以下方式获取文件的路径: public class FilePath { public static void main(String[]args){ // 获取当前类(class)…

    Java 2023年5月20日
    00
  • 关于JDK8中的字符串拼接示例详解

    关于JDK8中的字符串拼接示例详解攻略,可以分为以下几个部分。 一、背景介绍 在现代开发中,字符串的处理是开发中非常重要,且经常需要用到的一项技术。在JDK8中,Java提供了许多新的字符串拼接方式,包括 String.join()方法、String.format()方法、StringBuilder等。这些方法虽然实现的目的是一样的,但是使用的方式以及处理的…

    Java 2023年5月27日
    00
  • Maven镜像地址配置示例大全

    首先我们需要了解一下Maven的镜像机制。Maven在向中央仓库请求下载构件时,会首先到本地仓库中查找,若找到则直接使用。若未找到,则去设置的远程仓库查找,若远程仓库未设置或未找到需要的构件,则会尝试从中央仓库中下载。如果中央仓库访问不畅或网络有问题,那么下载速度非常慢,这时就需要配置镜像地址,即从镜像仓库中获取对应构件,从而提高下载速度。 下面给出两条示例…

    Java 2023年5月20日
    00
  • Spring框架中 @Autowired 和 @Resource 注解的区别

    在Spring框架中,@Autowired和@Resource注解都是用于进行依赖注入的。两者都可以自动装配bean,但它们之间还是存在一些区别。 1. @Autowired注解 1.1 功能 @Autowired是Spring自带的依赖注入注解。它实现了自动装配,Spring会根据类型自动注入到字段、构造方法或者是setter方法上来完成属性的注入。 1.…

    Java 2023年6月15日
    00
  • springboot返回modelandview页面的实例

    首先,我们需要了解什么是 Spring Boot。Spring Boot 是 Spring 家族开源的轻量级 Web 开发框架,它简化了 Spring 繁琐的配置,使开发者能够更加专注于业务逻辑的实现。 在 Spring Boot 中,我们可以通过创建一个控制器类来处理请求并返回响应,其中返回 ModelAndView 类型的对象可以用于处理页面渲染。 以下…

    Java 2023年6月15日
    00
  • Java多线程下解决资源竞争的7种方法详解

    Java多线程下解决资源竞争的7种方法详解,可以分为以下几种: 1. 使用synchronized同步代码块 synchronized关键字可以修饰方法和代码块,保证在同一时间只有一个线程可以执行被synchronized关键字修饰的代码块或方法。使用synchronized关键字的示例代码如下: public synchronized void addCo…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部