понедельник, 6 марта 2017 г.

Spring Dependency Lookup

Рассмотрим способ внедрения зависимостей через DependencyLookup. Предположим, нам необходимо получать новый инстанс объекта при каждом обращении. С этим поможет справится DependencyLookup. Способ реализации через аннотации. ApplicationContext будет практически пустой:

    

Интерфейс бина в котором необходим постоянно обновляемый бин:
package com.test.example;

public interface DemoBean {
    MyHelper getMyHelper();
    void someOperation();
}


Релизация постоянно обновляемого бина:
package com.test.example;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("prototype")
public class MyHelper {
    public void doSomethingUsefully(){

    }
}

Самое интересное это @Scope("prototype"). Данная аннотация говорит Spring, что, данный бин не синглтон. Реализация бина в который внедряется зависимость:

package com.test.example;

import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.stereotype.Component;

@Component
public class AbstractLookupDemoBean implements DemoBean{

    @Lookup
    public MyHelper getMyHelper(){
        return null;
    }

    public void someOperation() {
        getMyHelper().doSomethingUsefully();
    }
}

Аннотация @Lookup говорит, о том, что Spring'у необходимо будет взят данную функцию и предоставить свою реализацию с уже внедренной зависимостью, т.е. можно было бы сделать данный класс абстрактным и  сделать так:
@Lookup
public abstract MyHelper getMyHelper();

Работоспособность бы не изменилась. Ну и класс запуска:
package com.test.example;

import org.springframework.context.support.GenericXmlApplicationContext;

public class Application {
    public static void main(String[] arg){
        GenericXmlApplicationContext context = new GenericXmlApplicationContext();
        context.load("application.xml");
        context.refresh();

        DemoBean demoBean = (DemoBean) context.getBean("abstractLookupDemoBean");
        demoBean.someOperation();
        MyHelper helper1 = demoBean.getMyHelper();
        MyHelper helper2 = demoBean.getMyHelper();
        System.out.println("Helper Instances the Same?: " + (helper1 == helper2));
    }
}

В консоли всегда будет false
Теперь рассмотрим реализацию через xml. Все аннотации будут удалены, Контекст будет


    
    
        
    


Классы не изменятся, в них только пропадут аннотации.

Комментариев нет :

Отправить комментарий