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 вызывается из какого-либо другого компонента, прокси сможет выполнить совет.
Надеюсь, это поможет.
Спасибо, Рагу
public static object GetDefault(Type type)
{
if(type.IsValueType)
{
return Activator.CreateInstance(type);
}
return null;
}
В более новой версии .NET, такого как стандарт .NET, type.IsValueType
потребности, которые будут записаны как type.GetTypeInfo().IsValueType
Ничто просто еще не может найти простым и изящным, но у меня есть одна идея: Если Вы знаете тип свойства, Вы хотите установить, можно записать собственное default(T)
. Существует два случая - T
, тип значения, и T
ссылочный тип. Вы видите это путем проверки T.IsValueType
. Если T
ссылочный тип, то можно просто установить его на null
. Если T
будет тип значения, то он будет иметь конструктора без параметров по умолчанию, которого можно вызвать для получения "пустого" значения.
Я делаю ту же задачу как это.
//in MessageHeader
private void SetValuesDefault()
{
MessageHeader header = this;
Framework.ObjectPropertyHelper.SetPropertiesToDefault<MessageHeader>(this);
}
//in ObjectPropertyHelper
public static void SetPropertiesToDefault<T>(T obj)
{
Type objectType = typeof(T);
System.Reflection.PropertyInfo [] props = objectType.GetProperties();
foreach (System.Reflection.PropertyInfo property in props)
{
if (property.CanWrite)
{
string propertyName = property.Name;
Type propertyType = property.PropertyType;
object value = TypeHelper.DefaultForType(propertyType);
property.SetValue(obj, value, null);
}
}
}
//in TypeHelper
public static object DefaultForType(Type targetType)
{
return targetType.IsValueType ? Activator.CreateInstance(targetType) : null;
}