-
Notifications
You must be signed in to change notification settings - Fork 17
JavaConfig
@Configuration可以将类标记为配置类,并存放到容器中。配置类中支持配置文件的属性注入和编写工厂方法。在上下文启动时,容器会自动扫描resource目录下的配置文件,并将其注入到配置类@Value标注的属性中。
配置文件的默认加载路径为application.yaml或application.properties。
@Configuration注解可以将类标记为配置类
属性:
- prefix:配置项的前缀。(可选)
- location:为配置类指定加载自定义目录下配置文件(可选)
配置项的前缀:有时,为了简化操作,我们会为属性添加前缀。 例如,resource目录下的application.yaml文件如下:
server:
localhost: 127.0.0.1
names:
- name1
- name2
在这个配置文件中,原本我们想要获取localhost和names属性的值需要这样写:
@Configuration
public class ConfigBean{
@Value("server.localhost")
private String localhost;
@Value("server.names")
private List<String> names;
}
(有关@Value注解的用法,请查看property部分)
现在添加了前缀“server”,只需要为@Configuration注解设置prefix属性,就可以使配置类的属性配置更加容易。 如下:
@Configuration(prefix = "server")
public class ConfigBean{
@Value("localhost")
private String localhost;
@Value("names")
private List<String> names;
}
下面是另一个例子,resource目录下的jdbcConfig.properties文件如下:
server.localhost = 127.0.0.1
server.driver = com.mysql.cj.jdbc.Driver
server.port = 3306
配置文件中的三个属性的前缀均为“server”,所以prefix属性设置为“server”,
因为jdbcConfig.properties不是配置文件默认读取路径,所以为了读取该配置文件,需要设置location属性:
@Configuration(location = "jdbcConfig.properties", prefix = "server")
public class ConfigBean{}
需要注意的是,自定义的配置文件只能在@Configuration注解指定的类中使用。
实现配置类的属性注入需要使用@Value注解
属性:
- value:用于指定配置文件中属性的key值
下面是一个例子:
@Configuration(prefix = "server")
public class ConfigBean{
@Value("localhost")
private String localhost;
@Value("names")
private List<String> names;
}
在配置文件中,如果指定了profile属性,则会加载以profile值结尾的配置文件。 如以下配置文件:
application.yaml
profile: dev
name: hello
application-dev.yaml
name: hello-dev
由于指定了profile为dev,因此在加载配置文件时,将读取application-dev.yaml作为配置文件,而抛弃原本application.yaml中的配置。最终读取到的name属性值是hello-dev,而不是hello。利用profile可以指定不同环境下的配置文件。
在配置类中使用@Named注解标注工厂方法,容器会将工厂方法生成的bean存储到容器中并注入依赖。产品实例可以直接通过beanName和类型获取。同时,工厂方法也可以使用@Singleton注解设置Scope属性。工厂方法的beanName也需要具有唯一性。 需要注意的是,只有在配置类中才可以配置工厂方法。
示例如下,首先创建一个Bean,作为工厂方法的返回类型。
@Named
publiv class Bean{}
接下来使用@Named注解标注工厂方法
@Configuration(prefix = "server")
public class ConfigBean{
@Value("localhost")
private String localhost;
@Value("names")
private List<String> names;
@Singleton
@Named("factoryBean")
public Bean createBean(Bean bean){
return bean;
}
}