简介

        本文介绍SpringBoot启动类常用的几个注解,以及自定义启动类注解的方法。

@SpringBootApplication

scanBasePackages

示例:

@SpringBootApplication(scanBasePackages="com.test.chapter4")

        此basePackages其实是@ComponentScan中的,通过查看scanBasePackages即可得知。

        @SpringBootApplication只会扫描@SpringBootApplication注解标记类包下及其子包的类,将这些类纳入到spring容器,只要类有@Component注解即可。

        有的注解的定义中已加入@Component,所以这些注解也会被扫描到:@Controller,@Service,@Configuration

@MapperScan

作用:定义扫描MyBatis接口。

SpringBoot有个bug:在application.properties中指定Mapper是无效的:mybatis.mapper-locations=classpath:com.springboot.chapter15/mapper/*.xml

示例:(对于Mybatis)

package com.example.demo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan(annotationClass = Mapper.class, basePackages = "com.springboot.chapter15.mapper")
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

示例:(对于Mybatis-Plus)

对于Mybatis-Plus,不需要写annotationClass

package com.example.demo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan(basePackages = "com.springboot.chapter15.mapper")
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

多个包下的mapper

例如:com.springboot.chapter15.mapper, com.springboot.chapter16.section1.mapper,两种方法:

法1:@MapperScan(basePackages = "com.springboot.**.mapper")
法2:@MapperScan(basePackages = {"com.springboot.chapter15.mapper", "com.springboot.chapter16.section1.mapper"});

@MapperScan与@Mapper

@MapperScan作用

        Spring启动时,扫描到所有的Mapper文件,并生成代理类交给spring容器管理;

@Mapper作用

        当项目启动时,扫描到被此注解标识接口类,就会创建代理类并交给spring容器管理。如果不加@MapperScan注解,那么Mapper接口类上就要添加@Mapper注解。

@Repository注解

        @Repository是spring的注解,主动标识当前类要交给spring容器管理(相当于@Component注解)。

        一般添加了@Mapper注解或者@MapperScan注解,那么就不用添加@Repository。因为@Mapper注解(@MapperScan注解)已将改接口的代理类给了spring容器管理。

        但是,有时候IDEA会识别不了@Mapper注解,在项目自动编译的时候,项目会爆红色波浪线,加@Respository注解,可以抑制这种报错。

自定义启动类注解

        在微服务项目中,多个微服务有时会在启动类上都加同一个注解来启用某个功能。比如:我用的是SpringCloud,那么每个项目的启动类都要加上:@EnableDiscoveryClient,很麻烦,解决方法为:将都要使用的注解统一拿出来:

package com.example.common.common.annotation;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.*;

@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@MapperScan("com.example.**.mapper")
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients("com.example.common.feign")
public @interface CommonApplication {
    @AliasFor(annotation = SpringBootApplication.class)
    String[] scanBasePackages() default "com.example.**";
}

这样,所有微服务只需加一个@CommonApplication即可,例如:

package com.example.order;

import com.example.common.common.annotation.CommonApplication;
import org.springframework.boot.SpringApplication;

@CommonApplication
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

}

如果微服务想引入其他注解,也可以添加,例如:

package com.example.order;

import com.example.common.common.annotation.CommonApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling
@CommonApplication
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

}

其他网址

@SpringBootApplication

springboot快速入门及@SpringBootApplication注解分析

《深入浅出Spring Boot 2.x》=> 3.2.1 通过扫描装配你的Bean