简介
本文介绍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