Spring核心容器模块是Spring框架的基础,负责管理Spring应用中的Bean及其生命周期。核心容器模块的关键组件包括:
1. BeanFactory
BeanFactory是Spring IoC容器的基础接口,负责管理Bean的实例化、配置和生命周期。BeanFactory实现了工厂模式,通过配置文件或注解来创建和管理Bean。
主要特点:
- 延迟初始化(Lazy Initialization):BeanFactory在首次访问时才创建Bean实例。
- 轻量级:BeanFactory适用于资源受限的环境,如移动设备或嵌入式系统。
示例代码:
Resource resource = new ClassPathResource("beans.xml");
BeanFactory beanFactory = new XmlBeanFactory(resource);
MyBean myBean = beanFactory.getBean(MyBean.class);
2. ApplicationContext
ApplicationContext是BeanFactory的扩展,提供了更多的企业级功能,如事件传播、国际化、统一的资源访问方式等。ApplicationContext包含BeanFactory的所有功能,并增加了对更复杂应用需求的支持。
主要特点:
- 立即加载:ApplicationContext在启动时立即实例化所有单例Bean。
- 提供更丰富的功能:如AOP、事件机制、国际化等。
常用实现:
ClassPathXmlApplicationContext
:从类路径下的XML配置文件中加载上下文。FileSystemXmlApplicationContext
:从文件系统中的XML配置文件中加载上下文。AnnotationConfigApplicationContext
:从Java配置类中加载上下文。
示例代码:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MyBean myBean = context.getBean(MyBean.class);
3. 配置方式
Spring提供了多种方式来配置和管理Bean,包括XML配置、注解配置和Java配置。
XML配置
XML配置是最传统的方式,通过XML文件来定义Bean及其依赖关系。
示例代码:
<beans xmlns="http://www.springframework.org/schema/beans" ...>
<bean id="myBean" class="com.example.MyBean">
<property name="property" value="value"/>
</bean>
</beans>
注解配置
注解配置利用Java注解来定义Bean和依赖关系,减少了XML配置的冗余。
示例代码:
@Component
public class MyBean {
@Autowired
private MyDependency myDependency;
}
Java配置
Java配置通过Java类和方法来配置Bean,提供了更强的类型安全性和灵活性。
示例代码:
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
@Bean
public MyDependency myDependency() {
return new MyDependency();
}
}
4. 常见功能
ApplicationContext提供了一些常见的功能,帮助开发者更方便地管理应用。
国际化(Internationalization)
ApplicationContext支持国际化,通过MessageSource接口来处理消息和资源的国际化。
示例代码:
MessageSource messageSource = context.getBean(MessageSource.class);
String message = messageSource.getMessage("greeting", null, Locale.ENGLISH);
事件机制(Event Mechanism)
ApplicationContext支持事件机制,允许Bean发布和监听事件。
示例代码:
public class MyEvent extends ApplicationEvent {
public MyEvent(Object source) {
super(source);
}
}
@Component
public class MyEventListener implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent event) {
System.out.println("Received event: " + event);
}
}
@Component
public class MyEventPublisher {
@Autowired
private ApplicationEventPublisher publisher;
public void publish() {
publisher.publishEvent(new MyEvent(this));
}
}
资源加载(Resource Loading)
ApplicationContext提供了统一的资源加载方式,通过Resource接口来访问不同类型的资源。
示例代码:
Resource resource = context.getResource("classpath:myfile.txt");
Spring核心容器模块通过以上功能和配置方式,使得应用开发更加灵活和高效。开发者可以根据具体需求选择合适的配置方式和功能,来构建稳定、可扩展的应用。