SpringBoot 常用注解 —— Annotation

SpringBoot中的注解

@Bean 和 @Component

  • @Component 注解作用于,表明一个类会作为组件类,并告知Spring要为这个类创建bean;而 @Bean 注解作用于方法,告诉Spring这个方法将会返回一个对象,这个对象要注册成Spring应用上下文中的bean,就不用写麻烦的xml配置文件了。通常方法体包含了最终产生bean实例的逻辑。
  • @Component 通常是通过路径扫描来自动侦测以及自动装配Spring 容器中,@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean@Bean 告诉了 Spring 这是某个类的实例,当我们需要用它的时候还给我。
  • @Bean 注解比 @Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册 bean。比如当我们引用第三方库中的类需要装配到 Spring 容器时,只能通过 @Bean 来实现。
  • @Bean明确地指示了一种方法,产生一个bean的方法,并且交给Spring容器管理。支持别名@Bean(“xx-name”),@Bean注解默认作用域为单例singleton作用域,可通过**@Scope(“prototype”)**设置为原型作用域

@Configuration :配置类注解

  • @Configuration 表明在一个类里可以声明一个或多个 @Bean 方法,并且可以由 Spring 容器处理,以便在运行时为这些 bean 生成 bean 定义和服务请求
  • @Configuration(proxyBeanMethods = false),告诉SpringBoot这是一个配置类 == 类似于以前的配置文件(beans.xml)
    • Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
    • Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
    • 组件依赖必须使用Full模式默认。其他默认是否Lite模式
注解含义
@Component最普通的组件,可以被注入到 Spring 容器进行管理
@Repository作用于持久层
@Service作用于业务逻辑层
@Controller作用于表现层(spring-mvc的注解)

@ConditionalOnBean

  • @ConditionalOnBean(name = “tom”) 如果存在tom这个组件就会执行下面的操作

@ConditionalOnMissingBean

  • @ConditionalOnMissingBean(name = “tom”) ,没有tom这个组件就会执行下面的全部操作,也可以加到某一个@Bean(“xxx”)的上面作为局部生效

@ConfigurationProperties

@EnableConfigurationProperties

@SpringBootApplication

  • @SpringBootApplication是一个复合注解,包含了**@SpringBootConfiguration**,@EnableAutoConfiguration@ComponentScan这三个注解
    • @SpringBootConfiguration,主要用于加载配置文件,继承自**@Configuration**,二者功能也一致,标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名
    • @EnableAutoConfiguration,开启自动配置功能,可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器
    • @ComponentScan 注解,主要用于组件扫描和自动装配,加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中。可以通过basePackages等属性指定@ComponentScan自动扫描的范围,默认情况下是不指定的,所以SpringBoot的启动类最好放在root package下。

@Controller

  • 控制器,处理http请求,在spring项目中由控制器负责将用户发来的URL请求转发到对应的服务接口(service层)

  • @Controller用于标记在一个上,使用它标记的类就是一个SpringMVC的 Controller类,分发处理器会扫描使用该注解的类的方法,并检测该方法是否使用了 @RequestMapping 注解

  • @Controller只是定义了一个控制器类,而使用 @RequestMapping 注解的方法才是处理请求的处理器。

    @Controller
    public class PageController {
    	@RequestMapping(value="/login")
    	public String str(String s) {
    		return "logining";
    	}
    }
    
    @Controller
    @RequestMapping(/demoInfo”)
    public class DemoController {
      @Autowired
      private DemoInfoService demoInfoService; 
      @RequestMapping("/hello")
      public String hello(Map<String,Object> map){
         System.out.println("DemoController.hello()");
         map.put("hello","from TemplateController.helloHtml");
         //会使用hello.html或者hello.ftl模板进行渲染显示.
         return"/hello";
      }
    }
    

@RestController 复合注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

	/**
	 * The value may indicate a suggestion for a logical component name,
	 * to be turned into a Spring bean in case of an autodetected component.
	 * @return the suggested component name, if any (or empty String otherwise)
	 * @since 4.0.1
	 */
	@AliasFor(annotation = Controller.class)
	String value() default "";
}
  • 从源码我们知道,@RestController注解相当于@ResponseBody+@Controller合在一起的作用,RestController使用的效果是将方法返回的对象直接在浏览器上展示成json格式
  • 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是return 里的内容

@ResponseBody注解

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

  • 在使用**@RequestMapping后,返回值通常解析为跳转路径,加上@Responsebody后返回结果不会被解析为跳转路径**,而是直接写入HTTP response body中。比如异步获取json数据,加上@Responsebody后,会直接返回json数据。该注解一般会配合@RequestMapping一起使用。

    1 @RequestMapping(/test”)
    2 @ResponseBody
    3 public String test(){
    4    return”ok”;
    5 }
    

@RequestBody注解

  • 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数

@RequestMapping

  • 提供路由信息,负责URL到Controller中的具体函数的映射。

  • value是@RequestMapping中必须携带的参数,表示地址请求映射的路径

@Controller
@RequestMapping("user")   //此处如果不省略,则为@RequestMapping(value="user")
public class UserController {
 
    @RequestMapping("getUser")
    @ResponseBody
    public ModelAndView getUser() {
        ModelAndView view = new ModelAndView();
        return view;
    }
}
  • method,表示所支持的http的请求方式,包括get、post、delete、put等,其中最常用的是get和post的方法。

    • get:请求能够携带的参数比较少,大小有限制,会在浏览器中显示数据内容,不安全,但高效。
    • post:请求能够携带的参数没有限制,会在浏览器中显示数据内容,安全,但不高效。
    • 注意:method属性不是必选值,默认值是接收所有类型的http请求。
    @RequestMapping(value = "getUser",method = RequestMethod.GET)
    @ResponseBody
    public ModelAndView getUser(){
        ModelAndView view = new ModelAndView();
        return view;
    }
    
  • params,该属性指定,请求中必须包含params属性规定的参数时,才能执行该请求

@RequestMapping(value="/path",params={"username"}//表示传递过来的请求中必须携带username
参数
public String path(){
 
  return "path"
 
}
  • header,该属性指定,请求中必须包含某些指定的header值,才能够让该方法处理请求,一般默认情况下,如果是来自我们自己主机上的请求的话,默认header是localhost:8080
  • 例子:
@RequestMapping(value = "getUser",headers = "Referer=http://www.xxx.com")
@ResponseBody
public ModelAndView getUser(){
    ModelAndView view = new ModelAndView();
    return view;
}
  • 表示必须满足请求的header中包含了指定的"Referer"请求头和值为"http://www.xxx.com"时,才能执行该请求,如果没有对应的键值,则会报404错误,表示找不到相应资源。

@GetMapping

  • 用于将HTTP get请求映射到特定处理程序的方法注解

  • 注解简写:@RequestMapping(value = “/say”,method = RequestMethod.GET)等价于:@GetMapping(value = “/say”)

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @RequestMapping(method = RequestMethod.GET)
    public @interface GetMapping {
    //...
    }
    

@PostMapping

  • 用于将HTTP post请求映射到特定处理程序的方法注解

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @RequestMapping(method = RequestMethod.POST)
    public @interface PostMapping {
        //...
    }
    

@PathVariable

  • 获取url中的数据
@Controller
@RequestMapping("/User")
public class HelloWorldController {

    @RequestMapping("/getUser/{uid}")
    public String getUser(@PathVariable("uid")Integer id, Model model) {
        System.out.println("id:"+id);
        return "user";
    }
}

@RequestParam

  • 获取请求参数的值
@RequestMapping("/getUser")
public String getUser(@RequestParam("uid")Integer id, Model model) {
    System.out.println("id:"+id);
    return "user";
}
  • 不加@RequestParam注解:
    url可带参数也可不带参数,输入 localhost:8080/list1 以及 localhost:8080/list1?userId=xxx 方法都能执行
  • 加@RequestParam注解:
    url必须带有参数。也就是说你直接输入localhost:8080/list2 会报错,不会执行方法。只能输入localhost:8080/list2?userId=xxx 才能执行相应的方法
public String handle01(@RequestParam("name") String name){

    // 添加@Slf4j后,会自动生成一个log对象
    log.info("请求进来了....");
    return "Hello,Springboot2!" + name;
}
  • http://localhost:8080/hello?name=kyle,即可以在网页中添加参数 ?name=kyle

@RequestHeader

  • 把Request请求header部分的值绑定到方法的参数
  • 如下配置将自动将请求头“User-Agent”值入参到userAgent参数上,并将“Accept”请求头值入参到accepts参数上。测试代码在HeaderValueTypeController中
@RequestMapping(value="/header")  
public String test(  
       @RequestHeader("User-Agent") String userAgent,  
       @RequestHeader(value="Accept") String[] accepts)

@CookieValue

  • @CookieValue用于将请求的Cookie数据映射到功能处理方法的参数上。

  • 如下配置将自动将JSESSIONID值入参到sessionId参数上,defaultValue表示Cookie中没有JSESSIONID时默认为空。

public String test(@CookieValue(value="JSESSIONID", defaultValue="") String sessionId) 
  • 传入参数类型也可以是javax.servlet.http.Cookie类型
public String test2(@CookieValue(value="JSESSIONID", defaultValue="") Cookie sessionId)   

@ModelAttribute绑定请求参数到命令对象

绑定请求参数到命令对象
  • 如用户登录,我们需要捕获用户登录的请求参数(用户名、密码)并封装为用户对象,此时我们可以使用@ModelAttribute绑定多个请求参数到我们的命令对象。
  • 它的作用是将该绑定的命令对象以“user”为名称添加到模型对象中供视图页面展示使用。我们此时可以在视图页面使用**${user.username}**来获取绑定的命令对象的属性。
  • 绑定请求参数到命令对象支持对象图导航式的绑定,如请求参数包含“?username=zhang&password=123&workInfo.city=bj”自动绑定到user中的workInfo属性的city属性中。
public String test1(@ModelAttribute("user") UserModel user) 
暴露表单引用对象为模型数据
  • 如下代码会在执行功能处理方法之前执行,并将其自动添加到模型对象中,在功能处理方法中调用Model 入参的containsAttribute(“cityList”)将会返回true。
@ModelAttribute("cityList")  
public List<String> cityList() {  
    return Arrays.asList("北京", "山东");  
} 

@Repository

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

@Value

  • 注入Springboot application.properties配置的属性的值
  • @Value(“${properties中的键}”)
    private String xxx;
 @Value(value = "#{message}")
 private String message;
  • @Value(“${properties中的键: aaa}”)

    当获取不到properties中的键所对于的值时,返回默认值aaa

/**
     * @Value 通过 ${} 获取配置文件里person.name的值,如果没有获取成功,就返回默认值李四
     */
    @Value("${person.name:李四}")
    private String name;

@Service

  • @Service是@Component注解的一个特例,作用在类上
  • @Service注解作用域默认为单例
  • 使用注解配置和类路径扫描时,被@Service注解标注的类会被Spring扫描并注册为Bean
  • @Service用于标注服务层组件,表示定义一个bean
  • @Service使用时没有传参数,Bean名称默认为当前类的类名,首字母小写
  • @Service(“serviceBeanId”)或@Service(value=”serviceBeanId”)使用时传参数,使用value作为Bean名字

@PropertySource注解

  • 引入单个properties文件:@PropertySource(value = {“classpath : xxxx/xxx.properties”})
  • 引入多个properties文件:@PropertySource(value = {“classpath : xxxx/xxx.properties”,“classpath : xxxx.properties”})

@ImportResource导入xml配置文件

相对路径(classpath)
  • 引入单个xml配置文件:@ImportSource(“classpath : xxx/xxxx.xml”)
  • 引入多个xml配置文件:@ImportSource(locations={“classpath : xxxx.xml” , “classpath : yyyy.xml”})
绝对路径(file)
  • 引入单个xml配置文件:@ImportSource(locations= {“file : d:/hellxz/dubbo.xml”})
  • 引入多个xml配置文件:@ImportSource(locations= {“file : d:/hellxz/application.xml” , “file : d:/hellxz/dubbo.xml”})

@Import 导入额外的配置信息

  • 功能类似XML配置的,用来导入配置类,可以导入带有@Configuration注解的配置类或实现类
@SpringBootApplication
@Import({SmsConfig.class})
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

@Transactional事务注解

编程式事务管理
  • 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务管理
  • 建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务,通过**@Transactional**就可以进行事务操作,更快捷而且简单。推荐使用。

@ControllerAdvice 统一处理异常

  • @ControllerAdvice 注解定义全局异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {
}

@ExceptionHandler 注解声明异常处理方法

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    String handleException(){
        return "Exception Deal!";
    }
}
  • 全局处理异常例子:@ControllerAdvice最常见的使用场景就是全局异常处理。比如文件上传大小限制的配置,如果用户上传的文件超过了限制大小,就会抛出异常,此时可以通过@ControllerAdvice结合@ExceptionHandler定义全局异常捕获机制,代码如下:
@ControllerAdvice
public class CustomExceptionHandler {
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public void uploadException(MaxUploadSizeExceededException e, HttpServletResponse resp) throws IOException {
        resp.setContentType("text/html;charset=utf-8");
        System.out.println(1111);
        PrintWriter out = resp.getWriter();
        out.write("上传文件大小超出限制!");
        out.flush();
        out.close();
    }
}

  • 全局异常处理详情查看:<https://blog.csdn.net/qq_43581790/article/details/123871439

@ResponseStatus

  • @ResponseStatus的作用就是为了改变HTTP响应的状态码,具有value、code、reason 三个属性
  • 加在自定义运行时异常上
    • 如果不加@ResponseStatus,在代码中直接抛出该自定义异常,会以500的HTTP状态码响应到浏览器
    • 如果加@ResponseStatus,在代码中直接抛出该自定义异常,会以指定的HTTP状态码和指定的reason响应到浏览器;我们自定义异常的目的就是为了让它正确表述我们的思想,所以给其设置响应状态码和原因让其准确表达我们的目的。
  • 详情:https://www.cnblogs.com/goloving/p/15046737.html

@EqualsAndHashCode

  • 此注解会生成equals(Objectother) 和 hashCode()方法。

  • 它默认使用非静态,非瞬态的属性。

  • 可通过参数exclude排除一些属性

  • 可通过参数of指定仅使用哪些属性

  • 它默认仅使用该类中定义的属性且不调用父类的方法

  • 可通过callSuper=true解决(5)中的问题,让其生成的方法中调用父类的方法。

  • 关于 callSuper 的详情

https://blog.csdn.net/dj1955/article/details/123822789?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-123822789-blog-96989512.pc_relevant_multi_platform_whitelistv3&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-123822789-blog-96989512.pc_relevant_multi_platform_whitelistv3&utm_relevant_index=1

@Accessors

  • 详情:

https://blog.csdn.net/sunnyzyq/article/details/119992746

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值