Как сделать lookup-method в spring с помощью аннотаций?

Пользователь

от linnea , в категории: Java , 7 месяцев назад

Как сделать lookup-method в spring с помощью аннотаций?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от abel , 6 месяцев назад

@linnea 

В Spring аннотацией @Lookup можно пометить метод внутри абстрактного класса или интерфейса, который должен быть реализован в подклассе или реализующем классе. Применение данной аннотации позволяет получить бин из контейнера Spring на основе имени или типа.


Пример использования @Lookup-аннотации:

  1. Определите абстрактный класс или интерфейс с помощью метода-плейсхолдера @Lookup:
1
2
3
4
public abstract class AbstractLookupBean {
    @Lookup
    public abstract DependencyBean getDependencyBean();
}


  1. Реализуйте этот абстрактный класс или интерфейс:
1
2
3
4
5
6
7
8
@Component
public class ConcreteLookupBean extends AbstractLookupBean {
    @Override
    @Lookup
    public DependencyBean getDependencyBean() {
        return null;
    }
}


  1. Определите класс зависимости:
1
2
3
4
5
6
@Component
public class DependencyBean {
    public void doSomething() {
        System.out.println("Doing something...");
    }
}


  1. Настройте Spring-контекст для автоматического сканирования и регистрации бинов:
1
2
3
4
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}


  1. Используйте бин в приложении:
1
2
3
4
5
6
7
8
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        AbstractLookupBean lookupBean = context.getBean(ConcreteLookupBean.class);
        DependencyBean dependencyBean = lookupBean.getDependencyBean();
        dependencyBean.doSomething();
    }
}


В результате выполнения программы должно быть выведено "Doing something...".

Пользователь

от violette_robel , 2 месяца назад

@linnea 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public abstract class AbstractLookupBean {
    @Lookup
    public abstract DependencyBean getDependencyBean();
}

@Component
public class ConcreteLookupBean extends AbstractLookupBean {
    @Override
    @Lookup
    public DependencyBean getDependencyBean() {
        return null;
    }
}

@Component
public class DependencyBean {
    public void doSomething() {
        System.out.println("Doing something...");
    }
}

@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        AbstractLookupBean lookupBean = context.getBean(ConcreteLookupBean.class);
        DependencyBean dependencyBean = lookupBean.getDependencyBean();
        dependencyBean.doSomething();
    }
}