1. Последний штрих
SpringИзюминкой внедрения зависимостей является то, что все, что у вас есть,BeanправильноSpringСуществование контейнера бессознательно. то есть вы можете заменить свой контейнер другим контейнером, например.Goggle Guice, В настоящее времяBeanСвязь между ними очень низкая.
Но в реальных проектах мы неизбежно используемSpringФункциональные ресурсы самого контейнера, на этот разBeanдолжен осознатьSpringСуществование контейнера может вызватьSpringпредоставляемые ресурсы, это называетсяSpring Aware. фактическиSpring Awareбыло быSpringПредназначен для внутреннего использования внутри фреймворка, если используетсяSpring Aware, твойBeanволя иSpringРамная муфта.
Springкоторый предоставилAwareИнтерфейс показан в следующей таблице:
Осведомленный интерфейс, предоставляемый Spring
| BeanNameAware | Получить имя компонента в контейнере |
|---|---|
| BeanFactoryAware | Получите текущую фабрику бобов, чтобы вы могли вызывать службы контейнера |
| ApplicationContextAware* | Получите текущий контекст приложения, чтобы вы могли вызывать службы контейнера |
| MessageSourceAware | Получить источник сообщения, чтобы вы могли получить текстовую информацию |
| ApplicationEventPublisherAware | Издатель событий приложения, который может публиковать события |
| ResourceLoaderAware | Получить загрузчик ресурсов, получить внешний файл ресурсов |
Spring AwareЦель состоит в том, чтобы сделатьBeanполучитьSpringКонтейнерный сервис. потому чтоApplicationContextинтегрированный интерфейсMessageSourceинтерфейс,ApplicationEventPublisherAwareинтерфейс иResourceLoaderAwareинтерфейс, такBeanнаследоватьApplicationContextAwareможет получитьSpringВсе службы контейнера, но в принципе мы можем реализовать любой интерфейс, который используем.
2. Примеры
1. Подготовьтесь.
существуетorg.light4j.sping4.senior.awareСоздать новый под пакетомtest.txt, Содержимое является необязательным, загружаются и используются следующие внешние ресурсы.
2. Spring Aware Demo Bean
package org.light4j.sping4.senior.aware;
import java.io.IOException;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service;
@Service
public class AwareService implements BeanNameAware,ResourceLoaderAware{//①
private String beanName;
private ResourceLoader loader;
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {//②
this.loader = resourceLoader;
}
@Override
public void setBeanName(String name) {//③
this.beanName = name;
}
public void outputResult(){
System.out.println("Bean的名称为:" + beanName);
Resource resource =
loader.getResource("classpath:org/light4j/sping4/senior/aware/test.txt");
try{
System.out.println("ResourceLoader加载的文件内容为: " + IOUtils.toString(resource.getInputStream()));
}catch(IOException e){
e.printStackTrace();
}
}
}
Объяснение кода:
① Осознать
BeanNameAware,ResourceLoaderAwareинтерфейс, получитьBeanИмя и ресурс загруженного сервиса.
② ОсознатьResourceLoaderAwareнужно переписатьsetResourceLoaderметод.
③ ОсознатьBeanNameAwareнужно переписатьsetBeanNameметод.
3. Класс конфигурации
package org.light4j.sping4.senior.aware;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("org.light4j.sping4.senior.aware")
public class AwareConfig {
}
4. Беги
package org.light4j.sping4.senior.aware;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AwareConfig.class);
AwareService awareService = context.getBean(AwareService.class);
awareService.outputResult();
context.close();
}
}
Результат работы показан на следующем рисунке:
5. Пример исходного кода:
награда Добро пожаловать в публичный аккаунт Life Designer в WeChat.
githubадрес:Нажмите, чтобы просмотреть
Адрес облака кода:Нажмите, чтобы просмотреть
Публичный идентификатор: longjiazuoA