Spring 补充知识

1、maven下载过的东西不用再下一遍

就导入maven嘛,我们每次导入之后都要重新下载过一遍的,设置了这个之后,第一次maven中导入jar包后保存到本地,第二次要用之后直接采用本地的先了(不过占内存)
在这里插入图片描述

2、@RequestBody与@ResponseBody

自己用来备忘的

  • @ResponseBody用于把数据以JSON的形式返回给前端,其中,@RestController=@ResponseBody+@Controller
  • @RequestBody用户前端把数据返回给后端,但是前端给后端的格式是JSON,一般这样用来处理的
//有Book对象,将前端返回来的JSON数据转换成Book对象(自动识别的)
 @PostMapping("/")
    public int insertBook(@RequestBody  Book book){
    
    
        return bookService.insertBook(book);
    }

所以,如果接受前端数据,每个接受的数据都是一个类
但是有一点注意的是,也可以不写一个对象,直接写Map也行,但是还不会

3、@Bean

现在有点懂@Bean是干嘛的了,就是比如我有个IdWorker的自定义类,要把该类加进IOC容器中,就是加入spring的集合中,这玩意又不是控制类又不是配置类,怎么加入?

就随便找个地方@Bean,return该类就可以了

@SpringBootApplication
public class BaseApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(BaseApplication.class,args);
    }

	//加入IOC容器中
    @Bean
    public IdWorker idWorker(){
    
    
        return new IdWorker();
    }
}

4、@CrossOrigin

用在控制类前,用于跨域请求,就是每个分布式端口都不一样就要加的了

5、@RequestMapping

@RequestMapping用在类前面时,表示该访问路径都要加上该类的参数,但值得一提的是!!!类用了@RequestMapping后,方法中的路径不要加/


@RestController
@RequestMapping("/test")
public class testController {
    
    

    @Autowired
    private LabelService labelService;

    @GetMapping("abc")
    public List<Label> test(){
    
    
        return labelService.findAll();
    }
}

访问http://localhost:8080/test/abc得到数据

(但是在我之前做的项目中方法加/也是可以的,代码真实非常神奇的东西呢)

6、@CrossOrigin

用于控制类前,可以跨域请求,一般用于分布结构

7、pojo、@Entity、@Table、Serializable序列化

1)pojo

什么是pojo?
后台给前端的数据,直接加@ResponseBody就把对象编程JSON传给前端了。
但前端传数据给后端,后端拿到数据肯定得是对象啊,这个对象就称之为pojo(Plain Ordinary Java Object)

2)@Entity

一般JPA的pojo,都要加@Entity,俺也不懂俺也不知道哪里找答案

3)@Table

@Table之前就学过了,JPA专属的,这个对象结构和表结构要一样就对了

4)Serializable序列化

一般来说,pojo类都要implements Serializable,因为要返回前端的,虽然Result类是固定的,但是data数据的pojo类可能是数组,可能是单个对象,这不规定的。而且pojo的数据是会给前端看到的,而Result类的状态码这些是不需要给用户展示的,所以,给用户展示的类implements Serializable就对了

@Entity
@Table(name = "tb_label")
@Data
public class Label implements Serializable {
    
    
    @Id
    private String id;
    private String labelname;//标签名称
    private String state;//状态
    private Long count;//使用数量
    private Long fans;//关注数
    private String recommend;//是否推荐
}

8、@Transactional

放在server层的类前,保证数据库事务完整性

9、@RestControllerAdvice、@ExceptionHandler

这个异常可以进行全局异常处理,常常和@ExceptionHandler配合使用,详情看

https://www.cnblogs.com/lenve/p/10748453.html

@RestControllerAdvice
public class BaseExceptionHandler {
    
    

    @ExceptionHandler(Exception.class)
    public Result exception(Exception e){
    
    
        e.printStackTrace();
        return new Result(false, StatusCode.ERROR,e.getMessage());
    }
}

10、快速输入参数、return结构:/**+回车

在这里插入图片描述
回车
在这里插入图片描述

11、大小写不区分提示

https://jingyan.baidu.com/article/d621e8daca64d96864913f09.html

12、@Transactional

单元测试发生not session的时候,在单元测试类中加上@Transactional注解

13、JPA中使用对象导航查询,要用@JsonIgnoreProperties

一对多的情况下,两个类之间都有自己,这个时候就要在外键的属性前加上@JsonIgnoreProperties(value = {"另一类的外键属性名(主表的写Set属性名,从表的写主表类属性名)"})

public class Employee {
    
    

    @ManyToOne(targetEntity = Company.class,fetch = FetchType.LAZY)
    @JoinColumn(name = "employee_company_id",referencedColumnName = "company_id")
    @JsonIgnoreProperties(value = {
    
    "employees"})
    private Company company;//这个名字
}
public class Company {
    
    

    @OneToMany(mappedBy = "company",cascade = CascadeType.ALL,fetch = FetchType.LAZY)//mappedBy参数写从表中外键的属性名
    @JsonIgnoreProperties(value = {
    
    "company"})
    private Set<Employee> employees = new HashSet<>();//这个名字

}

14、表列中有关键字

关键字表:https://blog.csdn.net/findmyself_for_world/article/details/43225555
解决办法:https://blog.csdn.net/lose_alan/article/details/105510504

15、@Component

放在类前,把该类加入到容器中。spring几乎所有的类都加入了容器中自己去处理,3层架构,实体层也是加入到容器中的。

16、时间转换格式

如果new Date,格式是这样的Fri Nov 27 16:25:02 CST 2020
转换

String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
System.out.println(date);

2020-11-27 16:18:09

17、将类加入到容器中

1) @Component

在类前加上@Component,用的时候@Autowired,类名 名,就会自动导入

2)无@Component

就要在主程序中

@Bean
public 类 类名(){
    
    
	return new;
}

用也是@Autowired

18、配置类与yml

就是一个配置类,然后参数想写在application.yml中,这样改比较方便

1)@Value("${分级设计}")写在属性前

@Component
public class SmsListener {
    
    

    //从yml自动拿去数据
    @Value("${aliyun.sms.sign_name}")
    private String sign_name;//签名

    @Value(("${aliyun.sms.template_code}"))
    private String template_code;//模板编号
}
aliyun:
  sms:
    sign_name: 十次方1024博客
    template_code: SMS_205826458

2)@ConfigurationProperties("分级设置")写在类前

@ConfigurationProperties("jwt.config")
public class JwtUtil {
    
    

    private String key ;

    private long ttl ;//一个小时
}
jwt:
  config:
    key: tensquare
    ttl: 360000

19、消息头

自动注入

	@Autowired
	private HttpServletRequest request;

获取头信息

	//获取key为Authorization的消息头
	String authHeader = request.getHeader("Authorization");

	//获取key为claims_admin的消息头
	String token = (String) request.getAttribute("claims_admin");
  • 两者不一样:前者是哪里的消息头都可以拿。后者则是Java程序通过request.setAttribute(下标,值)来设置值,然后只能通过getAttribute()来拿。具体是不是我也不清楚。。。

添加头消息

request.setAttribute("claims_admin",token);

20、跨域处理

不要问,我也不知道

@Configuration
public class CrosConfig implements WebMvcConfigurer {
    
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
    
    
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET","HEAD","POST","DELETE","OPTIONS","PUT")
                .allowCredentials(true)
                .maxAge(3600)
                .allowedHeaders("*");
    }
}

猜你喜欢

转载自blog.csdn.net/yi742891270/article/details/109266645