Spring常用的加载配置文件方法

常用加载配置文件的几种方法,需要注意的地方!

/** * 利用XmlBeanFactory(Resource resource)
  * 这里Resource必须是xml格式
  * Resource包括:AbstractResource, ClassPathResource, FileSystemResource,
* InputStreamResource, ServletContextResource, UrlResource
*/
/*
* 利用 InputStreamResource(InputStream inputStream)
* 要将bean.xml放在项目根目录下
*/
InputStream is = null;
try {
is = new FileInputStream("bean1.xml");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Resource resource = new InputStreamResource(is);
sayHello(resource);
 /*
  * 利用 ClassPathResource(String path)
  * 要将bean.xml放在源文件夹(src)目录下
  */
resource = new ClassPathResource("bean2.xml");
 sayHello(resource);
  /*
  * 利用 FileSystemResource(String path)
  * 要将bean.xml放在项目根目录下
  */
  resource = new FileSystemResource("bean3.xml");
  sayHello(resource);
  /*
  * 利用 Properties
  * 要将bean.properties放在类路径--源文件夹(src)目录下
  */
  BeanDefinitionRegistry reg = new DefaultListableBeanFactory();
  PropertiesBeanDefinitionReader reader = new PropertiesBeanDefinitionReader(reg);
  reader.loadBeanDefinitions(new ClassPathResource("bean.properties"));
  BeanFactory factory = (BeanFactory) reg;
  bf = (BeanFile) factory.getBean("beanFile");
  System.out.println("利用 " + bf.getBeanFile() + " 加载 Bean.properties");
  /*
  * 利用 ApplicationContext
  * 要将bean.xml放在类路径--源文件夹(src)目录下
  */
  ApplicationContext appContext = new ClassPathXmlApplicationContext(
  "bean4.xml");
  bf = (BeanFile) appContext.getBean("beanFile");
  System.out.println("利用 " + bf.getBeanFile() + " 加载 Bean.xml");
  }
  public static void sayHello(Resource resource) {
  BeanFactory factory = new XmlBeanFactory(resource);
  BeanFile bf = (BeanFile) factory.getBean("beanFile");
  System.out.println("利用 " + bf.getBeanFile() + " 加载 Bean.xml");

[b] 小结[/b]

  这篇文章主要谈论了如何加载Spring的配置文件,一般来说,就是BeanFactory和ApplicationContext.最常使用的、简单的BeanFactory实现是org.springframework.beans.factory.xml.XmlBeanFactory,其加载方式为:BeanFactory factory = new XmlBeanFactory(Resource resource)

  这里resource必须是xml格式。Resource包括: AbstractResource, ClassPathResource, FileSystemResource, InputStreamResource, ServletContextResource, UrlResource.这篇文章 谈了常用的三种:ClassPathResource, FileSystemResource, InputStreamResource.

  ApplicationContext包括了BeanFactory的所有功能,也要比BeanFactory强大的多(以后会详细介绍的)。这里只简单的使用了ClassPathXmlApplicationContext加载了Bean配置文件。你可以将log4j.properties中的“Warn”改为“Debug”, 对比一下和ClassPathResource的输出,

  在Eclipse中,bean2.xml、bean4xml虽然都是放在源文件夹(src)目录下,但实际上,是由已经编译好的Test.class从类文件夹(这里是bin文件夹)中加载的。
Spring框架中,可以通过使用`@Conditional`注解及其派生注解来实现根据条件加载配置文件Bean的功能。这种方式允许根据特定的运行时条件动态决定是否加载某个Bean或配置类,从而提升应用的灵活性和可配置性。 ### 1. 使用`@Conditional`注解 `@Conditional`是Spring 4引入的核心条件注解,它允许根据自定义的条件逻辑来决定是否注册某个Bean或配置类。具体来说,可以将`@Conditional`与一个实现`Condition`接口的类结合使用。 例如,定义一个条件类: ```java public class MyCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { // 实现条件判断逻辑 return context.getEnvironment().getProperty("my.property", Boolean.class, false); } } ``` 然后在Bean或配置类上使用该条件: ```java @Bean @Conditional(MyCondition.class) public MyBean myBean() { return new MyBean(); } ``` 这种方式可以确保只有在`my.property`为`true`时,`MyBean`才会被加载[^1]。 ### 2. 使用内置的条件注解 Spring框架还提供了一些常用的派生注解,可以直接用于常见的条件判断场景: - `@ConditionalOnProperty`:根据配置文件中的属性值决定是否加载。 ```java @Bean @ConditionalOnProperty(name = "feature.enabled", havingValue = "true") public Feature feature() { return new Feature(); } ``` - `@ConditionalOnClass`:当类路径中存在指定类时才加载。 ```java @Bean @ConditionalOnClass(name = "com.example.SomeClass") public SomeBean someBean() { return new SomeBean(); } ``` - `@ConditionalOnMissingClass`:当类路径中不存在指定类时才加载。 - `@ConditionalOnBean` 和 `@ConditionalOnMissingBean`:根据容器中是否存在某些Bean来决定是否加载[^1]。 ### 3. 在配置类中使用条件 除了Bean级别的条件加载,还可以在配置类上使用条件注解,从而控制整个配置类中所有Bean加载行为。例如: ```java @Configuration @Conditional(MyCondition.class) public class MyConfig { @Bean public MyService myService() { return new MyService(); } } ``` 在这种情况下,只有满足`MyCondition`条件时,`MyConfig`类中的所有Bean才会被注册到Spring容器中[^1]。 ### 4. 使用`@Profile`注解 另一种常见的条件加载方式是使用`@Profile`注解,它允许根据当前激活的环境(如开发、测试、生产)来决定是否加载特定的Bean或配置。 ```java @Configuration @Profile("dev") public class DevConfig { @Bean public DataSource devDataSource() { return new EmbeddedDatabaseBuilder().build(); } } ``` 上述代码中的`DevConfig`类仅在`dev`环境激活时才会被加载。 ### 5. 结合`Environment`和`PropertyResolver` 除了注解方式,还可以通过编程方式访问`Environment`或`PropertyResolver`对象,动态判断条件并手动注册Bean。例如: ```java @Configuration public class DynamicConfig { @Autowired private ConfigurableEnvironment environment; @Bean public MyDynamicBean myDynamicBean() { if (environment.getProperty("dynamic.bean.enabled", Boolean.class, false)) { return new MyDynamicBean(); } else { return null; } } } ``` 这种方式提供了更大的灵活性,但需要额外的条件判断逻辑。 ### 6. 在Spring Boot中的自动配置 在Spring Boot中,自动配置类通常使用`@Conditional`注解及其派生注解来控制加载行为。例如,`spring-boot-actuator-autoconfigure`模块中的自动配置类会根据条件动态加载相关功能。这些条件可能包括类路径中是否存在特定类、是否满足某些属性设置等[^2]。 ### 7. 扫描和加载Bean的底层机制 Spring Boot通过`xPathMatchingResourcePatternResolver`类加载`basePackage`路径下的所有`.class`文件,并检查是否包含`@Component`注解(包括`@Configuration`、`@Controller`、`@Service`等派生注解)。如果包含,则将其注册为BeanDefinition[^3]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值