Java SpringBoot核心源码详解攻略
什么是SpringBoot
SpringBoot是基于Spring Framework的快速构建容易维护的Web项目的框架。它的设计理念是提供开箱即用的功能,减少开发者的配置工作。
SpringBoot的核心源码
SpringBoot的启动流程
SpringBoot的启动过程基于Spring Framework的常规启动流程。但是,与常规的Spring应用程序不同,SpringBoot应用程序遵循以下启动流程。
1.获取配置属性: SpringBoot从配置文件中读取一些默认属性,并合并它们与开发人员的自定义属性。
2.创建应用程序上下文:SpringCoreApplication和SpringBootServletInitializer都作为应用程序上下文的入口,并负责创建应用程序上下文。SpringBoot会加载主要的@Configuration类来配置应用程序上下文。
3.启动SpringBoot:启动Spring Boot的主要方法通常是SpringApplication.run()方法。
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
return run(new Class<?>[] { primarySource }, args);
}
4.创建Spring Boot应用程序的实例:SpringApplication使用反射的方式获取主准备好的@Configuration类,并将其放置于应用程序上下文之中。
SpringBoot自动配置
SpringBoot在应用程序启动时自动完成一些配置工作,减少了开发者的工作量。SpringBoot实现自动配置的方式是通过META-INF/spring.factories
文件。在这个文件中,开发者可以定义自己的自动配置类,并将其打包成为一个JAR文件。在SpringBoot启动时,它会根据这个文件里的配置来进行初始化。
以下是一个自定义的自动配置类的样例代码:
@Configuration
@ConditionalOnClass(SomeClassInTheClasspath.class)
@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {
private final MyProperties properties;
public MyAutoConfiguration(MyProperties properties) {
this.properties = properties;
}
@Bean
@ConditionalOnMissingBean
public MyBean myBean() {
return new MyBean(properties.getSomeValue());
}
}
该代码中,MyAutoConfiguration类标记了@Configuration注解,表示它是一个配置类。@ConditionalOnClass
注解表示当SomeClassInTheClasspath这个类在classpath中时,才会加载该类。@EnableConfigurationProperties
注解表示开启自动装配的配置属性。它可以让Spring Boot将配置文件中的属性值注入到MyProperties对象中。@ConditionalOnMissingBean
注解表示当容器中没有名字为myBean的Bean时,才会实例化该Bean。最终,Spring Boot会将实例化后的Bean注入到应用程序上下文中。
SpringBoot的自定义starter开发
SpringBoot的starter是一个依赖包,包含了一系列相关的依赖项和自动配置类。如果想创建自己的starter,则需要做以下几个步骤:
1.创建Maven或Gradle项目。
2.创建starter依赖包:创建一个依赖包,并将自动配置类放在META-INF/spring.factories文件中。
3.创建自定义的starter:创建一个集成了starter依赖包的starter,并且将它打包。
以下是一个简单的自定义starter示例代码:
@Configuration
@EnableJpaRepositories(basePackages = "com.example.demo.repository")
public class MyStarterAutoConfiguration {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
这段代码中,我们定义了一个自动配置类。它使用了@EnableJpaRepositories
注解去启用JPA存储库,basePackages参数指定了存储库的位置。MyService是一个自定义的服务,我们通过@Bean注解来实例化它。最终,我们可以将这个自定义的starter打包上传到Maven仓库中,供其他人使用。
示例
示例1:新增用户
假设我们要在SpringBoot应用程序里添加新增用户的功能。我们可以按照以下步骤进行:
1.定义实体:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String username;
private String password;
//省略getter和setter方法
}
2.定义Repository
public interface UserRepository extends CrudRepository<User, Long> {
}
3.添加控制层
@RestController
@RequestMapping("/users")
public class UserController {
private final UserRepository userRepository;
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
@PostMapping
public User createUser(@RequestBody User user) {
return userRepository.save(user);
}
}
4.编写前端代码
<!-- ...省略前面一部分代码 -->
<div>
<label for="username">用户名:</label>
<input type="text" id="username" name="username"/>
</div>
<div>
<label for="password">密码:</label>
<input type="password" id="password" name="password"/>
</div>
<button onclick="createUser()">创建用户</button>
<script>
function createUser() {
var username = document.getElementById("username").value.trim();
var password = document.getElementById("password").value.trim();
if (!username || !password) {
alert("用户名和密码不能为空");
return;
}
var xhr = new XMLHttpRequest();
xhr.open("POST", "/users", true);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.onreadystatechange = function() {
if (this.readyState === 4 && this.status === 200) {
alert("用户创建成功");
}
}
xhr.send(JSON.stringify({
"username": username,
"password": password
}));
}
</script>
5.运行应用程序
运行应用程序后,就可以在浏览器中访问http://localhost:8080,并开始创建用户。
示例2:使用Spring Security保护API
假设我们有一个SpringBoot应用程序,需要使用Spring Security来保护API。我们可以按照以下步骤进行:
1.添加Spring Security依赖项
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.添加WebSecurityConfigurer
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
}
3.添加Spring MVC控制器
@RestController
public class HelloWorldController {
@RequestMapping("/")
public String home() {
return "Hello, world!";
}
@RequestMapping("/admin")
public String admin() {
return "Hello, admin!";
}
}
4.运行应用程序
运行应用程序后,就可以在浏览器中访问http://localhost:8080,并开始保护API。
这里只是介绍了SpringBoot的一部分内容,如果想要了解更多,在实际开发中还需要深入掌握Spring和Spring MVC的相关知识。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java SpringBoot核心源码详解 - Python技术站