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教程@江南一点雨

posted @ 2020-08-26 14:20  AkimotoAkira  阅读(175)  评论(0编辑  收藏  举报