ОШИБКА: свойство или индексатор не могут быть переданы как или касательно параметра
, Если бы Вы не определили {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.
Также у Вас могут быть различные модификаторы доступа для того, чтобы получать & набор, например, {добираются; частный набор;} делает получить общественность и набор частный к классу объявления.
Проблема, насколько я понимаю, в том, что 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 вплетает статические методы с тем же именем в каждый аспект, чтобы облегчить такое построение.
Я тоже столкнулся с такой проблемой.
Вот как это было исправлено:
@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;
}
}
И, конечно, не забывайте
в вашей конфигурации вместе с определением компонента аспекта.
Поскольку аспект создается перед контейнером Spring, необходимо извлечь аспект из аспекта заводского метода Аспекта(ExampleClass.class).
Из конфигурации Spring XML можно извлечь аспект (объект) следующим образом:
<bean id="traceAspect" class="aspects.trace.TraceAspect"
factory-method="aspectOf" />
Фабричные методы — это обычный способ извлечения объектов, созданных вне контейнера Spring, как Enum.