💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 简介 从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件, 被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被`AnnotationConfigApplicationContext`或`AnnotationConfigWebApplicationContext`类进行扫描,并用于构建bean定义,初始化Spring容器 . ~~~ 该类是一个配置类,它作用和bean.xml一样 spring中的新注解 Configuration 作用: 指定当前类是一个配置类 ComponentScan: 作用: 用于通过注解指定spring在创建容器时要扫描的包 属性: value: 他和basePackages作用是一样的,都是用于指定创建容器时要扫描的包,使用这个注解就等于在xml中配置了. <context:component-scan base-package="com.jdxia.domain"/> Bean 作用: 把当前方法的返回值作为bean对象存入spring的ioc容器中 属性: name用于指定bean的id.当不写的时候,默认值是当前方法的名称 ~~~ **注意**: 1. @Configuration不可以是final类型; 2. @Configuration不可以是匿名类; 3. 嵌套的configuration必须是静态类。 # 基本用途 配置文件 ~~~ @Configuration @ComponentScan("com.jdxia.domain") public class SpringConfiguration { @Bean("u") @Scope("prototype") public User createUser() { return new User(); } } ~~~ 执行 ~~~ AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); //加载配置类 ctx.register(SpringConfiguration.class); //刷新并创建容器 ctx.refresh(); User user = (User) ctx.getBean("u"); user.setId(1); user.setAddress("addr"); System.out.println(user); ~~~ # 配置相关 ## 加载配置类方法 * 硬编码,例如`ctx.register(AppConfig.class);` * 使用xml配置 ~~~ <beans> //这个注解用于启用ConfigurationClassPostProcessor等后置处理器,以加载以下类到容器。 <context:annotation-config/> <bean class="com.acme.AppConfig"/> </beans> ~~~ ~~~ XmlWebApplicationContext xmlWebApplicationContext = new XmlWebApplicationContext();
xmlWebApplicationContext.setConfigLocation("abc.xml"); ~~~ 组件扫描。@Configuration本身是**继承自@Component**,因此也可以和正常被@Component一样被扫描到,或使用autowired。 ## 组合多个配置类 可以使用@Import组合多个配置类,例如: ~~~ @Configuration public class DatabaseConfig { @Bean public DataSource dataSource() { // instantiate, configure and return DataSource } } ~~~ ~~~ @Configuration @Import(DatabaseConfig.class) public class AppConfig { private final DatabaseConfig dataConfig; public AppConfig(DatabaseConfig dataConfig) { this.dataConfig = dataConfig; } @Bean public MyBean myBean() { // reference the dataSource() bean method return new MyBean(dataConfig.dataSource()); } } //最后只需要导入一个即可 new AnnotationConfigApplicationContext(AppConfig.class); ~~~ ## `@Configuration`导入xml配置 ~~~ @Configuration @ImportResource("classpath:/com/acme/database-config.xml") public class AppConfig { @Inject DataSource dataSource; // from XML @Bean public MyBean myBean() { // inject the XML-defined dataSource bean return new MyBean(this.dataSource); } } ~~~ ## 内部类注解 ~~~ @Configuration public class AppConfig { @Inject DataSource dataSource; @Bean public MyBean myBean() { return new MyBean(dataSource); } @Configuration static class DatabaseConfig { @Bean DataSource dataSource() { return new EmbeddedDatabaseBuilder().build(); } } } ~~~ # PropertySource 加载各种配置信息。 其中ComposePropertySource提供了组合PropertySource的功能,查找顺序就是注册顺序。 默认提供了一个MutablePropertySources实现,我们可以调用addFirst添加到列表的开头,addLast添加到末尾,另外可以通过addBefore(propertySourceName, propertySource)或addAfter(propertySourceName, propertySource)添加到某个propertySource前面/后面; 最后大家可以通过iterator迭代它,然后按照顺序获取属性。 ~~~ Map<String, Object> map = new HashMap<>(); map.put("encoding", "gbk"); PropertySource propertySource1 = new MapPropertySource("map", map); System.out.println(propertySource1.getProperty("encoding")); ResourcePropertySource propertySource2 = new ResourcePropertySource("resource", "classpath:resources.properties"); //name, location System.out.println(propertySource2.getProperty("encoding")); ~~~ 注解 ~~~ @Configuration @ComponentScan("com.jdxia.domain") @PropertySource("classpath:jdbcConfig.properties") public class SpringConfiguration { ~~~