Spring的bean的存储和管理机制

      在tomcat容器加载时会将所有单例的bean实例化并且加入到HashMap中。在之后需要单例bean之时直接从hashmap中取。如果hashmap中没有则从spring容器中实例化并且将其放入haspmap,而非单例bean是不会被放入hashmap中只会从spring容器中加载。以下是模拟这种机制的代码

定义beanDefinition

 1 public class beanDefinition {
 2
 3     private String id;
 4
 5     private String className;
 6
 7
 8     public beanDefinition(String id, String className) {
 9         this.id = id;
10         this.className = className;
11
12     }
13
14      public String getId() {
15         return id;
16     }
17
18     public void setId(String id) {
19
20         this.id = id;
21
22     }
23
24
25     public String getClassName() {
26
27         return className;
28
29     }
30
31
32
33     public void setClassName(String className) {
34
35         this.className = className;
36
37     }
38
39
40
41 }
42   

自定义IoC容器WxyClassPathXMLApplicationContext ,该容器实现三个功能:


(1) BeanDefinition的resource定位:readXML();


(2) BeanDefinition的载入和解析 :readXML();


(3) BeanDefinition在IoC容器中的注册 instanceBeans();


import java.net.URL;  

import java.util.ArrayList;  

import java.util.HashMap;  

import java.util.List;  

import java.util.Map;  

import org.dom4j.Document;  

import org.dom4j.Element;  

import org.dom4j.XPath;  

import org.dom4j.io.SAXReader;  

import com.wxy.bean.BeanDefinition;  

public class ClassPathXMLApplicationContext {  

    //存放BeanDefinition的列表,在beans.xml中定义的bean不止一个  

    private final List<BeanDefinition> beanDefinitions = new ArrayList<BeanDefinition>();  

    //将类名作为索引,将创建的Bean对象存入到Map中  

    private final Map<String, Object>  sigletons       = new HashMap<String, Object>();  

    public ClassPathXMLApplicationContext(String fileName) {  

        //读取xml配置文件  

        this.readXML(fileName);  

        //实例化bean  

        this.instanceBeans();  

    }  

    /** 

     * 读取XML配置文件,获取BeanDefinition内容,存入到beanDefinition列表中 

     * @param fileName xml配置文件名称 

     */  

    private void readXML(String fileName) {  

        SAXReader saxReader = new SAXReader();  

        Document document = null;  

        try {  

            //通过类加载器获取Resource资源路径,实现BeanDefinition的resource定位  

            URL xmlPath = this.getClass().getClassLoader().getResource(fileName);  

            //将xml读入到document中  

            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");  

            //设置命名空间  

            xsub.setNamespaceURIs(nsMap);  

            //获取文档下的所有Bean节点  

            List<Element> beans = xsub.selectNodes(document);  

            for (Element element : beans) {  

                //获取id属性值  

                String id = element.attributeValue("id");  

                //获取class属性值  

                String clazz = element.attributeValue("class");  

                BeanDefinition beanDefinition = new BeanDefinition(id, clazz);  

                //将新创建的BeanDefinition赌侠ing放入到BeanDeifnitions中  

                beanDefinitions.add(beanDefinition);  

            }  

        } catch (Exception e) {  

            System.out.println(e.toString());  

        }  

    }  

    /** 

     * 实例化bean,存入到sigletons中 

     */  

    private void instanceBeans() {  

        for (BeanDefinition beanDefinition : beanDefinitions) {  

            try {  

                if (beanDefinition.getClassName() != null  

                    && !(beanDefinition.getClassName().isEmpty())) {  

                    //利用java反射机制,生成BeanDefinition实例,并将其注册到sigletons中  

                    sigletons.put(beanDefinition.getId(), Class.forName(  

                        beanDefinition.getClassName()).newInstance());  

                }  

            } catch (Exception e) {  

                e.printStackTrace();  

            }  

        }  

    }  

    /** 

     * 根据ID名获取实例bean 

     * return 返回一个Object对象,用户使用时,需要对获取的结果进行转换类型 

     */  

    public Object getBean(String beanName) {  

        return this.sigletons.get(beanName);  

    }  

}  
 1 public class Test {
 2
 3
 4
 5     public static void main(String[] args) {
 6
 7         //IOC容器实例化
 8
 9        ClassPathXMLApplicationContext ctx = new WxyClassPathXMLApplicationContext("beans.xml");
10
11         //获取业务bean
12
13         PeopleServiceBean peopleService = (PeopleServiceBean) ctx.getBean("peopleService");
14
15         peopleService.save();
16
17     }
18
19
20
21 }  
时间: 2024-08-24 15:44:40

Spring的bean的存储和管理机制的相关文章

Spring 框架基础(05):事务管理机制,和实现方式

本文源码:GitHub·点这里 || GitEE·点这里 一.Spring事务管理 1.基础描述 Spring事务管理的本质就是封装了数据库对事务支持的操作,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交和回滚. Connection conn = DriverManager.getConnection(); try { // 自动提交设置为false conn.setAutoCommit(false); // 执行增删改查操作 // 当操作成功后

Spring中 bean定义的parent属性机制的实现分析

在XML中配置bean元素的时候,我们常常要用到parent属性,这个用起来很方便就可以让一个bean获得parent的所有属性 在spring中,这种机制是如何实现的?     对于这种情况 transactionProxy01的parent属性是transactionProxy1 此时我们要获取transactionProxy01的实例 spring应该如何处理呢? <bean id="transactionProxy01" parent="transactionP

Spring事务隔离级别与传播机制,spring+mybatis+atomikos实现分布式事务管理

本文转载于本人另一博客[http://blog.csdn.net/liaohaojian/article/details/68488150] 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做: 一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是应该处于正确

Google Earth数据存储、管理、表现及开发机制

一.    Google Earth(Map)介绍 1.1    Google Earth介绍 在众多的地理信息服务提供商中,Google是较早提供服务的一个,其他有如ESRI这样的巨头,也有中国的灵图.但凭借着提供优质.高效.高性价比服务的理念和Google自身的巨大影响力,Google推出的Google Earth和Google Map平台已经成为全球影响力最大的互联网空间信息服务平台. Google Earth具有十分突出的三个特点[1],一是可以显示矢量数据地标,包括点.线.面等几何类型

Spring的Bean管理(注解管理)

Spring注解的IOC入门步骤: 步骤一:下载spring的开发包 http://repo.spring.io/webapp/search/artifact/?0&q=spring-framework 解压:(Spring目录结构:) * docs:API和开发规范. * libs:jar包和源码. * schema:约束. 步骤二:创建Web项目,引入spring开发jar包 核心jar包四个:bean/Core/Context/Expression Language 两个开发包 : log

spring容器对bean生命周期的管理三中方式

spring容器对bean的生命周期管理主要在两个时间点:bean的初始化完成(包括属性值被完全注入),bean的销毁(程序结束,或者引用结束)方式一:使用springXML配置中的init-method="init" destroy-method="destory" 这个两个配置,可以实现两个时间点插入定制的操作.方式二: 使用spring提供的2个接口:InitializingBean,DisposableBean方式三:使用java注解:@PostConstr

Spring中的事物管理,基于spring的bean的配置

很多东西与上边的相同,这儿只简介: 导包... 数据库中建立三个表... 建立存放连接数据库的file文件:jdbc.properties: ----------------------------------------------------------------- com.atguigu.spring.tx.xml包下建立, 接口:BookShopDao 类:BookShopDaoImpl 继承于接口,BookShopDao 异常处理类:BookStockException 测试类:JU

Spring Transaction + MyBatis SqlSession事务管理机制研究学习

线上的系统中,使用的是Spring+Mybatis+Mysql搭建的框架,由于客户需要,最近一直在对性能提升部分进行考虑,主要是涉及Mysql的一些重要参数的配置学习,以及Spring事务管理机制的学习,因为通过观察服务器日志,发现在这两部分的时候耗时比较严重,特别是进行mysql事务提交的时候,项目源码中使用了Spring的声明式事务,即通过@Transactional注解来控制事务的开启与提交,这两天看了一些关于Spring Transaction事务的一些文章,也debug了源码,总算有点

spring的bean管理(注解方式)

1.Spring的Bean管理的中常用的注解 @Component:组件.(作用在类上) public interface UserDao {     public void sayHello(); }   @Component(value="userDao")     public class UserDaoImpl implements UserDao {   @Override public void sayHello() {     System.out.println(&qu