这里记录各种spring注解

 

 

@Data@AllArgsConstructor@NoArgsConstructor@Builder

 

  • @Data

使用这个注解,就不用再去手写Getter,Setter,equals,canEqual,hasCode,toString等方法了,注解后在编译时会自动加进去。

  • @AllArgsConstructor

使用后添加一个构造函数,该构造函数含有所有已声明字段属性参数

  • @NoArgsConstructor

使用后创建一个无参构造函数

  • @Builder

关于Builder较为复杂一些,Builder的作用之一是为了解决在某个类有很多构造函数的情况,也省去写很多构造函数的麻烦,在设计模式中的思想是:用一个内部类去实例化一个对象,避免一个类出现过多构造函数, 

 

然后,通过一个简单的代码例子说明:

1)首先,建立一个简单的类,并用lombok进行注解:注意这是注解前的代码,可以与后面贴出的注解生成的代码进行比较

@Data //生成getter,setter等函数
@AllArgsConstructor //生成全参数构造函数
@NoArgsConstructor//生成无参构造函数
@Builder
public class test1 {
    String name;
    String age;
    String sex;
}

2)测试入口:

public static void main(String[] args) {
 //使用@Builder注解后,可以直接通过Builder设置字段参数
        test1 t1=new test1.test1Builder()
                .name("wang")
                .age("12")
                .sex("man")
                .build();

        System.out.println("name is"+t1.getName()+'\n'+"age is :"+t1.getAge());

    }


 

@EqualsAndHashCode(callSuper = false) 

不调用父类的属性, 子类属性里面的相同的话,那hashcode的值就相同


 

@Controller和@RestController的区别

@RestController注解相当于@ResponseBody + @Controller合在一起的作用。

1)如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。

例如:本来应该到success.jsp页面的,则其显示success.

2)如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
3)如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

详细理解

 

 

@Component

@Component是一个元注解,意思是可以注解其他类注解,如@Controller @Service @Repository @Aspect。官方的原话是:带此注解的类看为组件,当使用基于注解的配置和类路径扫描的时候,这些类就会被实例化。其他类级别的注解也可以被认定为是一种特殊类型的组件,比如@Repository @Aspect。所以,@Component可以注解其他类注解。

详细理解

  

@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping、@RequestMapping

 

@GetMapping:

处理get请求,传统的RequestMapping来编写应该是@RequestMapping(value = “/get/{id}”, method = RequestMethod.GET)
新方法可以简写为:
@GetMapping("/get/{id}")

@GetMapping("goods/{id}")
    public ResponseEntity getGoods(@PathVariable("id")Long id) {
        GoodsDto dto = goodsFacade.getGoodsInfo(id);
        return ResponseEntity.ok(Result.success(dto));
    }

@PostMapping:

处理post请求,传统的RequestMapping来编写应该是@RequestMapping(value = “/get/{id}”,method = RequestMethod.POST)
新方法可以简写为:
@PostMapping("/get/{id}")

@PostMapping("order")
    public ResponseEntity createOrder(@RequestBody OrderDto dto) {
        Long id = orderFacade.createOrder(dto);
        return ResponseEntity.ok(Result.success(id));
    }

@PutMapping:

和PostMapping作用等同,都是用来向服务器提交信息。如果是添加信息,倾向于用@PostMapping,如果是更新信息,倾向于用@PutMapping。两者差别不是很明显。

@PutMapping("/users/{userId}/roles")
    public ResponseEntity updateUserRole(@PathVariable("userId")String userId, @RequestParam(value = "roles[]") List<String> roles) {
        Authentication auth= SecurityContextHolder.getContext().getAuthentication();
        keycloakServer.updateUserRoleMap(userId, roles);
        return ResponseEntity.ok(Result.success());
    }

@DeleteMapping

删除URL映射

@DeleteMapping("order/goods")
public ResponseEntity deleteOrderGoods(Long id) {
    orderFacade.deleteOrderGoods(id);
    return ResponseEntity.ok(Result.success());
}

 

@PatchMapping

是对put方式的一种补充;

put方式是可以更新.但是更新的是整体.patch是对局部更新;

@PatchMapping("order/confirm")
    public ResponseEntity confirmOrder(@RequestBody() JSONObject json) {
        orderFacade.updateOrderState(json.getJSONArray("orderIds").toJavaList(Long.class), OrderState.WAIT_CHECK);
        return ResponseEntity.ok(Result.success());
    }

 

 

@Transactional

@Transactional 是声明式事务管理 编程中使用的注解

1 .添加位置

1)接口实现类或接口实现方法上,而不是接口类中。
2)访问权限:public 的方法才起作用。@Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。
系统设计:将标签放置在需要进行事务管理的方法上,而不是放在所有接口实现类上:只读的接口就不需要事务管理,由于配置了@Transactional就需要AOP拦截及事务的处理,可能影响系统性能。

详细介绍

 

@PersistenceContext和@Resource

 

@PersistenceContext

requestmapping传递多参数_requestmapping传递多参数

注入的是实体管理器,执行持久化操作的,需要配置文件persistence.xml。

注入一堆保存实体类状态的数据结构,针对实体类的不同状态(四种,managedh或detached等)可以做出不同的反应(merge,persist等等),其实就是把数据从数据库里提出,然后在内存里处理的,再返回数据库的法则。

 

@Resource

是注入容器提供的资源对象,比如SessionContext MessageDrivenContext。或者你那个name指定的JNDI对象

可以理解为资源->数据源->也就是数据连接,基本上就是告诉程序数据库在哪里 

 

 

@Bean与@Component

  • @Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。
  • @Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。

 

两者的目的是一样的,都是注册bean到Spring容器中。

@Component(@Controller、@Service、@Repository)通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中。

而@Bean注解通常是我们在标有该注解的方法中定义产生这个bean的逻辑。

 

这里很使用@Componet,如果要被其实应用调用,在启动类@ComponentScan 扫描

@Controller

//在这里用Component,Controller,Service,Repository都可以起到相同的作用。

@RequestMapping(″/web/controller1″)
public class WebController {
    .....
}

 

@ComponentScan("com.lm.*")
public class GoodsApplication {

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

}

引入第三方库时要用@Bean设置

@Component倾向于组件扫描和自动装配。
但有时自动设置是做不到的。
假如你要引入第三方库,可是如果你没有源代码,也就无法在其上添加@Component,自动设置也就无从下手。
但@Bean会返回一个被spring认可的Bean。@Bean所注释的方法内部可以对这个第三方库的实例进行设置。

 如下,使用第三方,


org.springframework.web.client.RestTemplate;


public class XXXApplication {

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

    @Bean
    RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        HttpComponentsClientHttpRequestFactory requestFactory = new 
        HttpComponentsClientHttpRequestFactory();
        requestFactory.setConnectTimeout(20000);
        requestFactory.setReadTimeout(20000);

        restTemplate.setRequestFactory(requestFactory);
        return restTemplate;
    }
}

 

 

可以灵活返回不同的Bean

假如有一个接口叫SomeServiceImpl1, Impl2,Impl3Impl4都继承自SomeService
那么如下代码就可以根据状态变量,动态地返回不同的Bean。

@Bean
@Scope("prototype")
public SomeService someService() {
    switch (state) {
    case 1:
        return new Impl1();
    case 2:
        return new Impl2();
    case 3:
        return new Impl3();
    default:
        return new Impl();
    }
}