Spring、SpringMVC、SpringBoot常用注解

发布时间:2023-04-30 16:30

目录

一、Spring常用注解

1、@Configuration

2、@Import

3、@ImportResource

4、@Bean

5、@Value

6、@Primary

7、@Autowired

8、@Qualifier

9、@Resource(J2EE里面的注解)

10、@controller

11、@Service

12、@Repository

13、@Mapper(Mybatis的注解)

14、@Component

15、@Scope

16、@Lazy(true)

17、@PostConstruct

18、@PreDestory

19、@DependsOn

20、@Async

二、SpringMVC常用注解

1、@RestController

2、@RequestMapping

handler method 参数绑定常用的注解 

3、@PathVariable(处理requet uri 部分)

4、@RequestHeader, @CookieValue(处理request header部分)

5、@RequestParam, @RequestBody(处理request body部分)

6、@ModelAttribute和 @SessionAttributes

6、@ResponseBody

三、SpringBoot常用注解

1、@SpringBootApplication

2、@SpringBootConfiguration

3、@EnableAutoConfiguration

4、@ComponentScan

5、RequestMapping简化注解

6、@Profiles

四、全局异常处理注解

1、@ControllerAdvice

2、@ExceptionHandler(Exception.class)

五、JPA注解


一、Spring常用注解

1、@Configuration

相当于传统的xml配置文件,如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类——可以使用@ImportResource注解加载xml配置文件。

把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。

2、@Import

用来导入其他配置类。

第一种用法:@Import({ 要导入的容器中的组件 } ):容器会自动注册这个组件,id默认是全类名

第二种用法:ImportSelector:返回需要导入的组件的全类名数组,springboot底层用的特别多【重点 】

第三种用法:ImportBeanDefinitionRegistrar:手动注册bean到容器

3、@ImportResource

用来加载xml配置文件。

4、@Bean

 用@Bean标注方法等价于XML中配置的bean。

5、@Value

@Value的值有两类:

  • ① ${ property : default_value }
  • ② #{ obj.property? : default_value }

就是说,第一个注入的是外部参数对应的property,第二个则是SpEL表达式对应的内容。

那个 default_value,就是前面的值为空时的默认值。注意二者的不同。

第一种主要是配置文件上的值获。

第二种是对象属性的获取,需要注意的是,如果是获取一个方法的值时,需要在前面增加@,比如#{@obj.getProperty()}

6、@Primary

自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常

7、@Autowired

自动导入依赖的bean。byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。当加上(required=false)时,就算找不到bean也不报错。

默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:

@Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用

8、@Qualifier

当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用。@Qualifier限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者

9、@Resource(J2EE里面的注解

@Resource注解与@Autowired注解作用非常相似。

@Resource的装配顺序:

  • @Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
  • 指定了name或者type则根据指定的类型去匹配bean
  • 指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

@Autowired和@Resource两个注解的区别:

  • @Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
  • @Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了。 Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。

10、@controller

@Controller对应表现层的Bean,使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为\"userAction\"的action,这个名字是根据UserAction类名来取的。注意:如果@Controller不指定其

value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value=“UserAction”)】或者【@Controller(“UserAction”)】,则使用value作为bean的名字。

@Scope(“prototype”)表示将Action的范围声明为原型,可以利用容器的scope=\"prototype\"来保证每一个请求有一个单独的Action来处理,避免线程安全问题。spring 默认scope 是单例模式(scope=“singleton”),这样只会创建一个Action对象,每次访问都是同

一Action对象,数据不安全,每次次访问都对应不同的Action,scope=“prototype” 可以保证当有请求的时候都创建一个Action对象

11、@Service

@Service对应的是业务层Bean,@Service(“userService”)注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做\"userService\",这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的\"userService\",然

后注入给Action:在Action只需要声明一个名字叫\"userService\"的变量来接收由Spring注入的\"userService\"即可

12、@Repository

@Repository对应数据访问层Bean ,

@Repository(value=“userDao”)注解是告诉Spring,让Spring创建一个名字叫\"userDao\"的UserDaoImpl实例。

当Service需要使用Spring创建的名字叫\"userDao\"的UserDaoImpl实例时,就可以使用@Resource(name = “userDao”)注解告诉Spring,Spring把创建好的userDao注入给Service即可

使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项。

13、@Mapper(Mybatis的注解)

在用idea写一个实现类时引用了mapper类的来调用dao层的处理,使用@Autowired注解时被标红线,找不到bean。

解决办法:在mapper加@mapper或者@repository注解。

这两种注解的区别在于:

    1、使用@mapper后,不需要在spring配置中设置扫描地址,通过mapper.xml里面的namespace属性对应相关的mapper类,spring将动态的生成Bean后注入到ServiceImpl中。

    2、@repository则需要在Spring中配置扫描包地址,然后生成dao层的bean,之后被注入到ServiceImpl中

14、@Component

(把普通pojo实例化到spring容器中,相当于配置文件中的 )

泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。

15、@Scope

a.singleton单例模式 -- 全局有且仅有一个实例
b.prototype原型模式 -- 每次获取Bean的时候会有一个新的实例
c.request -- request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
d.session -- session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
e.globalsession -- global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义

16、@Lazy(true)

Spring IoC容器一般都会在启动的时候实例化所有单实例 bean 。如果我们想要 Spring 在启动的时候延迟加载 bean,即在调用某个 bean 的时候再去初始化,那么就可以使用 @Lazy 注解。

value 取值有 true 和 false 两个 默认值为 true,true 表示使用 延迟加载, false 表示不使用。

@Lazy注解注解的作用主要是减少springIOC容器启动的加载时间,当出现循环依赖时,也可以添加@Lazy

17、@PostConstruct

用于指定初始化方法(用在方法上)。

@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。

通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序:

Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)

18、@PreDestory

用于指定销毁方法(用在方法上)

被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。

19、@DependsOn

定义Bean初始化及销毁时的顺序

有很多场景需要bean B应该被先于bean A被初始化,从而避免各种负面影响。我们可以在bean A上使用@DependsOn注解,告诉容器bean B应该先被初始化。

如果我们注释掉@DependsOn(\"eventListener\"),我们可能不确定获得相同结果。尝试多次运行main方法,偶尔我们将看到EventListenerBean 没有收到事件。为什么是偶尔呢?因为容器启动过程中,spring按任意顺序加载bean。

那么当不使用@DependsOn可以让其100%确定吗?可以使用@Lazy注解放在eventListenerBean ()上。因为EventListenerBean在启动阶段不加载,当其他bean需要其时才加载。这次我们仅EventListenerBean被初始化。

现在重新增加@DependsOn,也不删除@Lazy注解,输出结果和第一次一致,虽然我们使用了@Lazy注解,eventListenerBean在启动时仍然被加载,因为@DependsOn表明需要EventListenerBean

20、@Async

创建独立的线程去完成相应的异步调用逻辑,通过主线程和不同的线程之间的执行流程,从而在启动独立的线程之后,主线程继续执行而不会产生停滞等待的情况。

二、SpringMVC常用注解

1、@RestController

@RestController 是Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认返回json格式。

2、@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。

当@RequestMapping 标记在Controller 类上的时候,里面使用@RequestMapping 标记的方法的请求地址都是相对于类上的@RequestMapping 而言的;当Controller 类上没有标记@RequestMapping 注解时,方法上的@RequestMapping 都是绝对路径。这

种绝对路径和相对路径所组合成的最终路径都是相对于根路径“/ ”而言的。

方式一:通过常见的类路径和方法路径结合访问controller方法

@Controller  
@RequestMapping ( \"/test\" )  
public class MyController {  
    @RequestMapping ( \"/showView\" )  
    public ModelAndView showView() {  
       ModelAndView modelAndView = new ModelAndView();  
       modelAndView.setViewName( \"viewName\" );  
       modelAndView.addObject( \" 需要放到 model 中的属性名称 \" , \" 对应的属性值,它是一个对象 \" );  
       return modelAndView;  
    } 
}   

方式二:使用uri模板

URI 模板就是在URI 中给定一个变量,然后在映射的时候动态的给该变量赋值。如URI 模板http://localhost/app/{variable1}/index.html ,这个模板里面包含一个变量variable1 ,那么当我们请求http://localhost/app/hello/index.html 的时候,该URL 就跟模板相匹配,只是把模板中的variable1 用hello 来取代。这个变量在SpringMVC 中是使用@PathVariable 来标记的。在SpringMVC 中,我们可以使用@PathVariable 来标记一个Controller 的处理方法参数,表示该参数的值将使用URI 模板中对应的变量的值来赋值。

@Controller
@RequestMapping ( \"/test/{variable1}\" )
public class MyController {

    @RequestMapping ( \"/showView/{variable2}\" )
    public ModelAndView showView( @PathVariable String variable1, @PathVariable ( \"variable2\" ) int variable2) {
       ModelAndView modelAndView = new ModelAndView();
       modelAndView.setViewName( \"viewName\" );
       modelAndView.addObject( \" 需要放到 model 中的属性名称 \" , \" 对应的属性值,它是一个对象 \" );
       return modelAndView;
    }
}

方式三:支持通配符

定义变量之外,@RequestMapping 中还支持通配符“* ”。如下面的代码我就可以使用/myTest/whatever/wildcard.do 访问到Controller 的testWildcard 方法。

@Controller
@RequestMapping ( \"/myTest\" )
public class MyController {
    @RequestMapping ( \"*/wildcard\" )
    public String testWildcard() {
       System. out .println( \"wildcard------------\" );
       return \"wildcard\" ;
    }  
}

handler method 参数绑定常用的注解 

3、@PathVariable(处理requet uri 部分)

1、当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。

@Controller  
@RequestMapping(\"/owners/{ownerId}\")  
public class RelativePathUriTemplateController {  
  
  @RequestMapping(\"/pets/{petId}\")  
  public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {      
    // implementation omitted   
  }  
} 

2、若方法参数名称和需要绑定的uri template中变量名称不一致,需要在@PathVariable(“name”)指定uri template中的名称。

@Controller  
public class TestController {  
     @RequestMapping(value=\"/user/{userId}/roles/{roleId}\",method = RequestMethod.GET)  
     public String getLogin(@PathVariable(\"userId\") String userId,  
         @PathVariable(\"roleId\") String roleId){  
         System.out.println(\"User Id : \" + userId);  
         System.out.println(\"Role Id : \" + roleId);  
         return \"hello\";  
     }  
     @RequestMapping(value=\"/product/{productId}\",method = RequestMethod.GET)  
     public String getProduct(@PathVariable(\"productId\") String productId){  
           System.out.println(\"Product Id : \" + productId);  
           return \"hello\";  
     }  
     @RequestMapping(value=\"/javabeat/{regexp1:[a-z-]+}\",  
           method = RequestMethod.GET)  
     public String getRegExp(@PathVariable(\"regexp1\") String regexp1){  
           System.out.println(\"URI Part 1 : \" + regexp1);  
           return \"hello\";  
     }  
}

4、@RequestHeader, @CookieValue(处理request header部分)

@RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上。

@RequestMapping(\"/displayHeaderInfo.do\")  
public void displayHeaderInfo(@RequestHeader(\"Accept-Encoding\") String encoding,  
                              @RequestHeader(\"Keep-Alive\") long keepAlive)  {  
}  

@CookieValue 可以把Request header中关于cookie的值绑定到方法的参数上。

@RequestMapping(\"/displayHeaderInfo.do\")  
public void displayHeaderInfo(@CookieValue(\"JSESSIONID\") String cookie)  {  
} 

5、@RequestParam, @RequestBody(处理request body部分)

@RequestParam常用来处理简单类型的绑定,通过Request.getParameter() 获取的String可直接转换为简单类型的情况( String–> 简单类型的转换操作由ConversionService配置的转换器来完成);因为使用request.getParameter()方式获取参数,所以可以

  • 处理get 方式中queryString的值,也可以处理post方式中 body data的值;
  • 用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST;
  • 该注解有两个属性: value、required; value用来指定要传入值的id名称,required用来指示参数是否必须绑定;

示例代码:

@Controller  
@RequestMapping(\"/pets\")  
@SessionAttributes(\"pet\")  
public class EditPetForm {  
    @RequestMapping(method = RequestMethod.GET)  
 public String setupForm(@RequestParam(\"petId\") int petId, ModelMap model) {  
       Pet pet = this.clinic.loadPet(petId);  
   model.addAttribute(\"pet\", pet);  
   return \"petForm\";  
   }
} 

@RequestBody该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;

它是通过使用HandlerAdapter 配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。

因为配置有FormHttpMessageConverter,所以也可以用来处理 application/x-www-form-urlencoded的内容,处理完的结果放在一个MultiValueMap里,这种情况在某些特殊需求下使用,详情查看FormHttpMessageConverter api;

示例代码:

@RequestMapping(value = \"/something\", method = RequestMethod.PUT)  
public void handle(@RequestBody String body, Writer writer) throws IOException {  
  writer.write(body);  
} 

6、@ModelAttribute和 @SessionAttributes

@SessionAttributes该注解用来绑定HttpSession中的attribute对象的值,便于在方法中的参数里使用。

该注解有value、types两个属性,可以通过名字和类型指定要使用的attribute 对象;

示例代码:

@Controller  
@RequestMapping(\"/editPet.do\")  
@SessionAttributes(\"pet\")  
public class EditPetForm {  
    // ...   
} 

@ModelAttribute该注解有两个用法,一个是用于方法上,一个是用于参数上;

用于方法上时: 通常用来在处理@RequestMapping之前,为请求绑定需要从后台查询的model;

用于参数上时: 用来通过名称对应,把相应名称的值绑定到注解的参数bean上;要绑定的值来源于:

  • @SessionAttributes 启用的attribute 对象上;
  • @ModelAttribute 用于方法上时指定的model对象;

上述两种情况都没有时,new一个需要绑定的bean对象,然后把request中按名称对应的方式把值绑定到bean中。

用到方法上@ModelAttribute的示例代码:

这种方式实际的效果就是在调用@RequestMapping的方法之前,为request对象的model里put(“account”, Account)。

@RequestMapping(value=\"/owners/{ownerId}/pets/{petId}/edit\", method = RequestMethod.POST)  
public String processSubmit(@ModelAttribute Pet pet) {  
     
} 

用在参数上的@ModelAttribute示例代码:

首先查询 @SessionAttributes有无绑定的Pet对象,若没有则查询@ModelAttribute方法层面上是否绑定了Pet对象,若没有则将URI template中的值按对应的名称绑定到Pet对象的各属性上。

@RequestMapping(value=\"/owners/{ownerId}/pets/{petId}/edit\", method = RequestMethod.POST)  
public String processSubmit(@ModelAttribute Pet pet) {  
     
} 

6、@ResponseBody

该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

三、SpringBoot常用注解

1、@SpringBootApplication

此注解是个组合注解,包括了@SpringBootConfiguration,@EnableAutoConfiguration和@ComponentScan注解。

@SpringBootConfiguration 继承至@Configuration,对于熟悉spring的开发者而言,此标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。

@EnableAutoConfiguration 这个注解就是springboot能自动进行配置的魔法所在了。主要是通过此注解,能所有符合自动配置条件的bean的定义加载到spring容器中,比如根据spring-boot-starter-web ,来判断你的项目是否需要添加了webmvc和tomcat,就

会自动的帮你配置web项目中所需要的默认配置。具体的使用,会在后期自定义实现一个自动启动类时,会讲解到它的一些机制。此章节就不深入了,只需要它是这个用途即可,一般上也单独使用不要这个注解,但比如需要排除一些无需自动配置的类时,可

利用exclude进行排除。

@ComponentScan 这个熟悉spring的开发者也应该熟悉,会扫描当前包及其子包下被@Component,@Controller,@Service,@Repository等注解标记的类并纳入到spring容器中进行管理。

2、@SpringBootConfiguration

@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,

并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。

3、@EnableAutoConfiguration

这个注解告诉Spring Boot根据添加的jar依赖猜测你想如何配置Spring。由于 spring-boot-starter-web 添加了Tomcat和Spring MVC,所以auto-configuration将假定你正在开发一个web应用并相应地对Spring进行设置。Starter POMs和Auto-Configuration:设计

auto-configuration的目的是更好的使用\"Starter POMs\",但这两个概念没有直接的联系。你可以自由地挑选starter POMs以外的jar依赖,并且Spring Boot将仍旧尽最大努力去自动配置你的应用。

你可以通过将 @EnableAutoConfiguration 或 @SpringBootApplication 注解添加到一个 @Configuration 类上来选择自动配置。

注:你只需要添加一个 @EnableAutoConfiguration 注解。我们建议你将它添加到主 @Configuration 类上。

如果发现应用了你不想要的特定自动配置类,你可以使用 @EnableAutoConfiguration 注解的排除属性来禁用它们。

import org.springframework.boot.autoconfigure.*;  
     import org.springframework.boot.autoconfigure.jdbc.*;  
     import org.springframework.context.annotation.*;  
     @Configuration  
     @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})  
     public class MyConfiguration {  
     }  

4、@ComponentScan

@ComponentScan会扫描指定路径下的的类,并将其加入到Ioc容器中。在springboot中,@ComponentScan默认扫描@SpringBootApplication所在类的同级目录以及它的子目录。

也可以使用@ComponentScan(basePackageClasses = com.qingtian.web.controller)来制定扫描包路径

5、RequestMapping简化注解

  • @GetMapping 等同于 @RequestMapping(method = RequestMethod.GET)
  • @PostMapping 等同于 @RequestMapping(method = RequestMethod.POST)
  • @PutMapping 等同于 @RequestMapping(method = RequestMethod.PUT)
  • @DeleteMapping 等同于 @RequestMapping(method = RequestMethod.DELETE)
  • @PatchMapping 等同于 @RequestMapping(method = RequestMethod.PATCH)

6、@Profiles

Spring Profiles提供了一种隔离应用程序配置的方式,并让这些配置只能在特定的环境下生效。任何@Component或@Configuration都能被@Profile标记,从而限制加载它的时机。

 @Configuration  
     @Profile(\"production\")  
     public class ProductionConfiguration {  
     // ...  
     }  

四、全局异常处理注解

1、@ControllerAdvice

包含@Component。可以被扫描到。统一处理异常。

2、@ExceptionHandler(Exception.class)

用在方法上面表示遇到这个异常就执行以下方法。

五、JPA注解

1、@Entity: @Table(name=”“)

表明这是一个实体类。一般用于jpa这两个注解一般一块使用,但是如果表名和实体类名相同的话,@Table可以省略

2、@MappedSuperClass

 用在确定是父类的entity上。父类的属性子类可以继承。

3、@NoRepositoryBean

 一般用作父类的repository,有这个注解,spring不会去实例化该repository。

4、@Column

如果字段名与列名相同,则可以省略。

5、@Id

 表示该属性为主键。

6、@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = “repair_seq”):

表示主键生成策略是sequence(可以为Auto、IDENTITY、native等,Auto表示可在多个数据库间切换),指定sequence的名字是repair_seq。

7、@SequenceGeneretor(name = “repair_seq”, sequenceName = “seq_repair”, allocationSize = 1):

name为sequence的名称,以便使用,sequenceName为数据库的sequence名称,两个名称可以一致。

8、@Transient:

表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic。@Basic(fetch=FetchType.LAZY):标记可以指定实体属性的加载方式

9、@JsonIgnore

 作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。

10、@JoinColumn(name=”loginId”):

一对一:本表中指向另一个表的外键。一对多:另一个表指向本表的外键。

11、@OneToOne、@OneToMany、@ManyToOne:

对应hibernate配置文件中的一对一,一对多,多对一。

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号