spring和springboot注解

https://www.jianshu.com/p/13de8e13173c

Spring注解

  • @Repository、@Component、@Service、@Constroller,都是将一个类标识为Bean,Spring容器根据注解的过滤规则扫描读取注解Bean定义类,并将其注册到Spring IoC容器中,它们分别用于软件系统的不同层次:
  • @Repository 将 DAO 类声明为 Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。
  • @Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。
  • @Service通常作用在业务层,但是目前该功能与 @Component 相同。
  • @Constroller 通常作用在控制层,但是目前该功能与 @Component 相同。
    -@Autowired进行装配,默认是byType的方式进行自动装配的。
    • @Autowired 注解可以用于 Setter 方法、构造函数、字段, 甚至普通方法,前提是方法必须有至少一个参数。
    • @Autowired 可以用于数组和使用泛型的集合类型。然后 Spring 会将容器中所有类型符合的 Bean 注入进来。
    • @Autowired 标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,则 Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来,用 Bean 的 id 或 name 作为 Map 的 key。
    • 当标注了 @Autowired 后,自动注入不能满足,则会抛出异常。
  • @Resource 默认是byName的方式进行自动装配的,只有当找不到匹配的名称或者Id时才按类型进行装配。如:
@Resource(name=”userDao”)  
private UsreDao userDao;  
  • @Value可以在类里调用设置在application.properties里的变量。访问方法是:@Value("${xxx}")
  • @Bean 放在方法上,意思就是让这个方法产生一个Bean,并且交给Spring容器管理。所以这个方法最后一定会返回一个对象。并且我们还可以在@Bean上设置一个name值,@Bean(name = "dataSource")这样就可以在自动装配时,通过指定name来指定装配对象。如果未通过@Bean指定bean的名称,则默认与标注的方法名相同。
  • @Scope @Bean注解默认作用域为单例singleton作用域,可通过@Scope(“prototype”)设置为原型作用域;每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例。
  • @Qualifier 手动指定byName的方式注入,一般和@Autowired配合使用,因为这个默认是byType的方式,如:@Qualifier("dataSource")
  • @Configuration 官方说法:从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
  • 实际可理解为用spring的时候xml里面的<beans>标签,@Bean可理解为用spring的时候xml里面的<bean>标签。注意:spring Boot不是spring的加强版,所以@Configuration和@Bean同样可以用在普通的spring项目中,而不是Spring Boot特有的,只是在spring用的时候,注意加上扫包配置<context:component-scan base-package="com.xxx.xxx" />或者@ComponentScan注解(@ComponentScan等价于<context:component-scan base-package="com.xxx"/>)。
@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;

// 此外,@Configuration 也可以去注册@Component的Bean,不过要用@ComponentScan()同时标注好要扫描的包,而包下面有@Componen注解的类才行。
// 再此外,@Configuration还可以和@ImportResource("classpath:applicationContext-configuration.xml")组合载入xml文件配置

 

  • @ConfigurationProperties 根据前缀分类映射到不同对象.
// 假设.properties文件如下:
test.name=cy
test.port=8090
test.servers[0]=dev.bar.com
test.servers[1]=foo.bar.com
// 对应调用类如下:
@ConfigurationProperties(prefix="test")
public class Config {
    private String name;
    private Integer port;
    private List<String> servers = new ArrayList<String>();

    public String geName(){
        return this.name;
    }

    public Integer gePort(){
        return this.port;
    }
    public List<String> getServers() {
        return this.servers;
    }
}

 

 

前后端传值

4.1 @PathVariable、@RequestParam
@PathVariable用于获取路径参数

@RequestParam用于获取查询参数

4.2 @RequestBody
用于读取Request请求(可能是POST\PUT\DELETE\GET请求)的body部分,并且Content-Type为application/json格式的数据,接收到数据之后会自动将数据绑定到java对象上去。系统会使用HttpMessageConverter或者自定义的HttpMessageConverter将请求的body中的json字符串转换为java对象。

 

 

参数检验

6.1 一些常用的字段验证的注解
@NotEmpty 被注释的字符串的不能为 null 也不能为空
@NotBlank 被注释的字符串非 null,并且必须包含一个非空白字符
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Pattern(regex=,flag=)被注释的元素必须符合指定的正则表达式
@Email 被注释的元素必须是 Email 格式。
@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=)被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期

 

 


springboot注解

  • @RestController @Controller+@ResponseBody的集合 在源码声明上同时有 @Controller 和 @ResponseBody 注解,所以使用了这个注解的类会被看作一个Controller,所以 @RestController 与 @Controller 的区别就是,@Controller返回的是ViewAndModel,@RestController返回的是字符串直接发送回给客户端。返回json或xml形式数据。
  • @RestController 源码声明:
@Target(value=TYPE)  
 @Retention(value=RUNTIME)  
 @Documented  
 @Controller  
 @ResponseBody  
public @interface RestController
  • @EnableAutoConfiguration 注解是类级别的,这个注解告诉Spring Boot“猜测”将如何配置Spring,它是基于添加的jar依赖。

Bean扫描机制-概览

<beans ...> 
 <context:component-scan base-package="a.b" name-generator="a.SimpleNameGenerator"/> 
 </beans> 
  • 先配置扫描地址,当一个 Bean 被自动检测到时,会根据那个扫描器的 BeanNameGenerator 策略生成它的 bean 名称。
  • 默认情况下,对于包含 name 属性的 @Component、@Repository、 @Service 和 @Controller,会把 name 取值作为 Bean 的名字。
  • 如果这个注解不包含 name 值或是其他被自定义过滤器发现的组件,默认 Bean 名称会是小写开头的非限定类名。
  • 如果你不想使用默认 bean 命名策略,可以提供一个自定义的命名策略。首先实现 BeanNameGenerator 接口,确认包含了一个默认的无参数构造方法。然后在配置扫描器时提供一个全限定类名,如上代码。
  • 通过上述注解标识的 Bean,其默认作用域是"singleton"。

Bean扫描机制-详解

  • Spring中,管理注解Bean定义的容器有两个:AnnotationConfigApplicationContext和 AnnotationConfigWebApplicationContex。
  • 这两个类是专门处理Spring注解方式配置的容器,直接依赖于注解作为容器配置信息来源的IoC容器。

javax.persistence下的注解

  • @Entity 说明此java类是实体类 ,与数据库表一一对应
  • @Id 表明主键

Lombok

  • @Data
  • @Getter

Hibernate

  • @DynamicUpdate 表示在更新时只会操作有改变的值,不会所有属性的值都再写一边。

jackson

  • @JsonProperty ,指定返回JSON数据时的一个名称

全局处理Controller层异常

        相关注解:1.@ControllerAdvice:注解定义全局异常处理类

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


@ServletComponentScan

在SpringBootApplication上使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。

在spring boot中添加自己的Servlet有两种方法,代码注册Servlet和注解自动注册(Filter和Listener也是如此)。
一、代码注册通过ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean 获得控制。
也可以通过实现 ServletContextInitializer 接口直接注册。

二、在 SpringBootApplication 上使用@ServletComponentScan 注解后,Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码。
https://blog.csdn.net/catoop/article/details/50501686

 

@RequiredArgsConstructor

在我们写controller或者Service层的时候,需要注入很多的mapper接口或者另外的service接口,这时候就会写很多的@Autowired注解,代码看起来很乱
lombok提供了一个注解:

@RequiredArgsConstructor(onConstructor =@_(@Autowired))
写在类上可以代替@Autowired注解,需要注意的是在注入时需要用final定义,或者使用@notnull注解

 

 

 
posted @ 2020-04-10 15:38  Nausicaa0505  阅读(381)  评论(0编辑  收藏  举报