Spring学习(三)

DI (Dependency Injection)

1、依赖注入,组件之间的依赖关系由容器在运行期间决定。Ioc容器注入应用程序某个对象,它所需要的外部资源(包括对象,资源,常量数据)。

birthdate需要用到date类型的一个对象,引用了d的对象就是一种DI(依赖注入),s.setBirthdate( d )依赖一个date类型的对象,注入就是将date类型的对象set进去。



    
    
     
    

相当于s.setBirthdate( d ),也可以指定内部的bean


    
    
    
     
        
     
   

相当于s.setBirthdate( new Date )。

Spring Ioc容器

1、具有依赖注入功能的容器。负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。在Spring中BeanFactory是Ioc容器的实际代表者。BeanFactory接口提供了IoC容器的基本功能。Spring Ioc容器通过读取配置文件中的配置元数据,通过元数据对应用中各个对象进行实例化及装配。

Spring学习(三)_第1张图片

Spring IoC容器注入依赖资源的方式

1、Spring IoC容器注入依赖资源的方式有两种setter注入和构造方法注入。

2、setter注入, ( setter-base ),提供setter方法进行注入,依赖于无参构造和setter方法

  • Spring Framework 3.0 之前 ,使用property标记来来指定属性的注入值
     c.setId(1002)
        
        
        
        
    

    通过bean标记来声明这个bean,使用bean标记的id或name属性来指定bean的名称 , bean的class属相来指定bean的类型(具体的不是抽象的,不然需要修改abstract属性为true),name属性指定setter方法对应的名称,比如setBirthdate就写birthdate,ref属性用来指定需要引用的那个已经存在的bean的名称,普通类型用value,需要引用的类型使用ref。

  • Spring Framework 3.0 开始支持 p 命名空间为属性注入值 ,也依赖于无参构造和setter方法
    
    

    普通类型p:name="value",需要引用的类型使用p:name-ref="引用bean的id"

  • 测试案例

    Customer类

    package ecut.ioc.di;
    
    import java.util.Date;
    
    public class Customer {
    
        private Integer id;
        private String name;
        private char gender;
        private Date birthdate;
        
        public Customer() {
            super();
            System.out.println( "调用 Customer 无参构造创建对象" );
        }
        
        public Customer(Integer id, String name, char gender) {
            super();
            this.id = id;
            this.name = name;
            this.gender = gender;
            System.out.println( "调用 Customer( Integer , String , char ) 创建对象" );
        }
    
        public Customer(Integer id, String name, char gender, Date birthdate) {
            super();
            this.id = id;
            this.name = name;
            this.gender = gender;
            this.birthdate = birthdate;
            System.out.println( "调用 Customer( Integer , String , char , Date ) 创建对象" );
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
            System.out.println( "为id属性赋值: " + id );
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
            System.out.println( "为name属性赋值: " + name );
        }
    
        public char getGender() {
            return gender;
        }
    
        public void setGender(char gender) {
            this.gender = gender;
            System.out.println( "为gender属性赋值: " + gender );
        }
    
        public Date getBirthdate() {
            return birthdate;
        }
    
        public void setBirthdate(Date birthdate) {
            this.birthdate = birthdate;
            System.out.println( "为birthdate属性赋值: " + birthdate );
        }
    
    }

    setter-injection.xml

    
    
    
    
        
    
        
        
                 
        
        
        
        
    
    
    

    测试类

    package ecut.ioc.di;
    
    import org.springframework.context.support.AbstractApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class TestSetterInjection {
    
        public static void main(String[] args) {
            //指定configuration metadata配置元数据
            String configLocations = "classpath:ecut/**/di/setter-injection.xml" ;
            //创建spring IOC容器
            AbstractApplicationContext container = new ClassPathXmlApplicationContext( configLocations );
            //ready for use (此时可以从指定的IOC容器中获取指定名称的bean实例了)
            Customer c = container.getBean( "customer" , Customer.class );
            //从容器中获取的bean实例中获取属性值
            System.out.println( c.getId() );
            
            System.out.println( c.getName() );
            
            System.out.println( c.getGender() );
            
            System.out.println( c.getBirthdate() );
            //关闭spring的IOC容器
            container.close();
            
        }
    
    }

 3、构造方法注入 : ( constructor-base )通过构造方法往里面传入值

  • 测试案例

    constructor-injection.xml

    
    
    
    
        
        
        
        
            
            
            
            
            
            
        
        
        
        
        
        
        
        
        
        
        
        
    

    在bean标记内部使用constructor-arg标记来指定构造方法的参数为 ,也可以根据type匹配相应的参数如果这个类型参数唯一,也可以指定index来指定参数,若和参数顺序一致index可以省略,name是指参数名称,value是指定的参数值。

    测试类

    package ecut.ioc.di;
    
    import org.springframework.context.support.AbstractApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class TestConstructorInjection {
    
        public static void main(String[] args) {
            //指定configuration metadata配置元数据
            String configLocations = "classpath:ecut/**/di/constructor-injection.xml" ;
            //创建spring IOC容器
            AbstractApplicationContext container = new ClassPathXmlApplicationContext( configLocations );
            //ready for use (此时可以从指定的IOC容器中获取指定名称的bean实例了)
            Customer c = container.getBean( "customer" , Customer.class );
            //从容器中获取的bean实例中获取属性值
            System.out.println( c.getId() );
            
            System.out.println( c.getName() );
            
            System.out.println( c.getGender() );
            
            System.out.println( c.getBirthdate() );
            //关闭spring的IOC容器
            container.close();
            
        }
    
    }

    如果在Customer类中写了带参数的构造最好写 无参构造,只写有参构造,虚拟机不会再分配无参构造, 因为没有提供无参构造会抛出异常BeanCreationException,没有找到默认构造方法 No default constructor found;

Spring IoC容器注入集合

1、Spring不仅能注入简单类型数据,还能注入集合(Collection、Set、List)类型、数组(Array)类型、字典(Map)类型数据、Properties类型数据。

2、3.0之前的注入方式:在 标签 内部 使用 set 、list 、map 、props 标签实现注入: normal-injection.xml



    
    
    
    

    
        
        
        
        
        
            
                吃饭
                睡觉
                泡妞/被泡
            
        
        
        
        
            
                
                
                
            
        
        
        
        
            
                
                
            
        
        
        
        
            
                东理北门内,太谷路旁,软件楼一楼厕所边的那个门
                东理南区研一好望角
            
        
        
    


3、3.0全新的注入方式:使用 Spring 3.0 开始提供的 util 命名空间,结合 或 p 命名空间实现注入: util-injection.xml




    
    
    
    

    
        吃饭
        睡觉
        泡妞/被泡
    

    
        
        
    

    
        
        
    

    
        东理北门内,太谷路旁,软件楼一楼厕所边的那个门
        东理南区研一好望角
    
    
    
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    


转载请于明显处标明出处

https://www.cnblogs.com/AmyZheng/p/9249548.html

你可能感兴趣的:(框架,Spring)