@EnableAspectJAutoProxy деактивирует мое определение бина - PullRequest
0 голосов
/ 01 марта 2019

Я устанавливаю новое приложение Spring (не весеннюю загрузку) в IDEA и загружаю вручную aspectjweaver, пишу следующий код на практике.

Корневой класс конфигурации:

@Configuration
/*@EnableAspectJAutoProxy*/
@ComponentScan
public class Main {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext();
        ctx.register(Main.class);
        ctx.refresh();
        Performance performance=ctx.getBean(WoodStock.class);
        //System.out.println(ctx.getBean(Audience.class));
        performance.performance();
     }
}

и компоновка проекта:

+com.dawn.www
  -Main.java
  +aspect
    -Audience.java
  +music
    -Performance.java
    -WoodStock.java

Я хочу, чтобы Audience был аспектом WoodStock (увидим это весной в действии)

@Aspect
@Component
public class Audience {
    @Before("execution(* com.dawn.www.music.Performance.performance(..))")
    public void silenceCellPhones(){
        System.out.println("-----------Silencing cell phones");
    }
}

Performanceпростой интерфейс, который реализует WoodStock

public interface Performance {
    void performance();
}

@Component
public class WoodStock implements Performance{
    @Override
    public void performance() {
        System.out.println("WoodStock Performance start,singer singing+++++");
    }
}

@ComponentScan должен найти бин WoodStock, который определен в контексте приложения, однако, когда я его запускаю:

   No qualifying bean of type 'com.dawn.www.music.WoodStock' available  

но когда я закомментирую @EnableAspectJAutoProxy, WoodStock можно получить из контекста приложения?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019
  1. Когда вы используете @EnableAspecjAutoProxy, Spring автоматически создаст прокси для всех соответствующих bean-компонентов (т. Е. WoodStock через аспект Audience).
  2. Теперь, поскольку вы не использовали 'proxyTargetClass = true'в @EnableAspectJAutoProxy он будет использовать прокси-сервер JDK вместо CGLIB.
  3. JDK-прокси основан на интерфейсе, следовательно, ваш прокси имеет тип «Производительность».
  4. Вот причина, по которой вы получаете 'Недоступный квалифицированный компонент типа com.dawn.www.music.WoodStock при попытке найти компонент с использованием типа WoodStock
  5. Теперь, после комментирования @EnableAspectJAutoProxy, WoodStock становится простым компонентом и доступен черезctx.getBean (..)
  6. с 'proxyTargetClass = true', прокси CGLIB включен и создает прокси типа WoodStock

Предложения

Использовать proxyTargetClass = true с ctx.getBean (WoodStock.class)

или

Использовать proxyTargetClass = false с ctx.getBean (Performance.class)

0 голосов
/ 01 марта 2019

Performance performance=ctx.getBean(Performance.class); Spring Aop поддерживает прокси только на уровне интерфейса, когда не используется CGLIB, поэтому не используйте класс, используйте интерфейс.

...