SpringBoot

IDEA创建springboot项目

如果左边栏有Spring Initializr最好

手动创建的话,需要进行三个步骤:创建Maven工程引入依赖提供启动类

配置文件:

  • properties文件
    • IDEA自动生成application.properties配置文件,可以被springboot自动识别

例:

1
2
server.port=9090
server.servlet.context-path=/start
  • yml/yaml文件(荐)
    • 创建application.yml文件,其格式与properties文件有所不同

例:

1
2
3
4
server:
port: 9090
servlet:
context-path:/start

yml的层级表示更加清晰,不需要像properties一样要写多次相同层级,并且更关注数据。

配置文件的书写

yml配置文件可以实现配置信息与代码的解耦合,如某实体类中

1
2
3
4
5
6
7
@Component
public class EmailProperties {
public String user = "";
public String code = "";
public String host = "";
private boolean auth = true;
}

如果直接把信息写进代码会使代码与数据的耦合度过高,可以提取出信息写进properties配置文件:

1
2
3
4
email.user=
email.code=
email.host=
email.auth=

在yml文件中为:

1
2
3
4
5
email:
user: #键与值之间必须有空格作为分隔符
code:
host:
auth:

这里也能看出yml文件远比properties层级分明,更加清晰且书写冗余少

如果要配置数组信息,使用如下语法

1
2
3
4
hobbies:
- sing
- dance
- rap

配置文件的获取

使用@Value("${键名}")访问配置文件中的信息:

1
2
3
4
5
6
@Component
public class EmailProperties {
@Value("${email.user}")
public String user = "";
//....
}

对于每一个变量都要添加@Value注解,很麻烦。对于相同前缀的配置信息,可以使用同一个配置:@ConfigurationProperties(prefix="")

1
2
3
4
5
6
7
8
@ConfigurationProperties(prefix="email")
@Component
public class EmailProperties {
public String user = "";
public String code = "";
public String host = "";
private boolean auth = true;
}

*什么是注解

视频 注解和反射

注解Annotation是所有框架(Mybatis、Spring等)的底层实现机制。注解和反射是一组相对的概念。

  • Annotation从JDK5.0开始引入
  • 可以对程序做出解释(类似注释,并不是程序本身)、可以被其他程序(如编译器)读取

形式是@注释名,还可以添加参数值,如@SuppressWarnings(value="unchecked")

Bean管理

Bean注册

注解 说明 位置
@Component 声明bean的基础注解 不属于以下三类时用此注解
@Controller @Component的衍生注解 标注在控制器类上
@Service @Component的衍生注解 标注在业务类上
@Repository @Component的衍生注解 标注在数据访问类上(mybatis已整合,很少用)

@Component及其衍生注解无法声明来自第三方的bean对象

使用maven命令引入第三方包:

1
2
3
4
5
mvn install:install-file -Dfile=path/to/jar # 引入的包在本地磁盘的路径
-DgroupId=groupID # 组织ID
-DartifactId=artifactID # 项目ID
-Dversion=version # 版本号
-Dpackaging=jar # 打包方式(jar)

然后在项目pom/xml文件中引入依赖:

1
2
3
4
5
<dependency>
<groupId>groupID</groupId>
<artifactId>artifactID</artifactId>
<version>version</version>
</dependency>

如何声明第三方包的Bean对象?

  • 使用@Bean

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // 向IoC容器注入第三方包的bean对象
    // 也就是将方法返回值交给IoC容器管理,成为IoC容器的bean

    // bean的注册可以在配置类中进行集中注册
    // 另外,配置类所在的包必须在启动类所在包内,否则无法自动扫描
    @Configuration
    public class CommonConfig {
    @Bean
    public NewBean newBean() {
    return new NewBean();
    }

    // 如果一个bean要依赖另一个已经存在的bean,则只需在方法上声明即可
    @Bean
    public MaBean maBean(NewBean newBean) {
    return new MaBean();
    }
    }
  • 使用@Import

    如果配置类不在启动类目录及子目录中,可以使用@Import注解进行设置

    • 导入配置类

      1
      2
      3
      4
      5
      6
      7
      @SpringBootApplication
      @Import(CommonConfig.class)
      public class Application {
      public static void main(String[] args) {
      ApplicationContext context = SpringApplication.run(Application.class, args)
      }
      }
    • 导入ImportSelector接口实现类

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      // CommonImportSelector是ImportSelector的实现
      public class CommonImportSelector implements ImportSelector {
      @Override
      public Stirng[] selectImports(AnnotationMetadata importingClassMetadata) {
      return new String[] {"com.groupID.config.CommonConfig"};
      }
      }

      // 接下来在使用@Import注解的类中设置实现类即可:
      //@Import(CommonImportSelector.class)

      可以将需要导入的多个配置类写进.imports文件,然后selectImports读取配置文件:

      1
      2
      com.groupID.config.CommonConfig
      com.groupID.config.NoCommonConfig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class CommonImportSelector implements ImportSelector {
@Override
public Stirng[] selectImports(AnnotationMetadata importingClassMetadata) {
List<String> imports = new ArrayList<>();
InputStream is = CommonImportSelector.class.getClassLoader().getResourceAsStream("common.imports");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = null;
try {
while ((line = br.readLine()) != null) {
imports.add(line);
}
br.close();
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

return imports.toArray(new String[0]);
}
}
`@Import`可以写进自定义的组合注解进行封装,一般命名为`@EnableXXXX`,这里不再赘述

注:返回启动类的内容:项目中启动类Application的主函数是

1
2
3
4
5
6
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args)
}
}

可以使用ApplicationContext接收容器内容,如下:

1
2
3
4
5
6
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(Application.class, args)
}
}

如果想获取启动类中的bean对象,只需NewBean bean = context.getBean(NewBean.class)即可。

(写这个是因为大三上学期的Android课设的时候经常看到这段语句,当时还不理解什么意思)