spring学习第二天


使用spring容器的好处(IOC和DI的意义)

  • 客户端在使用时不用关注具体实现,完全面向接口编程,具体实现类有些配置文件的人来管

    applicationContext context = new classPathXmlApplicationContext("applicationContext");
    
    DocumentManager documentManager = new (DocumentManager)context.getBean("documentManager");
    

spring创建对象方法

  • 构造函数(用的最多)

  • 静态工厂

  • 实例工厂


  • 在默认情况下,spring产生的对象是单例的

  • prototype 原型模式(多例模式)

  • 如果scope = "prototype" 那么lazy-init将失去作用


spring容器创建对象的时间

方案1

1 加载spring容器
2 spring调用默认的构造函数为bean创建对象
3 利用context.getbean()将对象提取出来
4 好处:在启动spring容器的时候可以发现错误

方案2

1 启动spring容器
2 执行context.getbean
3 spring为bean创建对象
4 坏处:在启动spring容器的时候不能发现错误


spring容器init destroy

default

1 启动spring容器
2 创建对象
3 执行init方法 该方法是由spring容器自动调用的
4 context.getbean将对象提取出来
5 对象调用方法
6 当执行close方法的时候,执行该对象destroy方法 该方法是由spring容器自动调用的

scope="prototype"

1 启动spring容器
2 context.getbean将对象提取出来
3 创建对象
4 执行init方法 该方法是由spring容器自动调用的
5 对象调用方法
6 不负责销毁


DI(依赖注入-xml方式)-给属性装配值

setter方法注入

  • property描述的就是bean中的属性

  • name就是属性名称

  • value就是属性值 如果基本类型(包含string)就用value赋值

  • ref 如果是引用类型就用ref赋值

  • 给属性赋值的过程称为装配

  • map类提供了一个称为entrySet()的方法,这个方法返回一个Map.Entry实例化后的对象集。接着,Map.Entry类提供了一个getKey()方法和一个getValue()方法

加断点来弄清加载顺序(构造函数, 方法)

  • list装配

    
        
            
                l1
                
            
        
    
  • set装配

    
        
            
                l1
                
            
        
    
  • map装配

    
        
            
                
                    m1
                
                
                    
                
            
        
    
  • properties装配

    
        
            
                p1
                p2
            
        
    
  • 依赖的优先级比scope高

构造器方法注入

  • constructor-arg 代表某个构造器参数

  • index 构造器参数的下标

  • value

  • ref

  • type 类型

  • 
        
        
    

  • setter与init的执行顺序

    public class DIXMLSetterInitDetroyTest {
       /**
        * 1、启动spring容器
        * 2、实例化person,student
        * 3、调用person的setter方法进行装配
        * 4、调用person的init方法
        * 5、context.getBean
        * 6、person调用方法完成任务
        */
       @Test
       public void testDI_XML_Setter_InitDestroy(){
           ApplicationContext context = 
                   new ClassPathXmlApplicationContext("applicationContext.xml");
           Person person = (Person)context.getBean("person");
           System.out.println(person.toString());
       }
       }

可以同时使用set方法和构造函数方法注入


你可能感兴趣的:(spring)