Дополнительная тема Spring4.x (1): Spring Aware

задняя часть Spring API дизайнер

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();
    }
}

Результат работы показан на следующем рисунке:
aware

5. Пример исходного кода:

githubадрес:Нажмите, чтобы просмотреть
Адрес облака кода:Нажмите, чтобы просмотреть

награда Добро пожаловать в публичный аккаунт Life Designer в WeChat.
Публичный идентификатор: longjiazuoA