看完最后一节,总算学完了张老师的高新技术。
在最后一节里,我虽然可以凭着看完后的记忆跟感觉,将代码一点点写出来,并且能够看懂代码之间的关系,至于为什么要如此那般的做,说实话还不是很明白。尽管如此,在运行程序的时候,我还是发现了一点问题。我截了几张图,如下:
图一、配置文件的内容
图二、测试程序代码
图三、这里定义了一个Properties属性类,通过它获取配置文件中的内容
图四、修改后的配置文件
图五、再次修改后的配置文件
下面复制一段代码,功能是通过配置文件中的名字获取对象
public Object getBean(String name) //创建getBean方法,通过配置文件中的名字获取bean对象
{
Object bean = null;
String className = properties.getProperty(name); //从配置文件中读取类名,通过键获取值
try {
Class clazz = Class.forName(className);
bean = clazz.newInstance(); //由类的字节码获取对象
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (bean instanceof ProxyFactoryBean) //判断bean是特殊的bean即ProxyFactoryBean还是普通的bean
{
Object proxy = null;
//是ProxyFactoryBean的话,强转,并获取目标和通告
ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;
try {
//获取advice和target
Advice advice = (Advice)Class.forName(properties.getProperty(name + ".advice")).newInstance();
Object target = Class.forName(properties.getProperty(name + ".target")).newInstance();
//设置目标和通告
proxyFactoryBean.setAdvice(advice);
proxyFactoryBean.setTarget(target);
//通过类ProxyFactoryBean(开发中是作为接口存在)中获得proxy对象
proxy = proxyFactoryBean.getProxy();
} catch (Exception e) {
e.printStackTrace();
}
return proxy; //是ProxyFactoryBean的话,返回proxy对象
}
return bean;
}
在附件里有源代码。
现象:
如果按照图一的配置文件运行程序,输出结果: $Proxy0
如果按照图四的配置文件运行程序,输出结果: java.util.ArrayList
如果按照图五的配置文件运行程序,输出结果: $Proxy0
问题:
1、为什么按照图五的配置文件执行的结果是$Proxy0,而不是java.util.ArrayList呢?照理说通过配置文件的第一行就已经可以获取到bean对象了啊。这里的结果是$Proxy0,说明程序读完了配置文件中的所有内容,并将内容加载进了Properties集合,而刚好通过ProxyFactoryBean也可以获取到一个bean对象,就这样获得了一个代理类的对象。我想知道为什么会这样?
2、程序将配置文件中的内容加载到了Properties集合中,那么在Properties集合中就会存在有如下键值对:
xxx=java.util.ArrayList
xxx=cn.itcast.day3.aopframework.ProxyFactoryBean
这里就有个一个问题,Properties集合是属于Map集合,而在Map集合中,键的值是不能重复的。为什么在这里可以呢?还没有出错。
|
|