Spring的 Bean 封装机制

Spring从核心而言就是一个DI(依赖注入)容器,其核心的核心就是Bean的封装机制:BeanWrapper(Bean的封装包)和Bean Factory(Bean工厂)
1. Bean Wrapper
  Bean Wrapper及Bean Factory的底层是通过java.lang.reflect机制来实现的
  Class  cla = Class.forName("com.tianye.Student");
  Object obj = (Object)cla.newInstance();
  Method method = cla.getMethod("setName",new Class[]{String.class});
  method.invoke(obj,new Object[]{"TianYe"});

利用Bean Wrapper来操作一个Bean实例:
  public static void TestBeanWrapper(){
   
    try{
       Object obj = Class.forName("com.tianye.Student").newInstance();
       BeanWrapper bw = new BeanWrapperImpl(obj);
       bw.setPropertyValue("name","TianYe");
       System.out.println(bw.getPropertyValue("name"));
      }catch(Exception e){
       e.printStackTrace();
    }
   }
BeanWrapper 需要逐个的对属性设置值,操作起来比较繁琐,而且只是针对单个Bean进行的操作,BeanWrapper不是很常用,在此基础上出现了BeanFactory
2. BeanFactory
  BeanFactory对Bean的操作是通过配置文件来完成的,BeanFactory在配置文件中可以配置的项目:
   (1) Bean属性值及依赖关系
    (2) Bean的创建模式(是否为singleton)
   (3) Bean的初始化及销毁方法
   (4) Bean的依赖关系
<bean>标签中的属性及用法
id: 是Bean在BeanFactory中的一个唯一的标识,在代码中以此作为索引名称来获取Bean实例的
    class:类名(类的路径---包名.类名)
    singleton: singleton="false"的时候表示该类不是单例Bean是多利Bean,多线程访问的时候,会获取到多个不同的Bean实例  singleton="true"的时候表示该类是单例Bean,多线程访问的时候只可以获取到一个Bean实例
   lazy-init:为"true"的时候表示在spring容器启动的时候不用加载该Bean,只要第一次获取Bean实例的时候才加载该Bean, 为"false"的时候则是在spring容器启动的时候就被加载,利用该属性可以优化spring容器的启动速度
    该属性只针对于单例Bean起作用,当singleton="false"的时候系统抛出异常
   init-method:初始化方法,在BeanFactory创建Bean实例后执行该方法
   destroy-method:销毁方法,在Bean销毁的时候调用,一般用于资源释放

   <property>标签中的属性及用法
   <value>节点:用于指定一个属性的值,BeanFactory会自动进行类型匹配
   <ref>节点:指定了属性对BeanFactory中其他Bean的引用关系(即一个Bean中的属性或方法中的参数是另一个Bean的对象或是Interface对象),由接口的实现类来完成注入
   <null>节点:当Bean中的属性值要设为 null 的时候,就需要使用到<null/>子节点
利用BeanFactory来获取Bean实例:
   InputStream is = new FilleInputStream("bean.xml");
   XmlBeanFactory xbf = new XmlBeanFactory(is);
   IHello ihello = (IHello)xbf.getBean("hello");
BeanFactory实现了对多个Bean的管理


   

你可能感兴趣的:(spring,多线程,bean,项目管理,配置管理)