本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!
三个注解的功能集成:
在应用程序所在的包上启用扫描
@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 {配置组件扫描指令,以与 Configuration 类一起使用。
com
+- javaedge
+- myapplication
+- Application.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java默认的包结构及其作用:
允许在Spring中注册额外的bean或导入其他配置类
// 表明一个类提供 Spring Boot 应用的 @Configuration(即配置类)。它可作为 Spring 标准 @Configuration 注解的替代品,使得该配置能够被自动发现(如在单元测试中)。
// 一个 Spring Boot 应用只能包含 一个 @SpringBootConfiguration,而最常见的做法是让应用通过 @SpringBootApplication 继承它
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration //see!!!
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)
})
public @interface SpringBootApplication {SpringBoot中建议放弃通过XML定义Spring应用程序,推荐在代码类上面通过@Configuration实现配置。如有需要,还可通过@ImportResource导入xml配置文件。

类别 | 注解 | 说明 |
|---|---|---|
条件依赖 |
| 应用中包含某个类时,对应的配置才生效 |
| 应用中不包含某个类时 | |
| Spring容器中存在指定class的实例对象时 | |
| Spring容器中不存在指定class的实例对象时 | |
| 指定参数的值符合要求时 | |
| 指定文件资源存在时 | |
| 当前处于Web环境时(WebApplicationContext) | |
| 当前非处于Web环境时,对应的配置才生效。 | |
| 指定参数的值符合要求时,对应的配置才生效。
和 | |
先后顺序 |
| 指定Configuration类后加载。 |
| 指定Configuration类前加载。 | |
| 指定该Configuration类的加载顺序,默认值0 |
Spring应用可通过属性文件,YAML文件,环境变量和命令行参数等方式的外部化参数配置
java -jar app.jar --name="test"SPRING_ APPLICATION_ JSON='{"name'":"test"}'如果是web应用,可读取ServletConfig init参数。
来自java:comp/env。
System.getProperties()Java系统属性之一,表示当前用户的工作目录(working directory),也称当前工作路径(current working directory)。当Java应用程序启动时,会自动设置这个属性的值,指向该应用所在的目录。
user.dir指Java程序运行时的当前目录路径,而非Java文件所在的目录路径:
System.getProperty("user.dir")或
System.getenv().forEach((k, v) -> {
System.out.println(k + ":" + v);
});
COMMAND_MODE:unix2003
LC_CTYPE:zh_CN.UTF-8
RABBIT_HOME:/usr/local/Cellar/rabbitmq/3.12.1
JAVA_HOME:/Users/javaedge/Library/Java/JavaVirtualMachines/openjdk-22.0.1/Contents/Home
HOMEBREW_BOTTLE_DOMAIN:https://mirrors.ustc.edu.cn/homebrew-bottles/bottles
SHELL:/bin/zsh
TMPDIR:/var/folders/lh/hztrg5y17w50q03jvnqyy2pw0000gn/T/
__CFBundleIdentifier:com.jetbrains.intellij
HOME:/Users/javaedge
SSH_AUTH_SOCK:/private/tmp/com.apple.launchd.FmZOzahGyn/Listeners
OLDPWD:/
XPC_SERVICE_NAME:application.com.jetbrains.intellij.91501400.94811146
PATH:/Users/javaedge/Downloads/PycharmProjects/google-cloud-sdk/bin:/usr/local/opt/krb5/sbin:/usr/local/opt/krb5/bin:/usr/local/opt/ffmpeg@5/bin:/Users/javaedge/Library/Java/JavaVirtualMachines/openjdk-22.0.1/Contents/Home/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/Library/Apple/usr/bin:/Users/javaedge/Library/Application Support/org.dfinity.dfx/bin:/Users/javaedge/Downloads/flutter/bin:/usr/local/Cellar/rabbitmq/3.12.1/sbin:/Users/javaedge/Downloads/soft/apache-maven-3.9.6/bin
M2_HOME:/Users/javaedge/Downloads/soft/apache-maven-3.9.6
WORKON_HOME:/Users/javaedge/virtualenvwrapper_envs
LOGNAME:javaedge
USER:javaedge
HOMEBREW_GITHUB_API_TOKEN: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
__CF_USER_TEXT_ENCODING:0x1F5:0x19:0x34
XPC_FLAGS:0x0
VIRTUALENVWRAPPER_PYTHON:/usr/local/bin/python3
VIRTUALENVWRAPPER_VIRTUALENV:/usr/local/bin/virtualenv
PWD:/Users/javaedge/Downloads/IDEAProjects/education-microservice
HOMEBREW_API_DOMAIN:https://mirrors.ustc.edu.cn/homebrew-bottles/api获取user.dir属性的值。通常,user.dir被用于:
总之,user.dir是Java系统属性中一个非常重要的参数,与Java程序的文件操作、路径处理和日志记录等方面密切相关。熟练掌握user.dir属性的使用方法和特性,对于Java开发人员来说是必不可少的基础知识。
os环境变量
配置文件:
提供一种方便的声明性机制,用于将一个 PropertySource 添加到 Spring 的 Environment,与 @Configuration 类协作。
给定一个app.properties,以下@Configuration类用于@PropertySource贡献 app.properties Environment的集合PropertySources。testbean.name=myTestBean
@Configuration
@PropertySource("classpath:/com/myco/app.properties")
public class AppConfig {
@Autowired
Environment env;
@Bean
public TestBean testBean() {
TestBean testBean = new TestBean();
testBean.setName(env.getProperty("testbean.name"));
return testBean;
}
}该 Environment 对象位于 @Autowired 配置类,然后在填充 TestBean 对象时使用。给定上述配置,调用 将 testBean.getName() 返回 “myTestBean”。
解析 ${...} 占 <bean> 位符和 @Value 批注为了使用 中的PropertySource属性解析定义或@Value注释中的 <bean> ${...}占位符,须确保在 中使用的 ApplicationContext中注册BeanFactory了适当的嵌入值解析程序。在 XML 中使用时,<context:property-placeholder>这会自动发生。使用@Configuration类时,可以通过显式注册 via PropertySourcesPlaceholderConfigurer static @Bean 方法来实现这一点。但请注意,通常只有在需要自定义配置(如占位符语法等)时才需要显式注册 via PropertySourcesPlaceholderConfigurer static @Bean 方法。有关详细信息和示例,请参阅 的 javadocs 的 “使用 外部化值” 部分和 的 @Configuration“BeanFactoryPostProcessor-return @Bean 方法说明”。@Bean
解析资源位置中的 @PropertySource ${...} 占位符
资源位置中@PropertySource存在的任何 ${...} 占位符都将针对已针对环境注册的属性源集进行解析。例如:
@Configuration
@PropertySource("classpath:/com/${my.placeholder:default/path}/app.properties")
public class AppConfig {
@Autowired
Environment env;
@Bean
public TestBean testBean() {
TestBean testBean = new TestBean();
testBean.setName(env.getProperty("testbean.name"));
return testBean;
}
}假设“my.placeholder”存在于已注册的属性源之一(例如,系统属性或环境变量)中,则占位符将被解析为相应的值。如果没有,则“默认/路径”将用作默认值。表示默认值(由冒号“:”分隔)是可选的。如果未指定默认值且无法解析属性,则会抛出 将 IllegalArgumentException 。
关于属性覆盖的说明 @PropertySource
如果给定的属性键存在于多个 .properties 文件中,则最后 @PropertySource 处理的批注将“获胜”并覆盖具有相同名称的任何先前键。
如给定两个属性文件 a.properties、b.properties,考虑以下两个使用@PropertySource注解它们的配置类:
@Configuration
@PropertySource("classpath:/com/myco/a.properties")
public class ConfigA {
}
@Configuration
@PropertySource("classpath:/com/myco/b.properties")
public class ConfigB {
}重写顺序取决于这些类在应用程序上下文中注册的顺序。
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(ConfigA.class);
ctx.register(ConfigB.class);
ctx.refresh();上述方案中的 b.properties 属性将覆盖 中 a.properties存在的重复项。
某些情况下,使用 @PropertySource 时严格控制属性源排序可能是不可能或不切实际的。如上面这类是通过组件扫描注册,则 @Configuration 很难预测顺序。这时若重写很重要,建议用户回退到使用编程式 PropertySource API。
根据Java 8,此注解可重复。 但所有这些 @PropertySource 都要在同一级别声明:直接在配置类或作为同一自定义注解上的元注解声明。不建议混合使用直接注释和元注释,因为直接注释将有效地覆盖元注释。
注解导入的配置:
@Component
@Data
@PropertySource("classpath:tencentCloud.properties")
@ConfigurationProperties(prefix = "tencent.cloud")
public class TencentCloudProperties {
private String SecretId;
private String SecretKey;
}
程序入口通过SpringApplication.setDefaultProperties方法设定的参数配置。
1.当前项目运行的盘符/config文件夹下面: file../config/
2.当前项目运行的目录下面(命令执行的所在目录) :file:./
classpath:/configclasspath:/
上述配置文件按优先级排列,排在上面的位置会覆盖优先级降低的配置。SpringBoot支持两种配置文件的格式: .properites、 .yml
spring:
datasoure:
username: test
list:
- one
- twospring.datasource.username=test通过 @Value("${my.name}"',将指定的参数配置注入到属性。
注入Environment对象。
// 注入env対象
@Autowired
Environment environment;
// 使用示例
environment.getProperty("name");@ConfigurationProperties(prefix="my")将该注解添加到指定的 Java 类上,Spring Boot 会自动将配置文件中以 my 为前缀的属性绑定到该类的对应字段上。
属性需有getters和setters方法。