一文學(xué)透ApplicationContext繼承接口功能及與BeanFactory區(qū)別
BeanFactory與ApplicationContext關(guān)系的分析
BeanFactory是Spring中最基本的接口,它是Spring IoC容器中最底層的接口,提供了IoC容器最基本的形式,它具有最基本的 IoC 功能,負(fù)責(zé)管理 Spring Bean 的生命周期,通過 BeanFactory 可以獲取指定 Bean 的實(shí)例。 ApplicationContext是BeanFactory的子接口,ApplicationContext繼承了BeanFactory接口的全部功能,同時(shí)還提供了其他的一些功能。ApplicationContext是Spring中最重要的接口之一,它是Spring容器的具體實(shí)現(xiàn),在BeanFactory的基礎(chǔ)上添加了一些更加實(shí)用的功能,比如資源加載、事件發(fā)布、AOP和事務(wù)等。 因此,可以認(rèn)為ApplicationContext繼承了BeanFactory,擁有了更多的功能和擴(kuò)展性。
ApplicationContext繼承的接口與功能
- ResourceLoader:加載資源文件
- MessageSource:國際化消息的源頭
- ApplicationEventPublisher:應(yīng)用事件發(fā)布
- EnvironmentCapable:獲取當(dāng)前應(yīng)用的環(huán)境信息
- ListableBeanFactory:提供了批量操作Bean的方法
- HierarchicalBeanFactory:層次性的BeanFactory,支持子容器
- AutowireCapableBeanFactory:Bean自動(dòng)裝配的BeanFactory
- BeanDefinitionRegistry:定義和注冊(cè)BeanDefinition的接口
- ConfigurableApplicationContext:ApplicationContext可配置的接口,對(duì)外提供了修改bean定義、激活環(huán)境、注冊(cè)shut-down hook等能力。
BeanFactory應(yīng)用代碼示例
public class TestBean {
private String name;
public TestBean() {
System.out.println("constructor of TestBean is invoked");
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class BeanFactoryExample {
public static void main(String[] args) {
Resource resource = new ClassPathResource("spring-config.xml");
BeanFactory factory = new XmlBeanFactory(resource);
TestBean testBean = (TestBean) factory.getBean("testBean");
System.out.println("The name is : " + testBean.getName());
}
}
其中,ClassPathResource是一個(gè)用于從classpath中加載資源文件的類。XmlBeanFactory是Spring提供的一個(gè)實(shí)現(xiàn)了BeanFactory接口的IoC容器實(shí)例。在實(shí)例化XmlBeanFactory時(shí),需要提供一個(gè)Resource對(duì)象,這里傳入的是spring-config.xml文件。
ApplicationContext各功能的應(yīng)用代碼示例
ResourceLoader 接口的示例
public class ResourceLoaderExample {
public static void main(String[] args) throws IOException {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
ResourceLoader loader = context;
Resource resource = loader.getResource("classpath:test.txt");
InputStream inputStream = resource.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
}
}
這段示例代碼通過ApplicationContext實(shí)例化了一個(gè)ResourceLoader對(duì)象,然后通過getResource方法加載了"classpath:test.txt"文件。這個(gè)文件在classpath路徑下,所以可以使用 classpath: 前綴來定位文件。
MessageSource 接口的示例
首先,需要在Spring配置文件中定義一個(gè)資源文件:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages" />
</bean>
然后,在Java代碼中使用注入方式獲取 MessageSource 實(shí)例:
public class MessageSourceExample {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
MessageSource messageSource = (MessageSource) context.getBean("messageSource");
String message = messageSource.getMessage("test", null, Locale.getDefault());
System.out.println("The message is : " + message);
}
}
這個(gè)示例代碼中,我們通過 messageSource.getMessage("test", null, Locale.getDefault()) 方法根據(jù)當(dāng)前默認(rèn)的語言獲取了 messages.properties 中 test 屬性的值。
ApplicationEventPublisher 接口的示例
我們可以在啟動(dòng)時(shí)發(fā)布一個(gè)事件:
public class MyApplicationEvent extends ApplicationEvent {
public MyApplicationEvent(Object source) {
super(source);
}
}
public class PublishEventExample {
public static void main(String[] args) {
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
context.addApplicationListener(new ApplicationListener<MyApplicationEvent>() {
@Override
public void onApplicationEvent(MyApplicationEvent event) {
System.out.println("MyApplicationEvent received!");
}
});
context.publishEvent(new MyApplicationEvent("Hello World!"));
context.close();
}
}
當(dāng)程序成功運(yùn)行時(shí),我們可以看到輸出了 MyApplicationEvent received! 的信息。
EnvironmentCapable 接口的示例
這個(gè)接口用于獲取當(dāng)前運(yùn)行的環(huán)境信息:
public class EnvironmentExample {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
Environment environment = context.getEnvironment();
System.out.println("The environment is : " + environment.getProperty("os.name"));
}
}
ListableBeanFactory接口示例
這個(gè)接口中提供了一些批量操作Bean的方法:
public class ListableBeanFactoryExample {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
ListableBeanFactory beanFactory = context.getBeanFactory();
String[] beanNames = beanFactory.getBeanDefinitionNames();
for (String beanName : beanNames) {
System.out.println(beanName);
}
}
}
AutowireCapableBeanFactory接口示例
這個(gè)接口用于完成Bean的自動(dòng)裝配:
public class AutowireCapableBeanFactoryExample {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
AutowireCapableBeanFactory beanFactory = context.getAutowireCapableBeanFactory();
TestBean testBean = new TestBean();
beanFactory.autowireBean(testBean);
System.out.println("The name is : " + testBean.getName());
}
}
BeanDefinitionRegistry接口示例
這個(gè)接口用于注冊(cè)Bean:
public class BeanDefinitionRegistryExample {
public static void main(String[] args) {
XmlBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
BeanDefinition beanDefinition = new RootBeanDefinition(TestBean.class);
registry.registerBeanDefinition("testBean", beanDefinition);
TestBean testBean = (TestBean) beanFactory.getBean("testBean");
System.out.println("The name is : " + testBean.getName());
}
}
這個(gè)示例代碼中,我們通過 BeanDefinitionRegistry 接口實(shí)現(xiàn)了向容器注冊(cè) TestBean 的過程。
ConfigurableApplicationContext接口示例
這個(gè)接口用于修改bean定義、激活環(huán)境、注冊(cè)shut-down hook等能力:
public class ConfigurableApplicationContextExample {
public static void main(String[] args) {
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
ConfigurableEnvironment environment = context.getEnvironment();
environment.setActiveProfiles("dev");
context.refresh();
TestBean testBean = (TestBean) context.getBean("testBean");
System.out.println("The name is : " + testBean.getName());
}
}
在這個(gè)示例代碼中,我們通過 ConfigurableApplicationContext 接口修改了當(dāng)前的運(yùn)行環(huán)境,激活了dev配置文件并重新刷新了容器,然后獲取了 testBean 的實(shí)例并輸出它的名稱。
以上就是一文學(xué)透ApplicationContext繼承接口功能及與BeanFactory區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于ApplicationContext BeanFactory繼承接口的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
IDEA?Error:java:無效的源發(fā)行版:13的解決過程
之前用idea運(yùn)行時(shí),也會(huì)出現(xiàn)這種情況,后面通過網(wǎng)上的資料解決了這個(gè)問題,下面這篇文章主要給大家介紹了關(guān)于IDEA?Error:java:無效的源發(fā)行版:13的解決過程,需要的朋友可以參考下2023-01-01
springboot關(guān)閉druid監(jiān)控 druid2改配置文件無效的解決
這篇文章主要介紹了springboot關(guān)閉druid監(jiān)控 druid2改配置文件無效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
MyBatis?Generator快速生成實(shí)體類和映射文件的方法
這篇文章主要介紹了MyBatis?Generator快速生成實(shí)體類和映射文件的方法,通過示例代碼介紹了MyBatis?Generator?的使用,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
解決java.util.NoSuchElementException異常的問題
這篇文章主要介紹了解決java.util.NoSuchElementException異常的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09

