SpringBootApplication注解
SpringBoot程序启动入口一个是SpringApplication.run,一个是@SpringBootApplication注解,这个注解是由三部分组成:
@ComponentScan注解,主要用于组件扫描和自动装配。
@SpringBootConfiguration注解,这个注解主要是继承@Configuration注解,主要用于加载配置文件。
@EnableAutoConfiguration注解,这个注释启用了Spring Boot的自动配置功能,可以自动为您配置很多东西。
源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
@AliasFor(annotation = EnableAutoConfiguration.class)
Class[] exclude() default {};
@AliasFor(annotation = EnableAutoConfiguration.class)
String[] excludeName() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class[] scanBasePackageClasses() default {};
}
实例
@SpringBootApplication
public class HelloDemo implements CommandLineRunner {
private static final Logger log = LoggerFactory.getLogger(HelloDemo.class);
public static void main(String args[]) {
SpringApplication.run(HelloDemo.class);
}
@Override
public void run(String...args) throws Exception {
log.info("hello 51gjie");
}
}
@SpringBootApplication = @Configuration + @ComponentScan + @EnableAutoConfiguration,是这三个Spring注释的组合,只需一行代码即可提供所有三个注释的功能。
Spring ComponentScan注解详解
Spring中@ComponentScan注解的作用就是根据定义的扫描路径,把符合扫描规则的类装配到spring的bean容器中。
源码
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
@AliasFor("basePackages")
String[] value() default {};
@AliasFor("value")
String[] basePackages() default {};
Class[] basePackageClasses() default {};
Class nameGenerator() default BeanNameGenerator.class;
Class scopeResolver() default AnnotationScopeMetadataResolver.class;
ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
String resourcePattern() default "**/*.class";
boolean useDefaultFilters() default true;
ComponentScan.Filter[] includeFilters() default {};
ComponentScan.Filter[] excludeFilters() default {};
boolean lazyInit() default false;
@Retention(RetentionPolicy.RUNTIME)
@Target({})
public @interface Filter {
FilterType type() default FilterType.ANNOTATION;
@AliasFor("classes")
Class[] value() default {};
@AliasFor("value")
Class[] classes() default {};
String[] pattern() default {};
}
}
basePackages与value:? 用于指定包的路径,进行扫描
basePackageClasses: 用于指定某个类的包的路径进行扫描
nameGenerator: bean的名称的生成器
useDefaultFilters: 是否开启对@Component,@Repository,@Service,@Controller的类进行检测
includeFilters: 包含的过滤条件 FilterType.ANNOTATION:按照注解过滤,FilterType.ASSIGNABLE_TYPE:按照给定的类型,FilterType.ASPECTJ:使用ASPECTJ表达式,FilterType.REGEX:正则,FilterType.CUSTOM:自定义规则
excludeFilters: 排除的过滤条件,用法和includeFilters一样
注解方式
- 扫描包
@ComponentScan(basePackages = “”) //单个
@ComponentScan(basePackages = {“xxx”,“aaa”,“…”}) //多个
注意:可以省略“basePackages =”
@Configuration
@ComponentScan("com.51gjie.spring.service")
public class MyConfig {}
@Configuration
@ComponentScan("com.51gjie.spring.dao","com.51gjie.spring.service")
public class MyConfig {}
@Configuration
@ComponentScan("com.51gjie.spring.*") //通配符匹配所有的包
public class MyConfig {}
学习目录
-
搭建
- Eclipse安装springboot插件2种方法
- Eclipse搭建springboot项目(插件搭建,项目导入搭建)
-
原理
- springboot原理(核心原理,启动流程)
- SpringApplication详解(run执行启动)
- SpringBootApplication注解
- Spring ComponentScan注解详解
- SpringBootConfiguration注解
- EnableAutoConfiguration注解
- springboot注解大全
- SpringBoot Starter原理(依赖引入,自动配置)
-
应用
- SpringBoot集成mybatis+Druid+mybatis generator
- SpringBoot整合Mybatis Plus(代码自动生成)
- SpringBoot+mybatis增改删查例子
Spring ComponentScan注解详解
Spring中@ComponentScan注解的作用就是根据定义的扫描路径,把符合扫描规则的类装配到spring的bean容器中。
源码
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
@AliasFor("basePackages")
String[] value() default {};
@AliasFor("value")
String[] basePackages() default {};
Class[] basePackageClasses() default {};
Class nameGenerator() default BeanNameGenerator.class;
Class scopeResolver() default AnnotationScopeMetadataResolver.class;
ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
String resourcePattern() default "**/*.class";
boolean useDefaultFilters() default true;
ComponentScan.Filter[] includeFilters() default {};
ComponentScan.Filter[] excludeFilters() default {};
boolean lazyInit() default false;
@Retention(RetentionPolicy.RUNTIME)
@Target({})
public @interface Filter {
FilterType type() default FilterType.ANNOTATION;
@AliasFor("classes")
Class[] value() default {};
@AliasFor("value")
Class[] classes() default {};
String[] pattern() default {};
}
}
basePackages与value:? 用于指定包的路径,进行扫描
basePackageClasses: 用于指定某个类的包的路径进行扫描
nameGenerator: bean的名称的生成器
useDefaultFilters: 是否开启对@Component,@Repository,@Service,@Controller的类进行检测
includeFilters: 包含的过滤条件 FilterType.ANNOTATION:按照注解过滤,FilterType.ASSIGNABLE_TYPE:按照给定的类型,FilterType.ASPECTJ:使用ASPECTJ表达式,FilterType.REGEX:正则,FilterType.CUSTOM:自定义规则
excludeFilters: 排除的过滤条件,用法和includeFilters一样
注解方式
1. 扫描包
@ComponentScan(basePackages = “”) //单个
@ComponentScan(basePackages = {“xxx”,“aaa”,“…”}) //多个
注意:可以省略“basePackages =”
@Configuration
@ComponentScan("com.51gjie.spring.service")
public class MyConfig {}
@Configuration
@ComponentScan("com.51gjie.spring.dao","com.51gjie.spring.service")
public class MyConfig {}
@Configuration
@ComponentScan("com.51gjie.spring.*") //通配符匹配所有的包
public class MyConfig {}
2. 扫描类
@ComponentScan(basePackageClasses = “”) //单个
@ComponentScan(basePackageClasses = {“aaa”,“bbb”,“…”}) //多个
注意:不可以省略“basePackageClasses =”
@Configuration
@ComponentScan(basePackageClasses = HelloController.class)
public class MyConfig {
}
总结
Spring ComponentScan注解有以下特性:
1. 自定扫描路径下边带有@Controller,@Service,@Repository,@Component注解加入spring容器
2. 通过includeFilters加入扫描路径下没有以上注解的类加入spring容器
3. 通过excludeFilters过滤出不用加入spring容器的类
4. 自定义增加了@Component注解的注解方式
SpringBootConfiguration注解
SpringBootConfiguration是SpringBoot项目的配置注解,这也是一个组合注解,SpringBootConfiguration注解可以用java代码的形式实现spring中xml配置文件配置的效果,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
实例
@SpringBootConfiguration
public class Config {
@Bean
public Map MyMap(){
Map map = new HashMap();
map.put("website","51gjie");
map.put("type","javaschool");
map.put("age",5);
return map;
}
}
@RestController
@SpringBootApplication
public class App
{
public static void main( String[] args )
{
Map map = (Map) context.getBean("MyMap"); //注意这里直接获取到这个方法bean
int age = (int) map.get("age");
System.out.println("age=="+age);
}
}
SpringBoot项目中推荐使用@SpringBootConfiguration替代@Configuration
EnableAutoConfiguration注解
EnableAutoConfiguration是SpringBoot的一个特性,可以根据classpath中的jar依赖,自动注册bean,一般用于类或接口上,它尝试根据您添加的jar依赖项自动配置Spring应用程序。
源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class[] exclude() default {};
String[] excludeName() default {};
}
@EnableAutoConfiguration实现的关键在于引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法,借助AutoConfigurationImportSelector,它可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。
原理
当springboot扫描到@EnableAutoConfiguration注解时则会将spring-boot-autoconfigure.jar/META-INF/spring.factories文件中org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的value里的所有xxxConfiguration类加载到IOC容器中。spring.factories文件里每一个xxxAutoConfiguration文件一般都会有下面的条件注解:
@ConditionalOnClass : classpath中存在该类时起效
@ConditionalOnMissingClass : classpath中不存在该类时起效
@ConditionalOnBean : DI容器中存在该类型Bean时起效
@ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效
@ConditionalOnSingleCandidate : DI容器中该类型Bean只有一个或@Primary的只有一个时起效
@ConditionalOnExpression : SpEL表达式结果为true时
@ConditionalOnProperty : 参数设置或者值一致时起效
@ConditionalOnResource : 指定的文件存在时起效
@ConditionalOnJndi : 指定的JNDI存在时起效
@ConditionalOnJava : 指定的Java版本存在时起效
@ConditionalOnWebApplication : Web应用环境下起效
@ConditionalOnNotWebApplication : 非Web应用环境下起效
SpringBoot中EnableAutoConfiguration实现的关键在于引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法,逻辑大致如下:
从配置文件META-INF/spring.factories加载所有可能用到的自动配置类;
去重,并将exclude和excludeName属性携带的类排除;
过滤,将满足条件(@Conditional)的自动配置类返回;
SpringBoot注解就是给代码打上标签的能力。通过引入注解,我们可以简单快速赋予代码生命力,大大提高代码可读性和扩展性。注解本身不具有任何能力,只是一个标签,但是我们可以定义各种标签然后实现各种标签处理器来对类、方法、属性甚至参数等进行功能扩展、功能开启、属性定义、行为定义、规则定义、关联处理、元数据定义等等。
元注解
@Documented:将会在被此注解注解的元素的javadoc文档中列出注解,一般都打上这个注解没坏处
@Target:注解能被应用的目标元素,比如类、方法、属性、参数等等,需要仔细思考
@Retention:仅在源码保留,还是保留到编译后的字节码,还是到运行时也去加载,超过90%的应用会在运行时去解析注解进行额外的处理,所以大部分情况我们都会设置配置为RetentionPolicy.RUNTIME
@Inherited:如果子类没有定义注解的话,能自动从父类获取定义了继承属性的注解,比如Spring的@Service是没有继承特性的,但是@Transactional是有继承特性的,在OO继承体系中使用Spring注解的时候请特别注意这点,理所当然认为注解是能被子类继承的话可能会引起不必要的Bug,需要仔细斟酌是否开启继承
@Repeatable:Java 8引入的特性,通过关联注解容器定义可重复注解,小小语法糖提高了代码可读性,对于元素有多个重复注解其实是很常见的事情,比如某方法可以是A角色可以访问也可以是B角色可以访问,某方法需要定时任务执行,要在A条件执行也需要在B条件执行
@Native:是否在.h头文件中生成被标记的字段,除非原生程序需要和Java程序交互,否则很少会用到这个元注解
基本注解
@Service: 注解在类上,表示这是一个业务层bean
@Controller:注解在类上,表示这是一个控制层bean
@Repository: 注解在类上,表示这是一个数据访问层bean
@Component: 注解在类上,表示通用bean ,value不写默认就是类名首字母小写
@Autowired:按类型注入.默认属性required= true
@Resource: 按名称装配。
启动注解
@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中
@ComponentScan:让spring Boot扫描到Configuration类并把它加入到程序上下文。
@SpringBootConfiguration :等同于spring的XML配置文件;使用Java代码可以检查类型安全。
@EnableAutoConfiguration :自动配置。
HTTP注解
@RequestBody:HTTP请求获取请求体(处理复杂数据,比如JSON)
@RequestHeader:HTTP请求获取请求头
@CookieValue:HTTP请求获取cookie
@SessionAttribute:HTTP请求获取会话
@RequestAttribute:HTTP请求获取请求的Attribute中(比如过滤器和拦截器手动设置的一些临时数据),
@RequestParam:HTTP请求获取请求参数(处理简单数据,键值对),
@PathVariable:HTTP请求获取路径片段,
@MatrixAttribute:HTTP请求获取矩阵变量允许我们采用特殊的规则在URL路径后加参数(分号区分不同参数,逗号为参数增加多个值)
其他注解
@Transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。
@ConfigurationProperties:给对象赋值,将注解转换成对象。
@RequestMapping:和请求报文是做对应的
@EnableCaching:注解驱动的缓存管理功能
@GeneratedValue:用于标注主键的生成策略,通过 strategy 属性指定
@JsonIgnore:作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。
@JoinColumn(name=”loginId”):一对一:本表中指向另一个表的外键。一对多:另一个表指向本表的外键。