Зависимость от Spring, Вводящая аннотируемый Аспект

ОШИБКА: свойство или индексатор не могут быть переданы как или касательно параметра

, Если бы Вы не определили {get; set;} тогда, то компилятор не знал бы, является ли это поле или свойство. Это - важный becasue, в то время как они "выглядят" идентичными, компилятор рассматривает их по-другому. например, Вызов "InitAnInt" на свойстве повышает ошибку.

class Test
{
    public int n;
    public int i { get; set; }
    public void InitAnInt(out int p)
    {
        p = 100;
    }
    public Test()
    {
        InitAnInt(out n); // This is OK
        InitAnInt(out i); // ERROR: A property or indexer may not be passed 
                          // as an out or ref parameter
    }
}

Вы не должны создавать общедоступные поля/Переменные на классах, Вы никогда не знаете, когда Вы захотите измениться, это для имения получает & средства доступа набора, и затем Вы не знаете то, что кодирует, Вы собираетесь повредиться, особенно если у Вас есть клиенты что программа против Вашего API.

Также у Вас могут быть различные модификаторы доступа для того, чтобы получать & набор, например, {добираются; частный набор;} делает получить общественность и набор частный к классу объявления.

5
задан skaffman 14 January 2011 в 17:03
поделиться

3 ответа

Проблема, насколько я понимаю, в том, что Spring создает для вас bean-компонент этого типа, но фреймворк AspectJ также создает экземпляр этого типа, потому что он не знает Spring сделал это.

Я считаю, что вы хотите предоставить Spring фабричный метод для использования для создания экземпляра bean-компонента, который также позволяет AspectJ знать, что Aspect создан:

<!-- An @Aspect-annotated class -->
<bean id="bar" class="com.foo.bar" factory-method="aspectOf">
    <property name="meaning" value="42" />
</bean>

Чтобы отдать должное, я столкнулся с этим вопросом ранее сегодня и затем нашел ответ в другом месте позже, так что я возвращаюсь, чтобы закрыть цикл.

Я не совсем понимаю, что здесь происходит, но я вижу, что есть класс аспектов, который предоставляет несколько статических конструкторов этого вида. Предположительно, AspectJ вплетает статические методы с тем же именем в каждый аспект, чтобы облегчить такое построение.

3
ответ дан 14 December 2019 в 01:12
поделиться

Я тоже столкнулся с такой проблемой.

Вот как это было исправлено:

@Aspect
public class MyAspect {
  @Resource // telling spring that at first look up bean by name;
  Session session; // resource that won't of being setup;

  private static class MyAspectHolder {
    static final MyAspect instance = new MyAspect();
  }

  ...

  // special purpose method w/o it - stuff doesnt work;
  public static MyAspect aspectOf() {
    return MyAspectHolder.instance;
  }
}

И, конечно, не забывайте в вашей конфигурации вместе с определением компонента аспекта.

2
ответ дан 14 December 2019 в 01:12
поделиться

Поскольку аспект создается перед контейнером Spring, необходимо извлечь аспект из аспекта заводского метода Аспекта(ExampleClass.class).

Из конфигурации Spring XML можно извлечь аспект (объект) следующим образом:

<bean id="traceAspect" class="aspects.trace.TraceAspect"
    factory-method="aspectOf" />

Фабричные методы — это обычный способ извлечения объектов, созданных вне контейнера Spring, как Enum.

4
ответ дан 14 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: