Spring各种注解 @PersistenceContext和@Resource @GetMapping、@PostMapping、@PutMapping、@DeleteMapping

article/2025/9/14 15:40:52

 

这里记录各种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);}@BeanRestTemplate 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();}
}


 

 

 


http://chatgpt.dhexx.cn/article/Dw84CgRQ.shtml

相关文章

SpringDataJPA+Hibernate框架源码剖析(六)@PersistenceContext和@Autowired注入EntityManager的区别

SpringDataJPAHibernate框架源码剖析系列文章&#xff1a; SpringDataJPAHibernate框架源码剖析&#xff08;一&#xff09;框架介绍SpringDataJPAHibernate框架源码剖析&#xff08;二&#xff09;框架整合 之 EntityManagerFactory的构建SpringDataJPAHibernate框架源码剖析…

@PersistenceContext 注解在spring中代理

PersistenceContext private EntityManager em;springBoot 2.x 这里注入的是EntityManager的代理类&#xff0c;注入的代理类是单例的&#xff0c;所以是线程安全的 在调用EntityManager的方法时 其实是调用代理类 SharedEntityManagerInvocationHandler中的invoke方法 在这…

JPA之EntityManager踩坑笔记:更改PersistenceContext

一、原因&#xff1a;项目中配置两个Spring JPA的数据源&#xff0c;使用EntityManager的时候默认是选择第一个&#xff0c;导致查询不到第二个数据源的数据。 二、Spring JPA多数据源怎么使用EntityManager 1. Spring JPA多数据源的配置请查看此文章&#xff1a;SpringData …

Spring Data JPA 之 理解 Persistence Context 的核心概念

21 理解 Persistence Context 的核心概念 21.1 Persistence Context 相关核心概念 21.1.1 EntityManagerFactory 和 Persistence Unit 按照 JPA 协议⾥⾯的定义&#xff1a;persistence unit 是⼀些持久化配置的集合&#xff0c;⾥⾯包含了数据源的配置、EntityManagerFacto…

JPA中为什么EntityManager 的注解要用@PersistenceContext

在使用SpringJPA的时候&#xff0c;看到如下代码 PersistenceContextprivate EntityManager entityManager; 于是就有些好奇&#xff0c;这个PersistenceContext是几个意思&#xff0c;如果是实体注入的话&#xff0c;统一采用 Autowired可以吗&#xff1f;于是上网查了下&am…

web打印时,各种页面样式设置

最近碰到这个问题&#xff0c;我需要将网页打印成PDF文件。Chrome可直接将网页保存&#xff08;打印&#xff09;为PDF&#xff08;无需安装Adobe&#xff09;&#xff0c;但式样跟网页上显示的截然不同。我测试了一下用法&#xff0c;了解了其中的一些原理和解决方法&#xff…

WEB免费打印控件推荐

在WEB系统中&#xff0c;打印的确是个烦人的问题。 要么自己开发打印控件&#xff0c;如果项目时间紧&#xff0c;肯定来不及。 要么购买成熟的打印控件&#xff0c;如果是大项目可以考虑&#xff0c;但如果项目只有几K到1、2W之间&#xff0c;这就麻烦了。 前段时间有机会接…

Web打印的实现方法

目前&#xff0c;在做B/S结构程序开发的时候&#xff0c;最棘手和最令人头疼的问题之一就是Web打印。往往打印出来的效果和自己预期的效果相差甚远&#xff0c;那么怎样才能打印出自己想要的效果呢&#xff1f;本文阐述的方法将解决这一问题&#xff0c;从而使得Web打印变得简单…

简单实用的web打印方案-网页精准打印

在当前这个互联网时代&#xff0c;大部分企业都搭建了自已的平台&#xff0c;通过平台联系客户&#xff0c;与粉丝互动&#xff0c;展示自己的产品。PC网站、APP、手机站、这些平台是企业互联网生态系统的重要基础。在公司平台化、系统化的今天&#xff0c;工作中出现web打印的…

JPrint web打印编辑器及web在线打印,JS打印编辑器

效果图 背景&#xff1a; 电子商务的发展火了一大批网商&#xff0c;每日近2000W的订单需要处理&#xff0c;相应的每天有2000W的订单需要打印。在淘宝卖家服务市场里有很多快递单发货单打印工具&#xff0c;他们使用的是阿里提供的菜鸟打印&#xff08;active&#xff09;组件…

前端web打印

前端打印 一、Vue打印插件 第一种方法&#xff1a;通过npm 安装插件 1&#xff0c;安装 npm install vue-print-nb --save 2&#xff0c;引入 安装好以后在main.js文件中引入 import Print from vue-print-nbVue.use(Print); //注册   3&#xff0c;现在就可以使用了 &…

Web Print打印服务

Web Print打印服务 题目一、安装打印服务二、配置相关的打印机三.配置证书并添加到打印机里1.RouterSrv2.IspSrv提示:若需要单独全套笔记可私信我咨询 题目 Web Print 添加一台虚拟打印机,名称为“CS-Print”,发布到AD域。 客户端们都能够通过访问“https://print.worldski…

JS web打印

11.1 Web打印 Web打印是一种常用的打印方式&#xff0c;其使用方法简单、方便、快捷&#xff0c;在浏览网页的同时就可以实现打印的功能。 实例291 调用IE自身的打印功能实现打印 实例说明 通过JavaScript调用IE自身的打印功能实现打印&#xff0c;这种方法比较简单&#xff…

web打印的最佳方案

web打印的最佳方案 web打印的痛点新的解决方案方案web页面实现源代码&#xff0c;源码打印伺服器demo及原理 web打印的痛点 winform打印的方案比较多&#xff0c;实现也比较容易&#xff0c;而且效果也非常炫&#xff1b;但现在越来越多的系统是web系统&#xff0c;甚至是移动…

前端网页打印window.print()

前言 print作为浏览已经比较成熟的技术可以经常被用来打印页面的部分内容&#xff0c;我们可以在MDN上查看到相关的简单介绍。 一、print()方法 print() 方法用于打印当前窗口的内容。调用 print() 方法会产生一个打印预览弹框&#xff0c;让用户可以设置打印请求。最简单的打…

web打印的几种方案

轉自&#xff1a;http://elf8848.iteye.com/blog/626790 -------------------------------------------一 基于Web的打印方案比较分析--------------------------------   基于web的套打&#xff0c;难度在于要将浏览器中呈现的html&#xff0c;精确地打印到票据中&#xf…

HttpPrinter实现web打印功能

HttpPrinter实现web打印功能 WEB套打可选方案不多&#xff0c;理想的更少&#xff0c;利用免费控件HttpPrinterJavaScript实现精确套打&#xff0c;算是较为经典的选择。这种方案其实比较简单&#xff0c;利用一个htm文件就可以实现模板设计过程&#xff0c;几乎是“空手套”式…

web打印实现几种方法

在工作中出现web打印的情况是非常多的&#xff0c;其实这也是一个比较烦人的问题&#xff0c;这篇博客整理一下关于Web打印的一些方法或者方式。 1. window.print() 这个方法是用来打印网页的&#xff0c;页面上的其他的元素也会被打印处理&#xff0c;在打印的时候页眉页脚是…

Web打印

布鲁斯李 Web打印 随着10i新版本的发布&#xff0c;在10i的iserver中&#xff0c;内置了一个web打印服务。是指将您在 Web 应用中制作的 Web 内容输出为可打印的文档。那么如何使用该服务&#xff0c;请继续往下看&#xff1a; 执行一次成功的web打印任务&#xff0c;我们需要…

实现WEB打印的几种方法

当前WEB应用开发非常流行&#xff0c;主要原因是WEB应用客户端的规则很简单&#xff0c;容易学习&#xff0c;容易维护&#xff0c;容易发布&#xff0c;降低了开发难度。但是&#xff0c;WEB应用的打印一直以来却是一个难题&#xff0c;特别是在应用中完成标签打印&#xff08…