spring 随笔(一) bean & Dependency Injection(一)

2014-11-24 02:25:22 · 作者: · 浏览: 3

1,一切都是Bean

Bean是Spring应用程序中(其实是Spring容器中)的基本元素,在Spring框架上运行的应用程序,就是由一个又一个的Bean组合在一起、像搭积木一样堆出来的。所有的Bean都由Spring的核心容器负责管理、创建、销毁,同时Bean之间的相互依赖也由Spring容器中的依赖注入功能自动管理。

1.1bean的作用域

lsingleton:定义bean的范围为每个Spring容器一个实例(默认值) lprototype:定义bean可以被多次实例化(使用一次就创建一次) lrequest:定义bean的范围是HTTP请求,只有再使用有web能力的spring上下文时有效。 lsession:定义bean的范围是HTTP会话,只有再使用有web能力的spring上下文时有效。 lglobal-session:定义bean的范围是全局HTTP会话,只有再portlet上下文中有效。

1.2 三种实例化bean的方式

    使用构造器实例化(默认无参数)

      使用静态工厂方法实例化(简单工厂模式)

      public class PersonFactory {
      	public static Person getPersonInstance(){
      		return new Person();
      	} 
      }
      
        使用实例工厂方法实例化(工厂方法模式)

        public class PersonFactory{
        	public  Person createtPersonInstance(){
        		return new Person();
        	}
        }
        


        1.3 指定Bean的初始化方法和销毁方法

        spring初始化bean或销毁bean时有时候需要执行一些处理工作,因此spring可以在创建或者销毁bean时可以调用bean的两个生命周期方法

        init-method="init"
        destroy-method="distory" scope="singleton" />

        (注意的是只有scope=singleton的bean,destroy-method才有效)

        1.4 bean 的生命周期

        \

        实例化bean 设置属性值 设置bean名称(如果bean实现了BeanNameAware接口) 设置beanFactory(如果bean实现了BeanFactoryAware接口) 设置ApplicationContext(如果bean实现了ApplicationContextAware接口) 前预处理(如果上下文中存在多个BeanPostProcessor,将调用其postProcessBeforeInitialization()方法) 初始化Bean(如果bean实现了InitializingBean,将调用其afterPropertiesSet方法,如果bean声明了自定义初始化方法,调用) 后预处理(如果上下文中存在多个BeanPostProcessors,将调用其postProcessAfterInitialization()方法) Bean创建完成,待用 销毁Bean(如果bean实现了DisposableBean,调用其destroy()方法) 销毁Bean(如果bean声明了自定义的销毁方法,调用)
        1.5 bean的继承
        在spring的继承中不论在java类的实际情况中是否存在真正的extends继承关系,只要其存在引用相同的属性值,在spring的bean管理都可以将其抽象为继承关系。在spring的xml配置中可将引用相同属性的属性property抽出一个父类bean。该bean需要设计其abstract属性为true。其他“继承”该bean的bean需要制定其parent属性值为该抽象父类的id。如下在studentDao和teacherDao中都存在属性sf(SessionFactory),则可以抽出一个父类。
              
        
              
        	
               
        
              
        
        
              
        
              

2,依赖注入(Dependency Injection)

所谓的依赖注入就是在于行期间,由外部容器动态的将依赖对象注入到组件中。通俗的讲也就是不在程序中显示的调用该类的setter()方法去设置该类的属性。而是由spring容器处理经过程序员配置的xml来设置该类的属性值。

所谓的控制反转(Inversion of Control)就是指应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转,目的是为了获得更好的扩展性和良好的可维护性。

通常的依赖注入有手工装配(配置xml)和自动装配(基于注解)的两种方式方式:

2.1通过setter方法注入依赖

    元素的 子元素指明了使用该bean的setter方法来注入

    1.可以使用property的value属性来进行简单类型的注入

         
        	
          
        	
          
    
         

    2.使用ref引用其他的bean

         
    
         
    	
          
    	
          
    
         

    3.内部bean

         
    	
          
    	
           
             
          
         

    使用该方式的缺点就是无法在其他地方使用这个类,该类只能为外部的bean使用。

    4.装配集合

    	
         
    	
         
    		
           
           
            list1
            
            
          
    	
         
    	
         
    	
         
    		
           
           
            obj1
            
            
          
    	
         
    	
         
    	
         
    		
           
           
            set1
            
           
            set2
            
            
          
    	
         
    	
         
    	
         
    		
           
            
            
            
           
    	
         
    	
         
    		
           
           
            prop1
            
           
            prop2
            
          
    	
         
    	
         
    	
         
    		
          
            01=prop1 02=prop2 
          
    	
         

    5.设空值null

         
     
         
         
          
     
         
    


    6,自定义String2Object类型转换器来设置属性

    在该属性类的同一包下面创建类 名称 PropertyClassNameEditor,并继承PropertyEditorSupport类,复写其setAsText(String text)方法即可。

    例如给Family类的Person类属性创建一个String2Person类的类型转换器。

    public class PersonEditor extends PropertyEditorSupport {
    	@Override
    	public void setAsText(String text) throws IllegalArgumentException {
    		if(text!=null){
    			String[] props = text.split("-");
    			if(props!=null && props.length == 3){
    				Person p = new Person();
    				p.setId(Long.parseLong(props[0]));
    				p.setName(props[1]);
    				p.setMail(props[2]);
    				this.setValue(p);
    			}
    		}
    	}
    }
    

    Family类:

    public class Family {
    	private Person master;
    	public void setMaster(Person master) {