Spring容器内部的实现机制
2012-10-24 20:58
260 查看
class BeanDefinition 中保存着bean的id和class
class ClassPathXMLApplicationContext 模仿了ApplicationContext 的功能 先读取文件,将文件中的bean保存在List集合中 实例化时,将bean拿到Map中,根据传进来的beanName 来使用那个bean
//用来存放bean的信息
private List<BeanDefinition> BeanDefines = new ArrayList<BeanDefinition>();
//保存bean
private Map<String ,Object > sigletons =new HashMap<String, Object>();
public ClassPathXMLApplicationContext(String fileName){
this.readXML(fileName);
this.instanceBeans();
}
//完成bean的实例化
private void instanceBeans() {
for(BeanDefinition beanDefinition:BeanDefines){
try {
if(beanDefinition.getClassName()!=null && !"".equals(beanDefinition.getClassName().trim()))
sigletons.put(beanDefinition.getId(),Class.forName(beanDefinition.getClassName()).newInstance());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//读取application.xml 文件
private void readXML(String fileName) {
SAXReader saxReader = new SAXReader();
Document document =null;
try{
URL xmlPath=this.getClass().getClassLoader().getResource(fileName);
//System.out.println(xmlPath);file:/G:/workspaces1/spring/bin/beans.xml
document =saxReader.read(xmlPath);
Map<String,String> nsMap=new HashMap<String, String>();
//加入命名空间
nsMap.put("ns","http://www.springframework.org/schema/beans");
//创建beans/bean的查询路径
XPath xsub = document.createXPath("//ns:beans/ns:bean");
//System.out.println(xsub);[XPath: /descendant-or-self::node()/child::ns:beans/child::ns:bean]
//设置命名空间
xsub.setNamespaceURIs(nsMap);
//获取文档下的所有的bean节点
List<Element> beans = xsub.selectNodes(document);
for (Element element : beans) {
String id =element.attributeValue("id");//获取id属性值
String clazz = element.attributeValue("class");//获取class属性值
BeanDefinition beanDefine =new BeanDefinition(id, clazz);
BeanDefines.add(beanDefine);
}
}catch(Exception e){
e.printStackTrace();
}
}
//获取bean实例
public Object getBean(String beanName){
return this.sigletons.get(beanName);
}
class ClassPathXMLApplicationContext 模仿了ApplicationContext 的功能 先读取文件,将文件中的bean保存在List集合中 实例化时,将bean拿到Map中,根据传进来的beanName 来使用那个bean
//用来存放bean的信息
private List<BeanDefinition> BeanDefines = new ArrayList<BeanDefinition>();
//保存bean
private Map<String ,Object > sigletons =new HashMap<String, Object>();
public ClassPathXMLApplicationContext(String fileName){
this.readXML(fileName);
this.instanceBeans();
}
//完成bean的实例化
private void instanceBeans() {
for(BeanDefinition beanDefinition:BeanDefines){
try {
if(beanDefinition.getClassName()!=null && !"".equals(beanDefinition.getClassName().trim()))
sigletons.put(beanDefinition.getId(),Class.forName(beanDefinition.getClassName()).newInstance());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//读取application.xml 文件
private void readXML(String fileName) {
SAXReader saxReader = new SAXReader();
Document document =null;
try{
URL xmlPath=this.getClass().getClassLoader().getResource(fileName);
//System.out.println(xmlPath);file:/G:/workspaces1/spring/bin/beans.xml
document =saxReader.read(xmlPath);
Map<String,String> nsMap=new HashMap<String, String>();
//加入命名空间
nsMap.put("ns","http://www.springframework.org/schema/beans");
//创建beans/bean的查询路径
XPath xsub = document.createXPath("//ns:beans/ns:bean");
//System.out.println(xsub);[XPath: /descendant-or-self::node()/child::ns:beans/child::ns:bean]
//设置命名空间
xsub.setNamespaceURIs(nsMap);
//获取文档下的所有的bean节点
List<Element> beans = xsub.selectNodes(document);
for (Element element : beans) {
String id =element.attributeValue("id");//获取id属性值
String clazz = element.attributeValue("class");//获取class属性值
BeanDefinition beanDefine =new BeanDefinition(id, clazz);
BeanDefines.add(beanDefine);
}
}catch(Exception e){
e.printStackTrace();
}
}
//获取bean实例
public Object getBean(String beanName){
return this.sigletons.get(beanName);
}
相关文章推荐
- (spring-第5回【IoC基础篇】)spring容器从加载配置文件到实例化bean的内部工作机制
- jsp/servlet/struts/hibernate/spring内部实现机制
- jsp/servlet/struts/hibernate/spring内部实现机制
- Spring AOP实现机制(二)--ProxyFactoryBean---将Spring AOP和Spring IoC容器相结合
- jsp/servlet/struts/hibernate/spring内部实现机制
- jsp/servlet/struts/hib 4000 ernate/spring内部实现机制
- jsp/servlet/struts/hibernate/spring内部实现机制
- jsp/servlet/struts/hibernate/spring内部实现机制
- jsp/servlet/struts/hibernate/spring内部实现机制
- (spring-第5回【IoC基础篇】)spring容器从加载配置文件到实例化bean的内部工作机制
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- lamp内部底层的实现和结合机制
- 采用Spring实现在容器启动时把用ConcurrentHashMap实现的并发缓存加载到ServletContext中
- Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
- spring架构解析(一)--IoC容器实现
- 在不启动容器下,如何启动spring的机制
- AAAMybatis使用MapperScannerConfigurer实现自动注册dao到spring容器
- flex4 + spring + blazeds , 使用anonation(注解)机制,利用push技术的实现例子和过程。
- spring容器内建的profile功能实现开发环境、测试环境、生产环境配置自动切换
- HashMap的内部实现机制,Hash是怎样实现的,什么时候ReHash