Spring AOP framework основан на «прокси» и здесь очень хорошо объясняется: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/aop. html # aop-understanding-aop-proxies
Когда Spring создает компонент, который настроен на аспект (например, «ABC» в вашем примере), он фактически создает объект «прокси», который действует как настоящий боб. Прокси просто делегирует вызовы «реальному» объекту, но, создав это косвенное действие, прокси получает возможность реализовать «совет». Например, ваш совет может регистрировать сообщение для каждого вызова метода. В этой схеме, если метод в реальном объекте («метод1») вызывает другие методы в одном и том же объекте (скажем, метод2), эти вызовы происходят без прокси на картинке, поэтому нет никаких шансов для реализации каких-либо советов.
В вашем примере, когда вызывается метод1 (), прокси получит возможность делать то, что он должен делать, но если метод1 () вызывает метод2 (), на картинке нет никакого аспекта , Как бы то ни было, если метод2 вызывается из какого-либо другого компонента, прокси сможет выполнить совет.
Надеюсь, это поможет.
Спасибо, Рагу
Символ позволяет Вам использовать зарезервированное слово. Например:
int @class = 15;
вышеупомянутые работы, когда ниже не был бы:
int class = 15;
Символ служит 2 целям в C#:
Во-первых, это позволяет Вам использовать зарезервированное слово в качестве переменной как это:
int @int = 15;
вторая опция позволяет Вам указать строку, не имея необходимость выходить из любых символов. Например, '\' символ является символом ESC так обычно, необходимо было бы сделать это:
var myString = "c:\\myfolder\\myfile.txt"
альтернативно можно сделать это:
var myString = @"c:\myFolder\myfile.txt"
Это позволяет Вам использовать ключевое слово C# в качестве переменной. Например:
class MyClass
{
public string name { get; set; }
public string @class { get; set; }
}
Важный момент, который забыли другие ответы, то, что "@keyword" компилируется в "ключевое слово" в CIL.
Поэтому, если у Вас есть платформа, которая была сделана в, скажем, F#, который требует, чтобы Вы определили класс со свойством, названным "классом", можно на самом деле сделать это.
Это не , что полезный на практике, но не наличие это предотвратило бы C# от некоторых форм языка interop.
я обычно вижу, что это использовало не для interop, но избегать ограничений ключевого слова (обычно на именах локальной переменной, где это только эффект), т.е.
private void Foo(){
int @this = 2;
}
, но я сильно препятствовал бы этому! Просто найдите другое имя, даже если 'лучшее' название переменной является одним из зарезервированных имен.