欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springboot学习教程(七)- 常用注解

程序员文章站 2022-03-12 17:56:29
...

Spring boot中的常用注解

  在Springboot中,摒弃了Spring以往项目中大量繁琐的配置,遵循约定大于配置的原则,通过自身默认配置,极大的降低了项目搭建的复杂度。同样在Springboot中,大量注解的使用,使得代码看起来更加简洁,提高开发的效率。这些注解不光包括Springboot自有,也有一些是继承自Spring的。
  个人认为,Springboot的注解从通俗上可分为三类:注入容器类注解、从容器取出类注解和项目功能配置类注解,下面将会介绍一些常用的注解。

注入容器类注解

1、@Bean:放在方法上,用@Bean标注方法等价于XML中配置bean,这个方法一般返回一个实体对象,告诉spring这里产生一个对象,然后这个对象会交给Spring管理。产生这个对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的容器中。
2、@Component:放在类上,把普通类实例化到spring容器中。可以说很多注解都是基于这个注解的。
3、@Configuration:标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。(其实就是靠@Component注解)源码如下。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    String value() default "";

4、@ConfigurationProperties:将配置文件中的参数映射成一个对象,通过prefix来设定前缀,然后将后面的和对象的属性名一致就能实现注入(当然这个对象需要注入的属性需要提供get和set方法 — 因为spring底层其实就是通过反射调用该对象的set方法)例子如下:

@ConfigurationProperties(prefix = “spring.datasource.test1”) 
public class Datasource1 { 
    private String url; 
    private String username; 
    private String password; 
    get - - set方法 

application.properties: 内容例子如下

spring.datasource.test1.url=jdbc:mysql://localhost:3307/multipledatasource1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false 
spring.datasource.test1.username=root 
spring.datasource.test1.password=root 
spring.datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driver

by the way,上述说到get和set方法,可以使用注释@Data,可以快速自动构建get、set和toString方法,非常方便,使用方法如下:
  1)添加maven依赖:

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
 </dependency>

  2)按顺序操作:Settings->Plugins
springboot学习教程(七)- 常用注解
  搜索Lombok并安装,重启idea
springboot学习教程(七)- 常用注解
  3)使用@Data并测试如下:

import lombok.Data;

@Data
public class MyTestBean {
    private Integer id;
    private String name;
    private String password;
}

  测试:

public class TestMyBean {
    public static void main(String[] args){
        MyTestBean m=new MyTestBean();
        m.setId(1);
        m.setName("zhangsan");
        m.setPassword("123456");
        System.out.println(m);
    }
}

5、@Value: value的作用其实和ConfigurationProperties作用差不多,就是读取配置文件中参数的值,但是value是放在变量上面的,且是单值读取,还有一点就是value标注的变量并不需要和配置文件的参数名字一致。例子如下:

@Value(“${参数}) 
private String apple;

application.properties:

apple=1;

参数=值
注意:配置文件中的参数和value表达式中的参数名字是要保持一致的

6、@RestController、@Controller、@Service、@Repository
  想必大家对这几个注解也是非常熟悉,因为很常用,但是在这里要强调的是,他们在本质上是一样的,至少在spring5.x之前,他们实质上是没有什么区别的(当然你非要说@aaa@qq.comaaa@qq.com这个也对)。我这边主要是要强调,他们实质上都是依靠于@Component注解的,我们可以查看源码,这里以@Controller、@Service为例子:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    String value() default "";
}
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
    String value() default "";
}

  我们可以看到@Service 和@Controller 这两个注解里面的东西是一模一样的,没什么区别,有时候不小心把这两个换了位置运行程序,发现功能是不变的。

从容器取出类注解

1、@Resource:是按照名称来注入的,当找不到与名称匹配的bean才会按照类型来注入。其实我们平时用的@Resource都是用了他的默认的方式,即都不指定名字和类型。spring通过反射机制使用byName方法自动注入

@Resource(type = ShiroService.class, name = "shiroService") 
private ShiroService shiroService;

@Resource 的装配顺序:

  1. 如果同时指定了 name 属性和 type 属性,那么 Spring 将从容器中找唯一匹配的 bean 进行装配,找不到则抛出异常
  2. 如果指定了 name 属性值,则从容器中查找名称匹配的 bean 进行装配,找不到则抛出异常
  3. 如果指定了 type 属性值,则从容器中查找类型匹配的唯一的 bean 进行装配,找不到或者找到多个都会抛出异常
  4. 如果都不指定,则会自动按照 byName 方式进行装配,这个应该是最常用的。

2、@Autowried:默认是按照类型进行装配注入,如果允许 null 值,可以设置它 required 为false。即:当不能确定 Spring 容器中一定拥有某个类的 Bean 时,可以在需要自动注入该类 Bean 的地方可以使用 @Autowired(required = false) ,这等于告诉 Spring:在找不到匹配 Bean 时也不报错。

@Autowired(required = false)
private ShiroService shiroService;

3、@Qualifier:@Autowired是根据类型进行自动装配的。如果当Spring上下文中存在不止一个A类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在A类型的bean,而且我们又使用A类型,也会抛出BeanCreationException异常。针对存在多个A类型的Bean,我们可以联合使用@Qualifier和@Autowired来解决这些问题

@Autowried
@Qualifier("adminDAO")
private AdminDAO adminDAO;

  简单来说,Qualifier就是规定一下Bean的名字,相当于@Resource规定了name属性。

项目功能配置类注解

1、@SpringBootApplication:这个注解就是集成了:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan这三个注解。其中@SpringBootConfiguration:表示这个类为配置类;@EnableAutoConfiguration:表示开启自动配置,我们平时所说springboot无配置就是这个参数起的作用,他读取了springboot默认的配置;@ComponentScan:表示自动扫描,这个扫描默认只能扫同一级的目录。

2、@Configuration:可以用java代码的形式实现spring中xml配置文件配置的效果。

3、@EnableConfigurationProperties:将带有@ConfigurationProperties注解的类注入为Spring容器的Bean。如果使用了@ConfigurationProperties但是没有在启动类上增加这个注解,则@ConfigurationProperties将不起作用。

4、@Async与@EnableAsync:其中@Async表示这个方法为异步方法;@EnableAsync这个注解需要加在启动类上,表示支持异步操作;如果不加,则@Async将不起作用。简单来说,@Async就相当于另起一个线程。

5、@Scheduled与@EnableScheduling: 定时任务。@EnableScheduling这个注解需要加在启动类上,表示支持定时任务

@Scheduled(cron = "0/5 * *  * * ? ")
    public void doTest() {
        System.out.println(new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date()));
    }