springboot系列(三) 启动类中关键注解作用解析
一、Springboot:请求入口@SpringBootApplication @EnableAspectJAutoProxy @EnableScheduling @EnableTransactionManagement public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);} }
1、@SpringBootApplication注解
@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 {…… }
复合注解:包含@EnableAutoConfiguration、@ComponentScan、@SpringBootConfiguration
a 、@EnableAutoConfiguration:也是复合注解、借助@Import将所有符合自动配置条件的bean定义加载到Spring ioc 中。帮助springboot应用将所有符合条件的@configuration配置都加载到当前spring ioc。
@Import注解的使用。这个注解帮助我们将多个配置文件(可能是按功能分,或是按业务分)导入到单个主配置中,以避免将所有配置写在一个配置中
b、@ComponentScan:主要作用扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。是以前的<context:component-scan>(以前使用在xml中使用的标签,用来扫描包配置的平行支持)。可通过@ComponentScan 的basepackage等属性来指定扫描范围。(@SpringBootApplication(scanBasePackages = "com.ucredit")。如果不指定默认spring框架实现,从声明@ComponentScan所在的类的package进行扫描。所以springboot的启动类最好放在root package下。
c、@SpringBootConfiguration:继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。@SpringBootConfiguration注解类相当于spring配置bean的xml文件。
d、@Configuration
Spring是给予IOC的,在4.0之前的版本,通常都是程序依赖上下文xml文件来管理bean,尽管有了扫描配置后相对简单,然而java配置的方式不同于xml,通过注解能够更简单。下面我们通过这两种方式比较下。
- xml中bean的定义
<beans><bean id="course" class="demo.Course"><property name="module" ref="module"/></bean><bean id="module" class="demo.Module"><property name="assignment" ref="assignment"/></bean><bean id="assignment" class="demo.Assignment" /> </beans>
- 注解配置类
@Configuration public class AppContext {@Beanpublic Course course() {Course course = new Course();course.setModule(module());return course;}@Beanpublic Module module() {Module module = new Module();module.setAssignment(assignment());return module;}@Beanpublic Assignment assignment() {return new Assignment();} }
@Configuration,该注解配置在类上,告知Spring这个类是一个拥有bean定义和依赖项的配置类。@Bean注释用于定义Bean,该注解位于实例化bean并设置依赖项的方法上。方法名默认通beanId活默认名称相同,该方法返回类型是Spring注册的bean。总体来说就是告诉Spring容器加载这个配置,相对于xml,这个注解就是将*.xml配置进web.xml
e、@Import
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Import {/*** {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}* or regular component classes to import.*/Class<?>[] value();}
- @Import 与xml配置方式下的 作用一样。支持导入的类型有:
一个或多个拥有 @Configuration 注解的配置类 - ImportSelector 接口的实现类
- ImportBeanDefinitionRegistrar 的实现类
1)、如果Import注解中Class为ImportSelector子类,通过invokeAwareMethods(selector)设置aware值,如果类型为 DeferredImportSelector则添加到deferredImportSelectors集合中,待前面的parser.parse(configCandidates)
方法中processDeferredImportSelectors()处理;如果不是,则执行selectImports方法,将获取到的结果递归调用 processImports,解析selectImports得到的结果
2)、如果Import注解中Class为ImportBeanDefinitionRegistrar子类,则添加到importBeanDefinitionRegistrars中,注 意该部分的数据在执行完parser.parse(configCandidates)后调用this.reader.loadBeanDefinitions(configClasses)解 析,否则执行配置信息的解析操作。
public interface Car {public void print(); } @Component public class Toyota implements Car {@Overridepublic void print() {// TODO Auto-generated method stubSystem.out.println("I am Toyota");}}@Component public class Volkswagen implements Car {@Overridepublic void print() {// TODO Auto-generated method stubSystem.out.println("I am Volkswagen");}}@Configuration public class JavaConfigA {@Bean(name="volkswagen")public Car getVolkswagen(){return new Volkswagen();} }@Configuration public class JavaConfigB {@Bean(name="toyota")public Car getToyota(){return new Toyota();} }@Configuration @Import({JavaConfigA.class,JavaConfigB.class}) public class ParentConfig {//Any other bean definitions } public class ContextLoader {public static void main (String args[]){AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ParentConfig.class);Car car = (Toyota)context.getBean("toyota");car.print();car = (Volkswagen)context.getBean("volkswagen");car.print();context.close();} }
转载于:https://www.cnblogs.com/keepruning/p/9289995.html
springboot系列(三) 启动类中关键注解作用解析相关推荐
- 【j360-boot】Spring-boot系列三(崩溃模式,不是你崩就是电脑崩)
2019独角兽企业重金招聘Python工程师标准>>> j360-boot spring-boot入门工程之j360-boot:(欢迎star.fork) https://githu ...
- spring boot 通过配置文件控制是否启用启动类上的注解
在开发过程中遇到了,需要根据配置文件来控制是否开启单点的问题.单点cas需要在spring的启动类上进行注解,所以需要通过配置文件来进行控制是否引入. @SpringBootApplication@E ...
- IDEA中根据数据库自动生成实体类,并自定义所生成的实体类中的注解 @Table @Id @...
使用IDEA项目添加Hibernate扩展,生成实体类并配置实体类中的注解 一.使用Hibernate自动生成实体类 1.在项目上右键,选择Add Framework Support找到 Hibern ...
- spring-boot框架dubbo在controlle中r注解@Reference注入service,但是调用方法时候,service报null空指针异常
spring-boot框架dubbo在controlle中r注解@Reference注入service,但是调用方法时候,service报null空指针异常 参考文章: (1)spring-boot框 ...
- [darknet源码系列-3] 在darknet中,如何根据解析出来的配置进行网络层构建
[darknet源码系列-3] 在darknet中,如何根据解析出来的配置进行网络层构建 FesianXu 20201120 at UESTC 前言 笔者在[1,2]中已经对darknet如何进行配置 ...
- python类初始化详解_python类中super() 的使用解析
描述 super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO).重复 ...
- SpringBoot系列三:SpringBoot基本概念(统一父 pom 管理、SpringBoot 代码测试、启动注解分析、配置访问路径、使用内置对象、项目打包发布)...
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.了解SpringBoot的基本概念 2.具体内容 在之前所建立的 SpringBoot 项目只是根据官方文档实现的一个基础程 ...
- SpringBoot启动类的扫描注解的用法及冲突原则
背景 SpringBoot 启动类上,配置扫描包路径有三种方式,最近看到一个应用上三种注解都用上了,代码如下: @SpringBootApplication(scanBasePackages ={&q ...
- @Transactional +自定义注解不生效_SpringBoot之路(三)SpringDataJpa中常用注解的使用...
1 @Query注解详解及其用法 说明:本文的写作构建在笔者的SpringBoot之路(二)使用用Spring-Data-JPA访问数据库进行基本的CRUD操作这篇文章的基础之上. @Query注解在 ...
最新文章
- 跨越十年,我的重要时刻它从未离开过
- java jdk实现快速排序_Java实现快速排序过程分析
- CF1303F - Number of Components(并查集)
- LeetCode 2012. 数组美丽值求和
- linux如何打开url,用于打开URL的命令?
- OSChina 周二乱弹 —— 这样成功要到小护士姐姐的微信
- Spring.profile实现开发、测试和生产环境的配置和切换
- 问道虚拟机服务器地址,问道1.60.0905虚拟机手工启动服务端+配套客户端+启动教程+充值注册软件+配套工具...
- 叮,你有一份光线追踪技术合集待查收 | IMG2020
- 【个人管理】Nicholas C. Zakas:我得到的最佳职业生涯建议
- CIE 国际照明委员会
- JAVA 开发基础【JSON相关】
- joomla 视频_Joomla的成年
- 蓝桥云课练习题 用杂志拼接信件
- java枚举值转化中文_多个枚举的国际化(枚举值的转换)
- 2018年应届毕业宇视科技嵌入式软件开发工程师面试笔试总结
- 优秀Android开发源码合集(附解析)程序员进阶宝典
- Docker 搭建FastDFS文件系统
- 开发人员troubleshooting的方式
- 收藏了,挺有意思的生成太极图