Spring Boot注解总结

Spring Boot 核心特性

Spring boot是一个脚手架(而非框架),构建于Spring框架(Framework)基础之上,基于快速构建理念,提供了自动配置功能,可实现其开箱即用特性(创建完一个基本的项目以后,可零配置或者少量配置即可运行我们的项目),其核心主要有如下几个方面:

· 起步依赖(Starter Dependency)。

· 自动配置(Auto Configuration)。

· 健康检查(Actator)-监控。

解决问题: 启动依赖的整合,资源的基础配置,项目的运行监控

其中,Spring

官方地址为https://spring.io/projects/spring-boot

快速构建地址

https://start.aliyun.com 阿里云地址

https://start.spring.io spring地址

springBoot启动过程分析

找到项目的入口类(使用了@SpringBootApplication注解描述),然后运行启动类,检测启动过程,SpringBoot在启动时,控制台会出现如图-14标识:

在这里插入图片描述

项目启动时发生了什么呢?在这里插入图片描述

SpringBoot 项目在启动时:首先基于启动入口类上的注解(@SpringBootApplication)描述,进行自动配置并扫描指定包以及子包中的类进行加载,然后检测类上是否有Spring框架中指定的注解描述(例如@Component,@Controller,@Service 等)。假如有,则将类交给Spring框架中的BeanFactory工厂接口的实现类对象,此工厂对象会基于反射创建Bean的实例,假如此Bean指定了生命周期方法,还会调用生命周期方法。当实例创建以后,Spring框架还会基于类的作用域描述,将实例存储到不同作用域的容器中。以实现Bean对象的科学应用。

由@SpringBootApplication注解描述的类为springboot项目的启动类(入口)

1)这样的类只能有一个

2)此类启动时会启动项目的自动配置并扫描此类的所在的包及子包的资源,然后进行加载(将类读到内存)

*FAQ?*

1)如何将一个类交给spring管理?

a、条件1:将类放在启动类所在包及子包中

b、条件2:将此类使用spring指定注解进行描述(例如:@Component,@Service)

2)如何跟踪这个类是否被加载?

**通过JVM****参数设置跟踪: -XX:+TraceClassLoading–打印类的加载信息

案例:验证@SpringBootApplication启动时的加载(上面第二条)

第一步;在com.cy.pj.common.cache包中定义DefaultCache类

第二步:使用@Component注解对DefaultCache类进行描述

第三步:使用JVM参数-XX:+TraceClassLoading测试DefaultCache类是否被加载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XF7ssOUH-1594040064366)(…/OneDrive/java/4%E9%98%B6%E6%AE%B5/jt_img/clip_image004.jpg)]

springBoot常见注解

@Component是Spring中用于描述Bean类的一个注解。用于告诉Spring这个类的实例由Spring创建,当此对象由Spring创建和管理时,默认会将对象存储到池(Bean池)中。

@SpringBootTest注解用于告诉spring框架,此测试类交给spring管理。
1)表示是一个测试类
2)此类会交给spring管理(例如创建对象,为对象属性赋值)

对象的声明周期包括:创建、初始化、服务、销毁

@Scope 是Spring中用于定义Bean对象作用域的一个注解,其常用的值有singleton、prototype,默认是singleton,下面对两者区别:
singleton:整个内存只有一份Bean实例,此实例何时创建与类的延迟加载特性配置有关,此实例创建以后,整个生命周期会由spring框架管理; —用于使用频次高的对象,每次创建都会消耗资源

prototype:每次获取都会创建新实例,此实例会在需要时创建,与lazy特性无关,这个实例创建以后,不会交给spring管理,spring可以对其初始化,但不负责销毁。----使用频次比较少的对象使用

**单例模式的优点:**在内存中只有一个对象,节省内存空间。避免频繁的创建销毁对象,可以提高性能。避免对共享资源的多重占用。可以全局访问。

**单例适用场景:**需要频繁实例化然后销毁的对象。创建对象时耗时过多或者耗资源过多,但又经常用到的对象。有状态的工具类对象。频繁访问数据库或文件的对象。

@Lazy等价于@Lazy(true):注解用于描述类,其目的是告诉spring框架此类支持延迟加载策略,即外界不使用此对象时,这个对象是不会创建的;通常会配合单例作用域使用。——使用场景:一般情况下大对象稀少用可以考虑延迟加载,但是不会对prototype模式起作用

@PostConstruct 注解用于描述bean对象生命周期方法中的初始化方法,此方法会在对象的构造方法之后执行——场景:连接池创建后创建一个池对象

@PreDestroy注解用于描述Bean对象生命周期方法中的销毁方法,此方法会在对象销毁之前执行(当作用域为prototype时,此方法不会执行)。——场景:销毁池时销毁池对象

@Autowired注解描述属性时,用于告诉spring框架要为此属性注入一个值
1)赋值是首先进行查找(从spring容器中查找匹配对象—依赖查找DL,当查找不到时会出现NoSuchBeanDefinitException异常), 其次,假如检测到有多个,还会按照@Autowired描述的属性或方法参数名查找是否有名字匹配的对象,有则直接注入,没有则抛出异常NoUniqueBeanDefinitionException(没有唯一的Bean定义异常)
2)通过反射为属性赋值(依赖注入DI)
@Autowired(required=true):当使用@Autowired注解的时候,其实默认就是,表示注入的时候,该bean必须存在,否则就会注入失败。
@Autowired(required=false):表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错。

@Primary/@Qualifier
当你一个接口的实现类有多个的时候,你通过@Component来注册你的实现类有多个,但是在注入的时候使用@Autowired

这样问题就来了,Spring就不知道你注入哪个,那现在就可以通过下面两个办法解决:

@Primary 优先考虑,优先考虑被注解的对象注入
@Qualifier 名字声明,声明后对名字进行使用

@Qualifier:多实现类接口,指定注入的类型

@Autowired
 @Qualifier("defaultCache")//为cache注入DefaultCache类

@Bean:相当于XML中的,放在方法的上面,而不是类,意思是产生一个bean,并交给spring管理。
@ResponseBody将返回结果转换成json串

@RestController 等价于@Controller+@ResponseBody

mybatis设置时间格式

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")//setStartTime传入时间格式
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")//getStartTime取出时间格式

  private Date startTime;

@Value为属性赋值

#yml文件部分信息
#指定用户配置文件信息
msg:
  username: 许三多
  age: 10 
@Value("${msg.username}")
private String  username;	//用户名

@PropertySource

通过读取properties/msg.properties配置文件,利用@value注解取值

提示:多个值用","分割,然后用String.spilt(",")进行分割成字符串数组进行处理

例如:image.Types=.jpg,.png,.gif

@PropertySource
(value = "classpath:/properties/msg.properties",
		encoding="UTF-8")
public class MsgController2 {
	
	@Value("${msg.username2}")
	private String username;

}

Lombok 常用注解

注解解释
@Data在JavaBean或类JavaBean中使用,这个注解包含范围最广,它包含getter、setter、NoArgsConstructor注解,即当使用当前注解时,会自动生成包含的所有方法;
@getter在JavaBean或类JavaBean中使用,使用此注解会生成对应的getter方法
@setter在JavaBean或类JavaBean中使用,使用此注解会生成对应的setter方法
@NoArgsConstructor在JavaBean或类JavaBean中使用,使用此注解会生成对应的无参构造方法
@AllArgsConstructor在JavaBean或类JavaBean中使用,使用此注解会生成对应的有参构造方法
@ToString在JavaBean或类JavaBean中使用,使用此注解会自动重写对应的toStirng方法
@EqualsAndHashCode在JavaBean或类JavaBean中使用,使用此注解会自动重写对应的equals方法和hashCode方法
@Slf4j在需要打印日志的类中使用,当项目中使用了slf4j打印日志框架时使用该注解,会简化日志的打印流程,只需调用info方法即可;
@Log4j在需要打印日志的类中使用,当项目中使用了log4j打印日志框架时使用该注解,会简化日志的打印流程,只需调用info方法即可;
@Accessors(chain=true)开启链式加载

全局异常处

@ControllerAdvice:包含@Component。可以被扫描到。统一处理异常。
@ExceptionHandler(Exception.class):用在方法上面表示遇到这个异常就执行以下方法。

配置restFul风格访问

语法:
1.使用/方式分割参数
2.使用{}包裹参数
3.在参数方法中,动态接受参数时实验特定注解@PathVariable

@PathVariable注解的属性
name、value(两个效果一致):表示接受参数的名称
required:该参数表示是否必须 默认true

@RequestMapping("/page/{moduleName}")
public String module(@PathVariable(name="moduleName") String moduleName) {//@PathVariable(value="moduleName")  value表示默认属性,可以省略
	
	return moduleName;  //返回值会自动配置视图解析的前后缀
}

作用:
1.动态获取url路径中的参数
2.以同一的url地址,不同的请求类型,实现不同业务的调用,即通过不同的请求类型
@RequestMapping(value="/page/{moduleName}",method = RequestMethod.POST)或者@PostMapping对同一个url请求进行不同的分类处理

controller层接受参名称不一致数据处理:@RequestParam

实例:前台传过来的是id=0,后台用parentId接受,并赋值默认是0

	@RequestMapping("list")
	public List<EasyUITree> findItemCatList(@RequestParam(value="Id",defaultValue = "0") Long parentId) {
			
		return itemCatService.findItemCatList(parentId);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值