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