我们通常使用setter属性来进行依赖注入,如:
public class A
{
#region B
private B b;
public B B
{
get { return b; }
set { b = value; }
}
#endregion
}
public class B
{
}
针对上述的定义,在Spring.net中配置A类型的对象,并注入B类型对象的依赖,是可以完全正常工作的。{
#region B
private B b;
public B B
{
get { return b; }
set { b = value; }
}
#endregion
}
public class B
{
}
但是,假设,我希望A类型的B属性只能给A的派生类访问,我们通常会为B属性的getter加上Protected限定符,就像这样:
public class A
{
#region B
private B b;
public B B
{
protected get { return b; }
set { b = value; }
}
#endregion
}
public class B
{
}
在这种定义下,如果仍然采用一样的spring配置,则会抛出"未将对象引用设置到对象实例"的异常 -- 非常常见的一个异常。{
#region B
private B b;
public B B
{
protected get { return b; }
set { b = value; }
}
#endregion
}
public class B
{
}
当我依照这个异常提示在数以千计的组件构成的应用程序中去查找可能的bug时,那是怎样的一种痛苦--实际上我的代码和配置都没有问题,是spring.net开了一个玩笑 -- 为了搞清楚这个玩笑,我花了将近2个小时。所以,我不希望朋友你在以后会因为同样的问题而再次浪费我们宝贵的时间。