五:注入

Spring的依赖注入

依赖注入的概念

它是spring框架核心ioc的具体实现。我们的程序在编写时,通过控制反转,把对象的创建交给了spring,但是代码中不可能出现没有依赖的情况 。ioc解耦只是降低他们的依赖关系,但不会消除。例如:我们的业务层仍会调用数据访问层的方法。这种业务层和数据访问层的依赖关系,在使用spring之后,就让spring来维护了。简单的说,就是坐等框架把数据访问层对象传入业务层,而不用我们自己去获取组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中

依赖注入的目的

并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现

Spring依赖注入的两种方式

1)构造函数注入

使用类中的构造函数,给成员变量赋值,注意:赋值的操作不是我们自己做的,而是通过配置的方式,让spring框架来为我们注入

<constructor-arg>标签
属性
  1. 给谁赋值
    ・index:指定参数在构造函数参数列表的索引位置
    ・type:指定参数在构造函数中的数据类型
    ・name:指定参数在构造函数中的名称,用这个找给谁赋值
  2. 赋什么值
    ・value:它能赋的值是基本数据类型和String类型
    ・ref:它能赋的值是其他bean类型,也就是说,必须得是在配置文件中配置过的bean
结构
beans.xml文件中    
                                                                
//会根据class="cn.xh.Demo01.Car"创建对象,并且给这个对象的属性赋值                                                                  
<bean id="car" class="cn.xh.Demo01.Car">                                                                    
    //Car类的构造方法第一个参数是brand,第二个参数是price,下面这两行是分别给这两个参数赋值的                                                                
    <constructor-arg index="0" value="奔驰"></constructor-arg>                                                                
    <constructor-arg index="1" value="180000"></constructor-arg>        
    //Car类里price是double类型,但这个配置文件里都要写String类型的,到时会转换                                                                
    //上面那种不容易判断到底是给谁赋值了,还要去Car类里看,常用的是下面这种                                                              
    <constructor-arg name="brand" value="奔驰"></constructor-arg>                                                             
    <constructor-arg name="price" value="180000"></constructor-arg>                                                             
</bean>                                                                 
<bean id="person" class="cn.xh.Demo01.Person">                                                                  
    <constructor-arg name="name" value="张三"></constructor-arg>                                                              
    <constructor-arg name="car" ref="car"></constructor-arg>                                                                
</bean>                                                                 
                                                                    
                                                                    
Car.java文件中                                                                 
                                                                    
public class Car {                                                                  
    private String brand;                                                               
    private Double price;                                                               
                                                                    
    //要写带参的构造函数                                                             
    public Car(String brand, Double price) {                                                                
        this.brand = brand;                                                         
        this.price = price;                                                         
    }                                                               
                                                                    
    public String toString() {                                                              
        return "Car{" + "brand='" + brand + '\'' + ",price=" + price + '}';                                                         
        }                                                           
    }                                                               
}                                                                   
                                                                    
                                                                    
Person.java文件中                                                                  
                                                                    
public class Person {                                                                   
    private String name;                                                                
    private Car car;                                                                
                                                                    
    //要写带参的构造函数                                                             
    public Person(String name, Car car) {                                                               
        this.name = name;                                                           
        this.car = car;                                                         
    }                                                               
                                                                    
    public String toString() {                                                              
        return "Person{" + "name='" + name + '\'' + ",car=" + car + '}';                                                            
        }                                                           
    }                                                               
}                                                                   
                                                                    
Test.java文件中                                                                    
                                                                    
public class Test {                                                                 
    public static void main(String[] args) {                                                                
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");                                                           
        Car car = (Car)context.getBean("car");                                                          
        System.out.println(car.toString());                                                         
        //运行结果为打印输出:Car{brand='奔驰', price=180000.0}                                                         
                                                                    
        Person p = (Person)context.getBean("person");                                                           
        System.out.println(p.toString());                                                           
        //运行结果为打印输出:Person{name='张三', car=Car{brand='奔驰', price=180000.0}}                                                          
    }                                                               
}                                                                   

2) set方法的方式注入属性
beans.xml文件中                                        
                                        
<bean id="car" class="cn.xh.Demo01.Car">                                        
    <property name="brand" value="奔驰"></property>                                   
    <property name="price" value="180000"></property>                                   
</bean>                                     
<bean id="person" class="cn.xh.Demo01.Person">                                      
    <property name="name" value="张三"></property>                                    
    <property name="car" ref="car"></property>                                  
</bean>                                     
                                        
                                        
Car.java文件中                                     
                                        
public class Car {                                      
    private String brand;                                   
    private Double price;                                   
                                        
    //不能有有参数的构造函数,否则会报错                                 
    /* public Car(String brand, Double price) {                                 
        this.brand = brand;                             
        this.price = price;                             
    }*/                                 
                                        
    //一定要加set方法,否则注入无法实现                                    
    public void setBrand(String brand) {                                    
        this.brand = brand;                             
    }                                   
                                        
    public void setPrice(Double price) {                                    
        this.price = price;                             
    }                                   
                                        
    public String toString() {                                  
        return "Car{" + "brand='" + brand + '\'' + ",price=" + price + '}';                             
        }                               
    }                                   
}                                       
                                        
Person.java文件中                                      
                                        
public class Person {                                       
    private String name;                                    
    private Car car;                                    
                                        
    //不能有有参数的构造函数,否则会报错                                 
    /*public Person(String name, Car car) {                                 
        this.name = name;                               
        this.car = car;                             
    }*/                                 
                                        
    public void setName(String name) {                                  
        this.name = name;                               
    }                                   
                                        
    public void setCar(Car car) {                                   
        this.car = car;                             
    }                                   
                                        
    public String toString() {                                  
        return "Person{" + "name='" + name + '\'' + ",car=" + car + '}';                                
        }                               
    }                                   
}                                       
                                        
                                        
Test.java文件中                                        
                                        
public class Test {                                     
    public static void main(String[] args) {                                    
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");                               
        Car car = (Car)context.getBean("car");                              
        System.out.println(car.toString());                             
        //运行结果为打印输出:Car{brand='奔驰', price=180000.0}                             
                                        
        Person p = (Person)context.getBean("person");                               
        System.out.println(p.toString());                               
        //运行结果为打印输出:Person{name='张三', car=Car{brand='奔驰', price=180000.0}}                              
    }                                   
}                                       

3) 集合和数组注入(通过set注入)
结构
beans.xml文件中        
                                
<bean id="collections" class="cn.xh.Demo01.Collections">                                        
    <property name="str">                                   
        <list>                              
            <value>北京</value>                           
            <value>上海</value>                           
        </list>                             
    </property>                                 
    <property name="list">                                  
        <list>                              
            <value>北京</value>                           
            <value>上海</value>                           
        </list>                             
    </property>
    *************************************************                               
    <property name="map">                                   
        <map>                               
            <entry key="1" value="张三"></entry>                          
            <entry key="2" value="李四"></entry>                          
        </map>                              
    </property>                                 
    <property name="prop">                                  
        <props>                             
            <prop key="1">张三</prop>                         
            <prop key="2">李四</prop>                         
        </props>    
    *************************************************
    =================================================   
   //上面*框起来的部分也可以像下面这样写,效果都是一样的
    <property name="map">               
        <props>         
            <prop key="1">张三</prop>     
            <prop key="2">李四</prop>     
        </props>            
    </property>             
    <property name="prop">              
        <map>           
            <entry key="1" value="张三"></entry>      
            <entry key="2" value="李四"></entry>      
        </map>          
    </property>             
    =================================================                           
                                    
</bean>                                     
                                        
                                        
                                        
Collections.java文件中                                     
                                        
public class Collections {                                      
    private String[] str;                                   
    private List<String> list;                                  
    private Map<String,String> map;                                 
    private Properties prop;                                    
                                        
    public void setStr(String[] str) {                                  
        this.str = str;                             
    }                                   
                                        
    public void setList(List<String> list) {                                    
        this.list = list;                               
    }                                   
                                        
    public void setMap(Map<String,String> map) {                                    
        this.map = map;                             
    }                                   
                                        
    public void setProp(Properties prop) {                                  
        this.str = str;                             
    }                                   
                                        
    public String toString() {                                  
        return "Collections {" + "str=" + Arrays.toString(str) + ", list=" + list + ", map=" + map + ",prop=" + prop +'}';                              
    }                                   
}                                       
                                        
                                        
Test.java文件中                                        
                                        
public class Test {                                     
    public static void main(String[] args) {                                    
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");                               
        Collections col = (Collections)context.getBean("collections");                              
        System out. Println(col.toString());                                
        //执行结果为打印输出:Collections{str=[北京,上海], list=[北京,上海], map={1=张三, 2=李四}, prop={2=李四, 1=张三}}                                                                                                                                                                             
    }                                   
}                                       

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容