这里记录各种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
注入的是实体管理器,执行持久化操作的,需要配置文件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
假如有一个接口叫SomeService
。Impl1
, Impl2
,Impl3
和Impl4
都继承自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();
}
}