zoukankan      html  css  js  c++  java
  • SpringBoot常用注解汇总

    SpringBoot

    controller层

    1、@Controller
    	@Controller 用来响应页面,表示当前的类为控制器。
    
    2、@RestController
    	@RestController 是@ResponseBody和@Controller的结合
    	表明当前类是控制器且返回的是一组数据,不是页面
      @ResponseBody
          表示该方法的返回结果直接写入HTTP response body中
          一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析
          为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。
    
    3、@Autowired
    	这个注解的作用是将其他的类,接口引入,类似于之前的类的初始化等,用这个注解,类中或接口的方法就可以直接调用了。
    
    4、@RequestMapping
    	当前台界面调用Controller处理数据时候告诉控制器怎么操作
    	作用:URL映射。
          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)类型中包含该指定类型才返回
    
    5、@GetMapping
    	@RequestMapping(method = RequestMethod.GET)的简写
    	作用:对应查询,表明是一个查询URL映射
    
    6、@PostMapping
    	@RequestMapping(method = RequestMethod.POST)的简写
    	作用:对应增加,表明是一个增加URL映射
    
    7、@PutMapping
    	@RequestMapping(method = RequestMethod.PUT)的简写
    	作用:对应更新,表明是一个更新URL映射
    
    8、@DeleteMapping
    	@RequestMapping(method = RequestMethod.DELETE)的简写
    	
    9、@RequestBody和@RequestParam
      两个注解都是用于方法中接收参数使用的,两者也有一定的区别。
      @RequestBody这个一般处理的是在ajax请求中声明contentType: “application/json; charset=utf-8”时候。也就是json数据或者xml(我没用过这个,用的是json)
      @RequestParam这个一般就是在ajax里面没有声明contentType的时候,为默认的。。。urlencode格式时,用这个。
      @RequestBody可以直接将页面中的参数封装成实体类中的数据传输给后天
    

    service层

    1.@service
    		用于标注业务层组件
    2.@Component
    		泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
    

    dao层

    1.@Repository
    		是用来注解接口,@Repository注解可以标记在任何的类上,用来表明该类是用来执行与数据库相关的操作(即dao对象),并支持自动处理数据库操作产生的异常
    

    实体类注解

    @Entity实体类注解
    @Table(name ="数据库表名"),这个注解也注释在实体类上,对应数据库中相应的表。
    @Id、@Column注解用于标注实体类中的字段,pk字段标注为@Id,其余@Column。
    
    SpringJPA主键生成策略
      数据库使用Oracle,常用的就是UUID和整形自增。
      UUID能达到全局唯一,而且不受数据库限制,比如Oracle的自增就要用序列来做。但是存储控件需求会更多,另外性能上不及整形。
      整形自增MySQL中只要设置一个整形列即可,Oracle中需要建立一个SEQUENCE。
    
    public enum GenerationType {
          TABLE,
          SEQUENCE,
          IDENTITY,
          AUTO;
          
          private GenerationType() {
         }
    }
    GenerationType源码
    从源码中可以看出JPA提供的四种标准主键策略TABLE,SEQUENCE,IDENTITY,AUTO
    
    TABLE:使用一个特定的数据库表格来保存主键。
    SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列)。
    IDENTITY:主键由数据库自动生成(主要是支持自动增长的数据库,如mysql)
    AUTO:主键由程序控制,也是GenerationType的默认值。
    
    不写GeneratedValue注解时即为GenerationType.AUTO 这时主键生成是根据数据库hibernate_sequence里的next_val来生成但我想用自已规则来生成自己的ID查了半天的资料终于解决这个问题。
    
    
    建议oracle可采用UUID,需求场景需要也可使用整型自增
    mysql采用整形,业务中可便于排序,把握先后
    UUID:
    @Id
    @GeneratedValue(generator = "faceset_generator")
    @GenericGenerator(name = "faceset_generator", strategy = "uuid")
    
    主键自增为1,并且在MySQL时,不用序列,直接指定GenerationType.IDENTITY即可。
    mysql整型自增:
    @Id
    @GenericGenerator(strategy = "GenerationType.IDENTITY")
    
    SpringDataJpa-主键生成策略详解:参考文章最后:SpringDataJpa-主键生成策略
    
    

    配置

    1.@Configuration,@Bean
    		可理解为用spring的时候xml里面的<beans>标签,用@Configuration注解该类,等价 与XML中配置beans
    		@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名
    		例如:
    		@Configuration    
    		public class ExampleConfiguration {    
            @Value("com.mysql.jdbc.Driver")    
            private String driverClassName;    
    
            @Value("jdbc://xxxx.xx.xxx/xx")    
            private String driverUrl;    
    
            @Value("${root}")    
            private String driverUsername;    
    
            @Value("123456")    
            private String driverPassword;    
    
            @Bean(name = "dataSource")    
            public DataSource dataSource() {    
                BasicDataSource dataSource = new BasicDataSource();    
                dataSource.setDriverClassName(driverClassName);    
                dataSource.setUrl(driverUrl);    
                dataSource.setUsername(driverUsername);    
                dataSource.setPassword(driverPassword);    
                return dataSource;    
            }    
    
            @Bean    
            public PlatformTransactionManager transactionManager() {    
                return new DataSourceTransactionManager(dataSource());    
            }    
    	    
    	}  
    	
    注:在项目中
    @Autowired
    private DataSource dataSource;
    的时候,这个dataSource就是我们在ExampleConfiguration中配的DataSource。
    

    事务注解

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

    启动类

    @SpringBootApplication:
      启动注解,@SpringBootApplication是一个复合注解,包括@ComponentScan,	和@SpringBootConfiguration,@EnableAutoConfiguration
        @SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。
        @EnableAutoConfiguration的作用启动自动的配置,@EnableAutoConfiguration注解的意思就是Springboot根据你添加的jar包来配置你项目的默认配置,比如根据spring-boot-starter-web ,来判断你的项目是否需要添加了webmvc和tomcat,就会自动的帮你配置web项目中所需要的默认配置。在下面博客会具体分析这个注解,快速入门的demo实际没有用到该注解。
        @ComponentScan,扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。是以前的<context:component-scan>(以前使用在xml中使用的标签,用来扫描包配置的平行支持)。
    
    @ServletComponentScan:
    	在SpringBootApplication上使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。
    
    @MapperScan("com.Vm.server") :
    	@MapperScan注解只会扫描包中的接口,不会扫描类,扫描指定包中的接口
    
    @EnableScheduling: 
    	spring自带的定时服务
    	public class ScheduledTasks {
       @Scheduled(fixedRate = 1000 * 30) //每30秒执行一次
        public void reportCurrentTime(){
        System.out.println ("Scheduling Tasks Examples: The time is now " + dateFormat 			().format (new Date ()));
    	  }
    }
    

    Mybatis

    //Mapper中的namespace用于绑定Dao接口的,即面向接口编程。
    //namespace:一般是dao接口所在的路径+接口名称
    
    <mapper namespace="com.VmService.dao.IBlackDao">
    
    
    //resultMap属性:type为java实体类;id为此resultMap的标识。
    //id和result标签是最简单的映射,id为主键映射;result其他基本数据库表字段到实体类属性的映射。
    
    <resultMap id="BlackBean" type="com.VmService.model.BlackBean">
        <id column="ID" property="id"/>
        <id column="IM" property="im"/>
    </resultMap>
    
    //进行SQL语句查找
    <select id="selectAllBlackList" resultMap="BlackBean">
        SELECT
    		id as id,
    		im as im,
    	FROM
    		t_blacklist t1 
    	ORDER BY
    		id DESC
    </select>
    

    SpringDataJpa-主键生成策略

    一、SpringDataJpa标准用法

    spring data jpa 的标准主键生成策略主要有四种,分别是:

    public enum GenerationType {
        TABLE, //使用一个额外的数据库表来保存主键
        SEQUENCE,//使用序列的方式,且其底层数据库要支持序列,一般有postgres、Oracle等
        IDENTITY,//主键由数据库生成,一般为自增型主键,支持的有MySql和Sql Server
        AUTO//由程序来决定主键规则
    }
    

    主键的生成规则主要由注解 @GeneratedValue 来说明,其源码如下:

    @Target({METHOD, FIELD})
    @Retention(RUNTIME)
    public @interface GeneratedValue {
        GenerationType strategy() default AUTO;
        String generator() default "";
    }
    
    @Id  
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="payablemoney_seq")  
    @SequenceGenerator(name="payablemoney_seq", sequenceName="seq_payment")  
    

    使用的具体例子为:
    假设有一个表示人脸图片集合的类为FaceSet,其主键为facesetToken,则表示如下

    @Entity(name = "face_set")
    public class FaceSet{
    }
    
    • Sequence
      @SequenceGenerator 中的 sequenceName 为序列的名称,需要与@GeneratedValue 中的generator对应
      @Id
      @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="faceset_generator")
      @SequenceGenerator(name="faceset_generator", sequenceName="faceset_seq")
      @Column(name = "faceset_token", unique = true)
      private String facesetToken;
    
    • Auto
      如果不指定具体的生成规则,则默认为AUTO,即下列两种情况等价
    @Id  
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private String facesetToken;
    
    @Id  
    private String facesetToken;
    

    二、Hibernate主键策略生成

    hibernate-5.0.12.Final版本的默认工厂中有14种生成策略,具体可见org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory

        public DefaultIdentifierGeneratorFactory() {
            register( "uuid2", UUIDGenerator.class );
            register( "guid", GUIDGenerator.class );            // can be done with UUIDGenerator + strategy
            register( "uuid", UUIDHexGenerator.class );         // "deprecated" for new use
            register( "uuid.hex", UUIDHexGenerator.class );     // uuid.hex is deprecated
            register( "assigned", Assigned.class );
            register( "identity", IdentityGenerator.class );
            register( "select", SelectGenerator.class );
            register( "sequence", SequenceStyleGenerator.class );
            register( "seqhilo", SequenceHiLoGenerator.class );
            register( "increment", IncrementGenerator.class );
            register( "foreign", ForeignGenerator.class );
            register( "sequence-identity", SequenceIdentityGenerator.class );
            register( "enhanced-sequence", SequenceStyleGenerator.class );
            register( "enhanced-table", TableGenerator.class );
        }
    
        public void register(String strategy, Class generatorClass) {
            LOG.debugf( "Registering IdentifierGenerator strategy [%s] -> [%s]", strategy, generatorClass.getName() );
            final Class previous = generatorStrategyToClassNameMap.put( strategy, generatorClass );
            if ( previous != null ) {
                LOG.debugf( "    - overriding [%s]", previous.getName() );
            }
        }
    

    对几种比较常用的类型进行说明:

    • uuid
      采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。
      当使用strategy为uuid时,使用的时hibernate自己定义的UUID生成算法,此策略已过时,其具体实现参照org.hibernate.id. UUIDHexGenerator, 生成的字符串如402880876359adeb016359ae27190000
      当使用strategy为uuid2时,此为此版本推荐使用的uuid生成算法,其默认采用标准的生成策略StandardRandomStrategy,实现为使用jdk自带的uuid生成方法,生成的字符串如
      4af17c8e-8317-43e9-aff9-12d5590a71c6
    @Id
    @GeneratedValue(generator = "faceset_generator")
    @GenericGenerator(name = "faceset_generator", strategy = "uuid")
    
    • assigned
      插入主键时,由程序来指定。相当于JPA中的AUTO。
    @Id
    @GeneratedValue(generator = "faceset_generator")
    @GenericGenerator(name = "faceset_generator", strategy = "assigned")
    
    • sequence
    @Id
    @GeneratedValue(generator = "faceset_generator")  
    @GenericGenerator(name = "faceset_generator", strategy = "sequence",   
             parameters = { @Parameter(name = "sequence", value = "faceset_seq") }) 
    
    • guid
      采用数据库底层的guid算法机制,对应MYSQL的uuid()函数,SQL Server的newid()函数,ORACLE的rawtohex(sys_guid())函数等

    三、通过@GenericGenerator自定义主键生成策略

    常用数据库支持生成规则如下:

    数据库 支持的策略
    Postgres GenerationType.TABLE GenerationType.AUTO GenerationType.IDENTITY GenerationType.SEQUENCE
    Oracle GenerationType.TABLE GenerationType.AUTO GenerationType.SEQUENCE 不支持GenerationType.IDENTITY
    Mysql GenerationType.TABLE GenerationType.AUTO GenerationType.IDENTITY 不支持GenerationType.SEQUENCE
  • 相关阅读:
    zabbix系列(七)zabbix3.0添加对tcp连接数及状态的监控
    zabbix系列(六)zabbix添加对ubuntu系统的监控
    zabbix系列(六)zabbix添加对ubuntu系统的监控
    centos命令行变成了-bash-4.1$的解决办法
    zabbix常见报错问题处理
    sqlyog通过跳板机ssh连接mysql数据库
    centos系统初始化脚本
    修改centos和ubuntu ssh远程连接端口提升系统安全性
    listener failed: zbx_tcp_listen() fatal error: unable to serve on any address [[-]:20050]
    zabbix系列(五)zabbix3.0.4 探索主机Discovery自动发现主机详细图文教程
  • 原文地址:https://www.cnblogs.com/linuxtop/p/12627957.html
Copyright © 2011-2022 走看看