关于SpringBoot的理解
写一点我在做云盘项目的时候对SpringBoot框架的理解
Bean
对于Spring,我们可以把他理解为一个容器。我们命令这个容器完成一些任务。这个容器里的东西就是Bean。Bean可以是任何的java对象。但这个对象(Bean)不由程序员直接控制,而是由Spring容器控制。控制的内容包括Bean的基本信息,作用域,初始化方法和生命周期等等。使用Bean的好处在于可是现实注入依赖(DI),不同组件之间功能解耦,更好地控制生命周期等等
Bean的生命周期有创建实例,注入依赖,初始化,使用和销毁。
Bean的作用域有单例,原型(Prototype),会话等等。
MVC
SpringBoot框架使用MVC设计模式(那么他当然集成了Spring MVC框架)
MVC指的是 model view和controller。关于他们的关系可以大致这么理解:model负责处理后端服务器,包括和数据库的链接和一些后端服务,view就是前端用户看到的页面,而controller则是调用model和view的一个控制器,可以把他理解成前后端的一个中介
在一个简单SpringBoot任务中,通常会含有config,controller,dao,model,service和util文件夹,他们在MVC中扮演的角色如下所示
其中crud指的是数据库的:创建,读取,更新,删除
Sping容器
Spring 容器可以看作是实现了工厂模式、单例模式和代理模式等设计模式的综合体:
工厂模式: 负责创建和管理 Bean 对象。
单例模式: 默认情况下,容器会为每个 Bean 创建一个单例对象。
代理模式: 用于实现 AOP 和动态代理功能。
理解的话感觉可以就把Spring容器理解成一个工厂,只不过他实现了比工厂更多的内容
反射
依赖注入:通过反射动态创建对象并注入依赖。
SpringBoot框架会首先扫描全部的类,并找到被@Service等修饰的类。扫描:启动main函数之后SpringBoot会扫描@SpringBootApplication(即主文件)所在包及其子包中的所有类,起始路径又主文件所在包的路径决定。
随后通过反射机制、根据类的全称限定名获取类的.class文件,然后用classLoader加载每个类,检查他们是否包含Spring注解(@Component、@Service、@Controller、@Repository等),如果是的话这个对象会被注册到Spring容器中,形成一个Bean。
如果某个类中有东西被@Autowired、@Resource等注解,Spring 会通过反射查找对应的 Bean 并将这个Bean注入到对应字段或参数中。这样这个属性实际上就变成了这个注入类对应的Bean实例。
注入依赖的主要目的是实现控制类和其他类之间解耦。控制类不再依赖于其他类的具体实现细节,而是依赖于他的抽象或接口。
动态代理:利用反射实现 AOP 和事务管理。
注解解析:扫描注解并根据元数据实现功能。
配置解析:反射调用配置类的方法或加载自动配置类。
方法调用:动态绑定方法参数并调用目标方法。
日志
日志是在控制台或一些文件或一些其他地方打印出来的信息,用于帮助我们更好的监控程序运行情况,日志一般长这个样子。
2024-11-26 10:30:45 INFO [main] com.example.MyClass - Application started successfully
日志根据他表示信息的细节程度不同有以下几种类型(越细说明越不重要)
在SpringBoot中,已经集成了LogBack,我们只需要再加上一个简单的Slf4j库就可以很简单地创建一个Logger对象并输出日志了。但每条日志依然需要我们自己去操控来实现输出
需要注意的是,每个项目都会设置一个日志等级,如果定义的等级低于设置的等级(即他的粒度更细,更不重要),那么定义的这个日志将不会输出。
session
session:会话 cookie的一部分,跟踪和这个用户和服务器之间的联系。Session 是一种逻辑上的状态存储机制,弥补了 HTTP 协议无状态的特性# 某些注解的作用。在用户登录时(或其他需要的时候),可以显式地创建为一个请求创建一个session,并在用户退出的时候清除这个session。
request.getSession().setAttribute("user", user);
request.getSession().invalidate();
在用户首次登录的时候,SpringBoot框架会自动为用户创建一个cookie。在调用getSession的时候(创建Session时)SpringBoot会为这个Session自动创建一个ID并储存在cookie中。当关闭Session的时候,其实也是SpringBoot框架根据用户被分配的ID找到对应的Session来完成关闭
一些注解
@Controller:
告诉SpringBoot框架(或者说是Spring容器)这是一个controller。以便告知容器对他进一步扫描
@Autowired:
告知Spring容器需要对这个对象进行注入
@ResponseBody:
如果一个方法被这个直接修饰了,那么他的返回值将不再以view视图返回给前端,而是被转化为JSON格式,通过HTTP协议发送给前端。
可以使用@RestController注释整个类来同时实现@Controller和@ResponseBody的作用
@RequestMapping:
告诉SpringBoot框架这是一个处理请求的一个方法,当收到对应路径的请求时,由这个方法来处理请求
@RequestParam:
在方法的参数中使用。用于从请求消息中获取一些参数,其基本语法是
@RequestParam(value = "name", required = false, defaultValue = "111") String name
value参数表明他要获取请求中的哪个内容,如果value名和后面对象名相同的话可以省略。required参数表明这个参数是否是必须的(如果是必须而请求中没有而且没有defaultValue的话会报错)。defaultValue 标明默认值。
@RequestParam获取参数的能力和.getParameter()是相同的,不过是语法不一样,简洁性和功能性不一样
@Value:
这个注解告诉SpringBoot需要从配置文件中找到相应的值来赋给下面的参数,比如
@Value("${key}")
就告诉SpringBoot需要从配置文件中找到key并把key的值赋给被注解的属性(或者方法的参数)