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注解