zoukankan      html  css  js  c++  java
  • Spring Boot 中的 Starter

    Spring核心

    1. Bean:Bean包装的是一个Object,说Bean可以理解有数据的对象,已经被实例化的某个类的对象。
    2. IOC/Context:IOC是一个容器,是存放管理Bean的地方,可以看成是Beans关系的一个集合。Context组件就是对IOC 容器的实现。
    3. Core:Core组件提供许多核心组件,其中定义了资源访问方式。将资源都抽象为一个借口Resource。

    个人理解:IOC是Spring的一个关键点,这是他给出的盒子,被装进这个盒子的的Java类被IOC实例化后就叫Bean。IOC的作用就是把Java的某个类通过自身转化,得到一个可用的实例化对象。

    注解的理解

    • @Configuration:表示此类为配置类,代替XML文件,其中包含一个或多个@Bean注解的方法。
    • @Bean:与@Configuration搭配使用,用于方法头部。此时,方法会产生一个Bean对象并存入IOC。
    • @ConfigurationProperties(perfix="xxx"):类型安全的属性注入。定义于配置文件application.properties中前缀为xxx的属性注入到类对应属性上。
    • @EnableConfigurationProperties(xxx.class):@ConfigurationProperties使得某个类的属性被注入了一些值,而这个注解则是在让这个类对应的Bean存入IOC。也可以说是让之前@ConfigurationProperties注解生效,因为这个注解虽然让类得到了值但是并没有相应的实例化对象。与之作用相同的是@Component等,但是用的地方不一样。
    • @ConditionalOnClass(xxx.class):表示项目当前classPath下存在xxx类时,后面配置才生效
    • @SpringBootConfiguration:Spring Boot项目启动类上都有一个。是@Configuration的派生类(不同在于@Configuration属于Spring,而它属于SpringBoot)用在某类头部表示此类是个配置类。
    • @EnableAutoConfiguration:@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class)的组合注解,表示启用Spring程序上下文的自动配置,会去读取spring.factories文件,这个文件定义了需要加载的自动化配置类。

    Starter

    Starter的理解

    starter可以当成是一个maven依赖组,引入这个组名就引入了所有的依赖。

    比如常见的Starter:

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

    引入这个依赖就可以满足我们日常Web接口开发,否则需要引入spring-web、spring-webmvc、spring-aop等来作为支持。也就是说一个Starter就是一系列的已做好配置文件的依赖配置。

    首次建立自己的Starter

    先建立一个普通的Maven项目,然后添加依赖:

        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-autoconfigure</artifactId>
                <version>2.1.4.RELEASE</version>
            </dependency>
        </dependencies>
    
        <!--打包插件-->
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <compilerVersion>1.8</compilerVersion>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    

    配置好了依赖,创建一个IMProperties,为了接受配置文件注入的值

    @ConfigurationProperties(prefix = "akira")
    public class IMProperties {
        private static final String DEFAULT_NAME = "本秋明";
        private String name = DEFAULT_NAME;
    
        public static String getDefaultName() {
            return DEFAULT_NAME;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    对于DEFAULT_NAME:static修饰表示它是静态属性,所有对象共享一个值。final修饰表示它是一个属性值为常量。

    定义一个IMService,再在其中写一个IM方法:

    public class IMService {
        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String IM(){
            return "I'm " + name + ".";
        }
    }
    

    接下来配置AutoConfiguration类,也就是就是我们写逻辑的地方:

    @Configuration
    @EnableConfigurationProperties(IMProperties.class)
    @ConditionalOnClass(IMProperties.class)
    public class AutoConfiguration {
        @Autowired
        IMProperties IMProperties;
    
        @Bean
        IMService helloService(){
            IMService IMService = new IMService();
            IMService.setName(IMProperties.getName());
            return IMService;
        }
    }
    

    至此,所有类就已经配置完成了,但还需要一个spring.factories文件。Spring Boot项目启动类都含有一个@SpringBootApplication注解,注解定义:

    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(excludeFilters = {
    		@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
    		@Filter(type = FilterType.CUSTOM,
    				classes = AutoConfigurationExcludeFilter.class) })
    public @interface SpringBootApplication {
    }
    

    这是一个组合注解,其中@EnableAutoConfiguration表示启用 Spring 应用程序上下文的自动配置,该注解会自动导入一个名为 AutoConfigurationImportSelector 的类,而这个类会去读取一个名为 spring.factories 的文件, spring.factories 中则定义需要加载的自动化配置类。所以在Maven 项目的 resources/META-INF/spring.factories(缺就新建)写入:

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=yuri.AutoConfiguration
    

    = 后填的是AutoConfiguration类的路径。此外,这个spring.factories文件可以通过注解的方式代替。

    至此,所有工作完成。点击右边的 Maven Project ,然后选择 Lifecycle 中的 install安装,然后就能在本地仓库里看到你的自己的依赖了。

    使用自建Starter

    新建一个SpringBoot项目,添加自建Starter的依赖

    QQ截图20200826195551

    groupId和artifactId,version一般默认是1.0-SNAPSHOT(Idea未修改的话),这里顺便讲一下groupId和artifactId的含义:

    groupId和artifactId统称为坐标,保证了项目的唯一性。

    groupId是项目组织的唯一标识符,分为多段。第一段为域,比如:org表示非营利组织、com表示商业组织、cn表示中国等。第二段则公司名称。

    artifactId是项目唯一标示符,对应项目根路径名称。

    如果你忘记了你自己Starter的Maven项目的这些属性时,你可以去你的仓库中找寻这些信息QQ截图20200826201048

    比如我的groupId是yuri,artifactId是Starter(一般artifactId对应项目名称,但我这里不是)version是1.0-SNAPSHOT。

    当依赖成功引入后,建立一个test作为我们的测试类

    QQ截图20200826201438

    运行测试类得到输出

    QQ截图20200826201653

    此时我们并没有往application.properties中添加属性值,所以此时输出的name是DEFAULT_NAME。现在我们向application.properties添加一句akira.name=萧瑟,则输出为:

    QQ截图20200826201620

    如果上一个中文没有出现乱码,但配置application.properties后出现中文乱码,则是application.properties没有设置UTF-8编码,修改设置

    Akira_20200827101109

    还有更好的办法就是用 yaml配置文件。

    参考资料:SpringBoot教程@江南一点雨

  • 相关阅读:
    Cmake Make makefile GNU autotools
    第三方库的安装:Pangolin
    ./configure, make, sudo make install 的含义
    [Eigen]C++开源线代库
    术语解释
    KDevelop使用笔记【中文教程】
    Python-Day1
    找不到或无法加载主类
    仅仅测试Word2016发布博客
    First Day!
  • 原文地址:https://www.cnblogs.com/AkimotoAkira/p/13564927.html
Copyright © 2011-2022 走看看