开发 Java笔记-----注解

1.Controller

@RequestMapping 注解用于绑定URI到具体处理器。

@RestController:Spring 4 新增注解,同样可以注解 Controller 类,相当于@Controller + @ResponseBody,主要是为了使 http 请求返回 json 或者xml格式数据,一般情况下都是使用这个注解。下文都基于此注解进行验证。用于将返回的数据进行json化    一般用于control类上的注解

@GetMapping                用于control类的get方法上的注解
用于将GET请求映射到控制器处理方法上。具体来说,@GetMapping是一个作为快捷方式的组合注解等价于
@RequestMapping(method = RequestMethod.GET)。

@PostMapping                 用于control类的post方法上的注解
用于将POST请求映射到控制器处理方法上。具体来说,@PostMapping是一个作为快捷方式的组合注解等价于@RequestMapping(method = RequestMethod.POST)。

@RequestMapping            一般用于control类上的注解
用于将任意HTTP 请求映射到控制器方法上。@RequestMapping表示共享映射,如果没有指定请求方式,将接收GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE、TRACE、CONNECT所有的HTTP请求方式。@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping 都是HTTP方法特有的快捷方式@RequestMapping的变体。

@RequestMapping 注解可以在控制器类的级别和/或其中的方法的级别上使用。

在类的级别上的注解会将一个特定请求或者请求模式映射到一个控制器之上。之后你还可以另外添加方法级别的注解来进一步指定到处理方法的映射关系。

@RestController
// 映射到类上
// localhost:8080/user
@RequestMapping("/user")
public class UserController {
		// 映射到方法上
		// localhost:8080/user/login
    @GetMapping("/login") 
    public String login() {
        return "user login";
    }
    
    // 映射到方法上
    // localhost:8080/user/register
    @PostMapping("/register")
    public String register() {
        return "user register";
    }
}

@RequestBody 与@RequestParam()  用于给参数的注解

@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);而最常用的使用请求体传参的无疑是POST请求了,所以使用@RequestBody接收数据时,一般都用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
@RequestBody 接收请求体中的参数,只能用于post方法中,用于将前端的请求json映射到java实体类

@RequestParam 接收请求url中带的参数,一般用于get方法中,对请求url中单个参数进行说明

@RequestParam(value = "userlng", required = false, defaultValue = "") String lng,

 

如果参数时放在请求体中,application/json传入后台的话,那么后台要用@RequestBody才能接收到;
如果不是放在请求体中的话,那么后台接收前台传过来的参数时,要用@RequestParam来接收,或
则形参前 什么也不写也能接收。

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "exam_project")
@ApiModel("项目实体类")
public class item {
/*
*        @Id:声明这是一个主键
         @GeneratedValue:主键生成策略 像自增策略
            strategy: 策略生成方式
         @Column: 对应数据库表中的字段
            name:字段的名称
* */

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @ApiModelProperty(value = "项目id")
    private Integer id;

    // @NotBlank 用于String字段的校验
    @ApiModelProperty(value = "项目名")
    @NotBlank(message = "项目名不为空")
    @Column(name = "project_name")
    private String projectName;

    @NotBlank(message = "项目时长不为空")
    @Column(name = "project_duration")
    @ApiModelProperty(value = "项目时长")
    private String projectDuration;

    @NotBlank(message = "项目负责人不能为空")
    @Column(name = "project_principal")
    @ApiModelProperty(value = "负责人项目")
    private String projectPrincipal;


    @Column(name = "project_creattime")
    @ApiModelProperty(value = "项目创建时间")
    private Date projectCreatTime;



    @Column(name = "project_updatetime")
    @ApiModelProperty(value = "项目修改时间")
    private Date projectUpdateTime;

 注:通过@RequestBody映射到实体类,基于实体类的注解进行校验,否则前端的json无法解析到对应的实体类

注:如果参数前写了@RequestParam(xxx),那么前端必须有对应的xxx名字才行(不管其是否有值,当然可以通
       过设置该注解的required属性来调节是否必须传),如果没有xxx名的话,那么请求会出错,报400。

如果后端参数是一个对象,且该参数前是以@RequestBody修饰的,那么前端传递json参数时,必须满足以下要求:

后端@RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为),这一条我会在下面详细分析,其他的都可简单略过,但是本文末的核心逻辑代码以及几个结论一定要看! 实体类的对应属性的类型要求时,会调用实体类的setter方法将值赋给该属性。

json字符串中,如果value为""的话,后端对应属性如果是String类型的,那么接受到的就是"",如果是后端属性的类型是Integer、Double等类型,那么接收到的就是null。

json字符串中,如果value为null的话,后端对应收到的就是null。

如果某个参数没有value的话,在传json字符串给后端时,要么干脆就不把该字段写到json字符串中;要么写value时, 必须有值,null 或""都行。千万不能有类似"stature":,这样的写法

 

spring AOP注解@Aspect的使用

 

AOP的使用场景:

权限认证、日志、事务处理、增强处理

 

@Component和@Order() 通过order注解可以决定@component注解的类实例化的顺序,order中的数字越小越spring越先进行实例化。

InitialzingBean用法

当一个类实现这个接口之后,Spring启动后,初始化Bean时,若该Bean实现InitialzingBean接口,会自动调用afterPropertiesSet()方法,完成一些用户自定义的初始化操作。

@Component
@Order(999999) // 最后加载,保证类中的类已经实例化
public class InitializingBeanImpl implements InitializingBean {

    private final NacosRegister nacosRegister;
    private final StempService stempService;

    public InitializingBeanImpl(NacosRegister nacosRegister, StempService stempService) {
        this.nacosRegister = nacosRegister;
        this.stempService = stempService;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        // 服务运行前的模块初始化准备工作
        stempService.initSenmantc(); // 比如服务中依赖的各个模块的数据加载流程的代码
        nacosRegister.register();
    }

}

 

@Aspect   定义切面类注解
@Component
//设置注解执行的顺序的优先级,数字越小优先级越大
@Order(2)
public class AnnotationAspectTest

@Aspect
@Component
//设置注解执行的顺序
@Order(2)
public class AnnotationAspectTest {
    /**
     * 定义切点,切点为添加了注解的方法
     */
    @Pointcut("@annotation(com.example.zcs.Aop.annotation.TestAnnotation)")
    public void aopPointCut(){
    }
 
    @Around("aopPointCut()")
    public Object Around(ProceedingJoinPoint point) throws Throwable {
        System.out.println("AnnotationAspectTest Around start ");
        //获取注解和注解的值
        TestAnnotation annotation = getAnnotation(point);
       if (annotation != null) {
           boolean flag = annotation.flag();
           System.out.println("注解flags的值:" + flag);
       }
 
        //获取参数
        Object[] args = point.getArgs();
 
        for (Object arg : args) {
            System.out.println("arg ==>" + arg);
        }
 
        //去调用被拦截的方法
        Object proceed = point.proceed();
 
        return proceed;
    }
 
    //获取注解
    public TestAnnotation getAnnotation(ProceedingJoinPoint point) {
        Signature signature = point.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        if (method != null){
            return method.getAnnotation(TestAnnotation.class);
        }
        return null;
    }
}

 

配置注解 :

@Configuration  用来代替 applicationContext.xml 配置文件,所有这个配置文件里面能做到的事情都可以通过这个注解所在类来进行注册。

调用@Configuration类中的@Bean注解的方法,返回的是同一个示例;而调用@Component类中的@Bean注解的方法,返回的是一个新的实例。 @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例。

 

configuration注解的类的条件:

  • 配置类不能是final 类(没法动态代理)。

  • 配置注解通常为了通过 @Bean注解生成 Spring 容器管理的类,

@Configuration
public class MyBeanConfig {

@Bean
public Country country(){
return new Country();
}

@Bean
public UserInfo userInfo(){
return new UserInfo(country());
}
}

配置方式一:使用@Configuration + @Value方式

 

配置方式二:使用@ConfigurationProperties,获取指定的配置信息,通过@Configuration或@Component注解使spring @ComponentScan能够扫到该类;经操作@Component替换为@Configuration也可以获取同样结果。

 

@Data  //给属性生成getter,setter,tostring方法
@Configuration  //spring会进行扫描,configuration和component都是这个作用
@ConfigurationProperties(prefix = "minio")  //指定配置信息
public class MinioConfig {

private String endpoint;
private String accessKey;
private String secretKey;

@Bean
public MinioClient minioClient(){

return MinioClient.builder()
.endpoint(endpoint,80,false)
.credentials(accessKey, secretKey)
.build();
}

 

bootstrap.yml文件也是Spring Boot的默认配置文件,而且其加载的时间相比于application.yml更早。

application.yml和bootstrap.yml虽然都是Spring Boot的默认配置文件,但是定位却不相同。

bootstrap.yml可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。

application.yml可以用来定义应用级别的参数,如果搭配 spring cloud config 使用,application.yml里面定义的文件可以实现动态替换。

总结就是:bootstrap配置文件优于application配置文件
bootstrap.yml文件相当于项目启动时的引导文件,内容相对固定。application.yml文件是微服务的一些常规配置参数,变化比较频繁。
bootstrap.yml 先于 application.yml。

posted @ 2023-05-29 10:28  15375357604  阅读(24)  评论(0编辑  收藏  举报