Spring、编码剖析Spring管理Bean的原理
引入dom4j jar包
1、新建Person接口和PersonBean
public interface PersonIService {
public void helloSpring();
}
public class PersonServiceImpl implements PersonIService {
@Override
public void helloSpring() {
System.out.println("Hello Spring!");
}
}
2、在beans.xml中注入PersonBean
<bean id="personIService" class="cn.server.impl.PersonServiceImpl" />
3、新建BeanDefinition 用于存放从beans.xml中获取的beans
public class BeanDefinition {
private String id;
private String className;
public BeanDefinition(){
}
public BeanDefinition(String id, String className) {
this.id = id;
this.className = className;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
5、新建 OhterClassPathXMLApplicationContext 用于解析beans.xml
public class OhterClassPathXMLApplicationContext {
private List<BeanDefinition> list=new ArrayList<BeanDefinition>();
private Map<String,Object> beans=new HashMap<String, Object>();
public OhterClassPathXMLApplicationContext(String fileName){
this.readXML(fileName);
this.instanceBeans();
}
private void instanceBeans(){
for(BeanDefinition bean : list){
try {
// 创建Bean实例,并放到Map中
if(bean.getClassName()!=null && !bean.getClassName().trim().equals("")){
beans.put(bean.getId(), Class.forName(bean.getClassName()).newInstance());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void readXML(String fileName){
SAXReader saxReader = new SAXReader();
Document doc=null;
try{
// JAVA里面对于类进行调用配置资源的文件数据,以this.getClass().getResourceAsStream()来读取比较合适。
// 路径采用相对路径直接可以从工程的path路径去找。
URL xmlpath=this.getClass().getClassLoader().getResource(fileName);
doc=saxReader.read(xmlpath);
Map<String,String> nsMap=new HashMap<String,String>();
nsMap.put("ns", "http://www.springframework.org/schema/beans"); // 加入命名空间
XPath xsub=doc.createXPath("//ns:beans/ns:bean"); // 创建 beans/bean的查询路径
xsub.setNamespaceURIs(nsMap); // 设置命名空间
List beans=xsub.selectNodes(doc); // 获取文档下的所有bean节点
for(Object node : beans){
Element element=(Element)node;
String id=element.attributeValue("id");
String className=element.attributeValue("class");
BeanDefinition bean=new BeanDefinition(id,className);
list.add(bean);
}
}catch(Exception e){
e.printStackTrace();
}
}
// 通过Id名称,获取Bean
public Object getBean(String name){
return beans.get(name);
}
}
6、测试代码
@Test
public void test2() {
OhterClassPathXMLApplicationContext otherContext=new OhterClassPathXMLApplicationContext("beans.xml");
PersonIService personIService=(PersonIService)otherContext.getBean("personIService");
personIService.helloSpring();
}
Spring、编码剖析Spring管理Bean的原理的更多相关文章
- (转)编码剖析Spring管理Bean的原理
http://blog.csdn.net/yerenyuan_pku/article/details/52832434 在Spring的第一个案例中,我们已经知道了怎么将bean交给Spring容器进 ...
- (转)编码剖析Spring依赖注入的原理
http://blog.csdn.net/yerenyuan_pku/article/details/52834561 Spring的依赖注入 前面我们就已经讲过所谓依赖注入就是指:在运行期,由外部容 ...
- Spring、Spring依赖注入与编码剖析Spring依赖注入的原理
Spring依赖注入 新建PersonIDao 和PersonDao底实现Save方法: public interface PersonIDao { public void save(); } pub ...
- (转)编码剖析Spring装配基本属性的原理
http://blog.csdn.net/yerenyuan_pku/article/details/52856465 上回我们已经讲到了Spring依赖注入的第一种方式,现在我们来详解第二种方式,须 ...
- (转)编码剖析@Resource注解的实现原理
http://blog.csdn.net/yerenyuan_pku/article/details/52860046 上文我们已经学会使用@Resource注解注入属性.学是学会了,但也仅限于会使用 ...
- Spring(八)编码剖析@Resource注解的实现原理
配置文件beans2.xml <?xml version="1.0" encoding="UTF-8"? > <beans xmlns=&qu ...
- 【Sping管理bean的原理】
spring容器默认情况下,当服务启动时,解析配置文件,实例化文件中的所有类. 我们直接使用spring时,获取spring注入的bean是这样的, ApplicationContext ctx = ...
- Spring第三弹—–编码剖析Spring管理Bean的原理
先附一下编写的Spring容器的执行结果: 代码如下: 模拟的Spring容器类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
- 编码剖析Spring管理bean的原理
project目录 MyClassPathXMLApplicationContext读取xml,以及实例化bean. 因为是一开始实例化配置文件所有bean,所以需要构造器完成这些工作. packag ...
随机推荐
- Nginx 配置指令的执行顺序(六)
前面我们在 (五) 中提到,在一个 location 中使用 content 阶段指令时,通常情况下就是对应的 Nginx 模块注册该 location 中的“内容处理程序”.那么当一个 locati ...
- QTDesigner的QVBoxLayout自动随窗口拉伸
在MainWindow的构造函数中添加如下代码://设置Uiui.setupUi(this); //使Ui可自适应父窗口大小QVBoxLayout* mainLayout = new QVBoxLay ...
- 15 Tricks to Appear Smart in Emails(转)
英文原文:15 Tricks to Appear Smart in Emails 如果你不关心在邮件中表现聪明,就不要看本文了. 好吧,我们是孤独的. 在公司环境里,与电子通讯的肥沃土壤相比,没有什么 ...
- 如何把Python2的代码转换为Python3的代码
如何把Python2的代码转换为Python3的代码 注: 如果对于python2和python3不熟悉的,可以参考: [整理]总结Python2(Python 2.x版本)和Python3(Pyth ...
- Table XXX is marked as crashed and should be repaired问题
数据表出错了,查询数据获取不到了. 尝试一 重启mysql service mysqld restart 没用,重启并没有把表修复掉 尝试二 check table vicidial_list;rep ...
- 让C/C++程序一次编译可以发布到多版本Linux之上
最近页游开放平台比较多, 每个平台要求的Linux版本各不相同, 这给开发人员部署服务器带来了很大的困难. 在本机Linux编译的程序,发布时即便将依赖的so附带到目标Linux环境,仍然会碰到依赖及 ...
- oracle error info
1,oracle jdbc HTTP Status 500 - Incorrect result size: expected 1, actual 0 2015-03-31 00:03:58,250 ...
- ios中block中的探究
http://blog.csdn.net/jasonblog/article/details/7756763
- Number Sequence(kmp)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- 设计师Yoyo:为用户设计产品,让他们生活更美好
Yoyo设计走过的路:纽约爱立信,西雅图美国在线,硅谷雅虎,ATT,深圳腾讯,华为:Yoyo不仅是顶级的交互体验设计师,还是很Open的知识分享者,从职业选择,以及对年轻人的建议几个角度,摘录他的文章 ...