@SpringBootApplication
这个注解实在我们常见但是又不怎么主动利用。这个注解是spring boot项目的基石。会默认在启动类上加上。实在我们可以把这个注解当作是多个注解的聚集:
此中紧张的三个注解是:
- @SpringBootConfiguration:它的底层实在是@Configuration.允许在Spring上下文中注册额外的bean大概导入别的设置类。
- @ComponentScan:扫描被@Component,@Repository,@Service,@Controller注解的bean,注解默认会扫描该类地点的包下的全部的类(这也是boot项目启动类必须在最外层的缘故起因)
- @EnableAutoConfiguration:启动SpringBoot的主动设置机制。
Spring Bean相干
@Autowired
主动导入对象到类中,被注入进的类同样要被spring容器管理。好比Service类注入到Controller类中。
@Component,@Repository,@Service,@Controller
我们一样寻常利用@Autowired注解让Spring容器帮我们主动装配bean。要想要类标识成可用于@Autowired注解主动装配的bean的类,可以采用以下注解实现:
- @Component:通用的注解,可标注恣意类为Spring组件。如果一个bean不知道属于哪层,可以利用这个注解来标注。
- @Repository:对应恒久层即Dao层,紧张用于数据库相干利用。
- @Service:对应服务层,紧张涉及一些复杂的逻辑,必要用到Dao层。
- @Controller:对应Spring MVC控制层。紧张用于担当用户哀求并调用Service层返回数据给前端页面。
@RestController
@RestController注解是@Controller和@ResponseBody的合集。表现这是个控制器bean,而且将函数的返回值直接填入http相应体中。是REST风格的控制器。
单独利用@Controller不加@ResponseBody的话,一样寻常是用在要返回一个视图的环境。如果加了@ResponseBody返回的是JSON大概XML情势的数据。
@Scope
这个是声明Spring Bean的作用域,利用方法就是指定作用域。这个注解有四种常见的作用域:
- singleton:唯一bean实例。Spring中的bean默认都是单例的
- prototype:每次哀求都会创建一个新的bean实例
- request:每一个HTTP哀求都会产生一个新的bean,该bean仅在当前http的request中有效。
- session:每一个http session会产生一个新的bean。该bean仅在当前http session下有效。
下面的简朴的例子:
@Configuration
一样寻常用来声明设置类,可以利用注解@Component注解替换。不外利用@Configuration注解声明设置类更加语义化。
处理常见的http哀求范例
5中常见的哀求范例(实在就前两个常见,三四个也还行。第五个没用过。 )
- GET:哀求从服务器获取特定资源。
- POST:在服务器上创建一个新的资源
- PUT:更新服务器上的资源
- DELETE:从服务器删除特定的资源
- PATCH:更新服务器上的资源。
GET哀求
@GetMapper("/xxx") 等价于
@RequestMapper(value= "/xxx",method=RequestMethod.GET)
POST哀求
@PostMapping("/xxx") 等价于@RequestMapping(value="/xxx",method=RequestMethod.POST)
PUT哀求
@PutMapping("/xxx/{userId}") 等价于@RequestMapping(value="/xxx/{userId}",method=RequestMethod.PUT)
DELETE哀求
@DeleteMapping("/xxx/{userId}")等价于@RequestMapping(value="/xxx/{userId}",method=RequestMethod.DELETE)
PATCH哀求
一样寻常我们很少利用的这个哀求,都是put不敷用了才会利用。
@PatchMapping("/xx")等价于
@RequestMapping(value = "/xxx",method = RequestMethod.PATCH)
前后端传值
@PathVariable 和@RequestParam
@PathVariable用于获取路径参数
@RequestParam用户就获取查询参数
这两者我们可以同时利用。如下例子:
@GetMapping("/test/{name}") public String test(@PathVariable("name")String name,@RequestParam("id") String id){ return "id = "+ id +",name = " + name ; }@RequestBody
用于读取Requst哀求的body部门,而且Content-Type是application/json格式的参数。吸收到数据之后会主动将数据绑定到java对象上去。体系会利用HttpMessageConyerter大概自界说的HttpMessageConyerter将哀求的body中的json字符串转换为java对象。
必要留意一个哀求方法里只能有一个@RequestBody,但是可以有多个@RequestParam和@PathVariable.
读取设置信息
许多时间我们必要将一些常用的设置信息好比阿里云oss,发送短信,微信认证的相干设置信息等等放到设置文件中。下面我们来看一下spring为我们提供了哪些方式从设置文件中读取设置信息。
@Value
这个是比力常用的读取设置信息注解,利用方法是@Value("${xxx}")
@ConfigurationProperties
通过@ConfigurationProperties读取设置信息而且与bean绑定。如下demo:
@PropertySource
这个是读取指定位置的设置文件,然后用@Value注解注入。
怎么说呢,我是以为这个挺鸡肋的。也大概是我没碰到实用的场景。好比说A,B两个文件中都有url属性。如果我们直接用@Value注入的话是要aplication.yml/properties文件。但是我们可以在类上指定要读取的设置文件,然后用@Value注入。
全局处理Controller层非常
- @ControllerAdvice:注解界说全局非常处理类
- @ExceptionHandler:注解声明非常处理方法
这个利用不难,但是挺墨迹的,我就不整理了,感爱好的本身百度吧。
JPA相干
创建表
@Entity声明一个类对应一个数据库实体。
@Table 设置表名
@Entity@Data@Table(name = "sys_user")public class User{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private Integer age;}创建主键
@Id :声明一个字段为主键。
@GeneratedValue 指定主键天生战略。
jpa中常见的有四种主键生产战略。默认是auto
public enum GenerationType { /** * 利用一个特定的数据库表格来生存主键 * 恒久化引擎通过关系数据库的一张特定的表格来天生主键, */ TABLE, /** *在某些数据库中,不支持主键自增长,好比Oracle、PostgreSQL其提供了一种叫做"序列(sequence)"的机制天生主键 */ SEQUENCE, /** * 主键自增长 */ IDENTITY, /** *把主键天生战略交给恒久化引擎(persistence engine), *恒久化引擎会根据数据库在以上三种主键天生 战略中选择此中一种 */ AUTO}设置字段范例
@Column 声明字段。
可以设置数据库的字段名。也可以设置非空,长度等。还可以添加默认值。好比下面两个demo:
@Column(name = "user_name", nullable = false, length=32)private String userName;@Column(columnDefinition = "tinyint(1) default 1")private Boolean enabled;指定不恒久化特定字段
@Transient :声明不必要与数据库映射的字段,在生存的时间不必要生存进数据库 。
实在这个mybatis也有类似的功能。就是当实体和数据库表有出入的时间可以用。
声明大字段
@Lob:声明某个字段为大字段。
创建摆列范例的字段
这个实用性还蛮高的。好比传入的男性,女性.然后摆列值界说男性是male,女性是female这种。就是利用比力贫苦,必要本身写摆列类。
public enum Gender { MALE("男性"), FEMALE("女性"); private String value; Gender(String str){ value=str; }}@Entity@Data@Table(name = "sys_user")public class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @Enumerated(EnumType.STRING) private Gender gender;}增长审计功能
这个功能实在就是主动给创建人,创建时间,修改人,修改时间赋值。实现如下:
只要继续了AbstractAuditBase的类都会默认加上这四个字段。这里的几个注解都比力见名知意,我就不多表明白。
@Data@AllArgsConstructor@NoArgsConstructor@MappedSuperclass@EntityListeners(value = AuditingEntityListener.class)public abstract class AbstractAuditBase { @CreatedDate @Column(updatable = false) @JsonIgnore private Instant createdAt; @LastModifiedDate @JsonIgnore private Instant updatedAt; @CreatedBy @Column(updatable = false) @JsonIgnore private String createdBy; @LastModifiedBy @JsonIgnore private String updatedBy;}然后必要实现一个auditorAware的接口,用处就是为了返回当前的利用人。
@Configuration@EnableJpaAuditingpublic class AuditSecurityConfiguration { @Bean AuditorAware<String> auditorAware() { return request.getSession().getAttribute("username"); }}然后我们在启动类上添加注解@EnableJpaAuditing,开启 JPA 审计功能。
删除/修改数据
@Repositorypublic interface UserRepository extends JpaRepository<User, Integer> { @Modifying @Transactional(rollbackFor = Exception.class) void deleteByUserName(String userName);}关联关系
固然jpa支持一对一,一对多,多对多等。但是现实上项目中不保举这么利用,以是我就不多先容了。反正jpa是支持的,感爱好的本身去看官网。
变乱@Transactional
关于spring变乱,我之前有篇文章整理过,感爱好的可以本身去看看。https://www.jianshu.com/p/78ef931a4674
json数据处理
过滤json数据
@JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回大概不分析
//天生json时将userRoles属性过滤@JsonIgnoreProperties({"userRoles"})public class User { private String userName; private String fullName; private String password; private List<UserRole> userRoles = new ArrayList<>();}@JsonIgnore作用于属性上和@JsonIgnoreProperties是一样的。
public class User { private String userName; private String fullName; private String password; //天生json时将userRoles属性过滤 @JsonIgnore private List<UserRole> userRoles = new ArrayList<>();}格式化json数据
@JsonFormat一样寻常用来格式化 json 数据。
好比我们可以把日期用字符串吸收
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone="GMT")private Date date;扁平化对象
实在所谓的扁平化我们可以明白成从子对象中取出来放在外层。
上面这段代码实验效果是如许的:
{ "userEntity": { "id": null, "name": "lsj", "age": 12, "level": 1, "flag": true, "email": "11@qq.com" }}而如果我们在属性上添加注解:@JsonUnwrapped。
实验效果酿成如许:
{ "id": null, "name": "lsj", "age": 12, "level": 1, "flag": true, "email": "11@qq.com"}测试相干
@SpringBootTest(webEnvironment = RANDOM_PORT) 声明是测试
@ActiveProfiles("test") 指定运行环境是test,用于读取spring设置文件/
@Test 声明一个方法为测试方法
@Transactional被声明的测试方法的数据会回滚,制止污染测试数据。
@WithMockUser Spring Security 提供的,用来模仿一个真实用户,而且可以赋予权限。
本篇条记就记到这里,真正做的时间才发现spring注解之多真的很难整理清楚,从一开始的兴高采烈到厥后无从动手。不外还算是有个心得:当你必要什么功能的时间不妨先去百度找找,大部门spring 百口桶已经提供轮子了。哪怕spring不提供,也很大几率有现成的轮子。本篇条记就记到这里,如果稍微帮到你了记得点个喜好点个关注,也祝各人工作顺顺遂利! |