zoukankan      html  css  js  c++  java
  • SpringBoot注解 + 详解

    可以使用Ctrl + F搜索,也可以右侧目录自行检索

    @SpringBootApplication

    包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。
    其中@ComponentScan让Spring Boot扫描到Configuration类并把它加入到程序上下文。

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    申明让Spring Boot自动给程序进行必要的配置,这个配置等同于:@Configuration ,@EnableAutoConfiguration 和 @ComponentScan 三个配置。

    • @ComponentScan
      • 组件扫描,可自动发现和装配一些Bean。
    • @Configuration
      • 等同于Spring的XML配置文件;允许在 Spring 上下文中注册额外的 bean 或导入其他配置类。
    • @EnableAutoConfiguration
      • 自动配置

    @RestController

    该注解是@Controller和@ResponseBody的合集,表示这是个控制器Bean,并且是将函数的返回值直接填入HTTP响应体中,是REST风格的控制器。

    示例:

    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping(“/demoInfo2”)
    publicclass DemoController2 {
    
        @RequestMapping("/test")
        public String test(){
            return"ok";
        }
    }
    

    @ResponseBody

    @ResponseBody:表示该方法的返回结果直接写入HTTP Response Body中,一般在异步获取数据时使用,用于构建RESTful的api。

    在使用@RequestMapping后,返回值通常解析为跳转路径,加上@ResponseBody后返回结果不会被解析为跳转路径,而是直接写入HTTP Response Body中。

    比如异步获取json数据,加上@ResponseBody后,会直接返回json数据。

    该注解一般会配合@RequestMapping一起使用。

    示例:

    @RequestMapping(“/test”)
    @ResponseBody
    public String test(){
        return ”ok”;
    }
    

    @Autowired 和 @Resource

    自动导入。@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

    共同点:两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。

    不同点:

    @Autowired

    • Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.
    • Autowired只按照byType注入。默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:

    示例:

    public class TestServiceImpl {
      @Autowired
      @Qualifier("userDao")
      private UserDao userDao; 
    }
    

    @Resource

    @Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。

    所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

    示例:

    @Resource (name= "baseDao" )
    private BaseDao baseDao;
    

    @Qualifier

    如上文所述,@Autowired是根据类型进行自动装配的。如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常。我们可以使用@Qualifier配合@Autowired来解决这些问题。如下:

    @Autowired   
    @Qualifier("userServiceImpl")   
    public IUserService userService;  
    

    总结

    • @Autowired: 默认按type注入
    • @Qualifier("cusInfoService"): 一般作为@Autowired()的修饰用
    • @Resource(name="cusInfoService"): 默认按name注入,可以通过name和type属性进行选择性注入

    @Component,@Repository,@Service, @Controller

    把类标识成可用于 @Autowired 注解自动装配的 bean 的类

    • @Component :通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。
    • @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
    • @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。
    • @Controller : 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。

    @Scope

    声明 Spring Bean 的作用域

    四种常见的 Spring Bean 的作用域:

    • singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
    • prototype : 每次请求都会创建一个新的 bean 实例。
    • request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
    • session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。

    @Bean

    用@Bean标注方法等价于XML中配置的bean。也就是说,相当于XML中的<bean></bean>,放在方法的上面,而不是类,意思是产生一个bean,并交给spring管理。

    @Value

    注入Spring boot application.properties配置的属性的值。示例代码:

    @Value(value = “#{message}”)
    private String message;

    @RequestMapping

    RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

    该注解有六个属性:

    params:指定request中必须包含某些参数值是,才让该方法处理。

    headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。

    value:指定请求的实际地址,指定的地址可以是URI Template 模式

    method:指定请求的method类型, GET、POST、PUT、DELETE等

    consumes:指定处理请求的提交内容类型(Content-Type),如application/json,text/html;

    produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回

    @RequestParam

    将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)

    语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)

    value:参数名

    required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。

    defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值

    @PostMapping("/ali-receive")
    public void aliReceive(@RequestParam("message") String message) {
                ReceiveLog receiveLog = JSON.parseObject(message, ReceiveLog.class);
    
    }
    

    具体例子:

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.servlet.ModelAndView;
    
    @Controller
    @RequestMapping("hello")
    public class HelloController2 {
     
        /**
         * 接收普通请求参数
         * http://localhost:8080/hello/show16?name=linuxsir
         * url参数中的name必须要和@RequestParam("name")一致
         * @return
         */
        @RequestMapping("show16")
        public ModelAndView test16(@RequestParam("name")String name){
            ModelAndView mv = new ModelAndView();
            mv.setViewName("hello2");
            mv.addObject("msg", "接收普通的请求参数:" + name);
            return mv;
        }
     
        /**
         * 接收普通请求参数
         * http://localhost:8080/hello/show17
         * url中没有name参数不会报错、有就显示出来
         * @return
         */
        @RequestMapping("show17")
        public ModelAndView test17(@RequestParam(value="name",required=false)String name){
            ModelAndView mv = new ModelAndView();
            mv.setViewName("hello2");
            mv.addObject("msg", "接收普通请求参数:" + name);
            return mv;
        }
     
        /**
         * 接收普通请求参数
         * http://localhost:8080/hello/show18?name=998 显示为998
         * http://localhost:8080/hello/show18?name 显示为hello
         * @return
         */
        @RequestMapping("show18")
        public ModelAndView test18(@RequestParam(value="name",required=true,defaultValue="hello")String name){
            ModelAndView mv = new ModelAndView();
            mv.setViewName("hello2");
            mv.addObject("msg", "接收普通请求参数:" + name);
            return mv;
        }
     
    }
    

    结果分别为:

    @PathVariable

    用于接收请求路径中占位符的值

    @PathVariable("xxx")
    通过 @PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“)

    @RequestMapping(value=”user/{id}/{name}”)
    请求路径:http://localhost:8080/hello/show5/1/james

    具体例子:

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.servlet.ModelAndView;
    
    @Controller
    @RequestMapping("hello")
    public class HelloController2 {
        /**
         *3、占位符映射
         * 语法:@RequestMapping(value=”user/{userId}/{userName}”)
         * 请求路径:http://localhost:8080/hello/show5/1/james
         * @param ids
         * @param names
         * @return
         */
        @RequestMapping("show5/{id}/{name}")
        public ModelAndView test5(@PathVariable("id") Long ids ,@PathVariable("name") String names){
            ModelAndView mv = new ModelAndView();
            mv.addObject("msg","占位符映射:id:"+ids+";name:"+names);
            mv.setViewName("hello2");
            return mv;
        }
    

    说明:

    结果:

    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。

    9、@Basic(fetch=FetchType.LAZY):标记可以指定实体属性的加载方式。

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

    11、@JoinColumn(name=”loginId”):一对一:本表中指向另一个表的外键。一对多:另一个表指向本表的外键。

    12、@OneToOne、@OneToMany、@ManyToOne:对应hibernate配置文件中的一对一,一对多,多对一。

    全局异常处理

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

    @ExceptionHandler(Exception.class):用在方法上面表示遇到这个异常就执行以下方法。

  • 相关阅读:
    第二章 万变不离其踪--收割自己的深度图
    2.1 光照系统
    2.2 深度渲染机制
    2.3 来点实际--日照分析实现
    2.4 通视分析
    2.5 Cesium视域分析的实现
    2.6
    第三章 讲真,没几个搞得清楚的经纬度——GIS坐标
    3.1 地理坐标系统
    3.2 渲染坐标系统
  • 原文地址:https://www.cnblogs.com/kylinxxx/p/14147478.html
Copyright © 2011-2022 走看看