2016-05-14 5 views
3

У меня есть большое весеннее веб-приложение, которое использует аннотации. Тем не менее, есть некоторые классы, которые аннотируются с помощью @ component/service, но не отвещаются от того, где они вызываются. Вместо этого используется новый оператор.Найти все классы, которые не являются @Autowired

Я хочу найти все такие экземпляры пользовательских классов, в которых используется новый оператор.

В принципе, я создал новый класс-оболочку Http (весенний компонент), и я вызываю его из нескольких мест в приложении. Некоторое место это работает, потому что автоматическая проводка к нему работает, потому что содержащий класс и классы от начала цепи управляются весной. Но в некоторых местах это не работает, потому что один из классов в вызывающей цепочке был создан с использованием новых и не управляется весной. Поэтому я хочу исправить это и сделать такие классы также управляемыми весной.

Я говорю о 100 классах, поэтому, пожалуйста, предложите инструмент или метод, который можно сделать за 3-4 часа и предотвратит человеческие ошибки. Я использую затмение.

Пример:

@Component 
public class MyHttpClient { 

    public int execute() { 
     ... 
    } 
} 

@Component 
public class UtilC { 

    @Autowired 
    private MyHttpClient client; 

    public int methodC() { 
     // When methodC is called from A, it works 
     // but when called from B, it gives NullPointerException 
     client.execute(); 
    } 
} 

@Component 
public class UtilB { 

    private UtilC c = new UtilC(); 

    public int methodB() { 
     c.methodC(); 
    } 
} 

@Component 
public class UtilA { 

    @Autowired 
    private UtilC c; 

    public int methodA() { 
     c.methodC(); 
    } 
} 

Пожалуйста, не предполагают, что это:

@Component 
public class UtilC { 

    @Autowired 
    private MyHttpClient client; 

    public int methodC() { 
     try { 
      client.execute(); 
     } catch(NullPointerException npe) { 
      new MyHttpClient.execute(); 
     } 
    } 
} 

Как мне найти все определяемые пользователем классы, которые экземплярам как новый UtilC

+0

Они также названы как 'SomeService' таким образом, что вы можете написать для него регулярное выражение? – ChiefTwoPencils

+1

Иерархия вызовов (Ctrl-Alt-H) не может сказать вам, кто вызывает конструктор? Если объект должен управляться Spring, никто не должен вызывать конструктор, кроме Spring, и это не будет отображаться, поскольку Spring использует отражение для этого. Если у вас нет конструктора для использования иерархии вызовов, временно создайте его. – Andreas

+0

Нет, они не совсем определены, как написать для них регулярное выражение. Могу ли я искать переменные экземпляра пользовательских классов в eclipse, которые используют новый оператор? –

ответ

0

Использование Google reflection найти все классы, аннотированные с помощью @Autowired

Reflections reflections = new Reflections("org.home.xxx"); 
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(org.springframework.beans.factory.annotation.Autowired.class); 

Классы, не представленные в Set, не аннотируются.

+0

Мне нужно знать все пользовательские классы, которых нет в наборе. –

+0

Есть ли способ, чтобы я мог перечислять все пользовательские классы в моем приложении, а затем я могу сравнить с теми, которые находятся в наборе. Если они не находятся в наборе, значит, они не автоувеличиваются? –

0

Если у вас есть «большое весеннее веб-приложение, в котором используются аннотации», вы должны использовать надлежащую Java IDE. В каждой среде IDE есть функция «Найти использование» (или что-то подобное). Вы должны использовать это.

Например, с IntelliJ IDEA, вот как я бы это сделать:

  1. Расположить интерфейс Autowired (в исходном коде). Используйте «Найти использование». enter image description here
  2. Он должен показать вам обычаи (красиво классифицированные в терминах видов обычаев). enter image description here
+0

Это даст мне классы, которые будут автоуведомлены. Как это даст мне User-definedclasses, которые были созданы с использованием нового оператора –

0

Одним из способов решения этого вопроса будет использование aspectj (compile-time-weaving). например, следующие аспекты позволяет компилятору создавать ошибки для CTOR классов, которые с аннотацией @XmlRootElement использований (но во время выполнения контейнер может, конечно, назвать это рефлекторно)

import javax.xml.bind.annotation.XmlRootElement; 

public aspect CtorError { 

    declare error : call ((@XmlRootElement *).new(..)) : "ctor called"; 
} 
Смежные вопросы