spring逐步学习___bean的属性注入方式

第一种:构造器参数注入

第二种:setter方法属性注入(setter方法的规范需要符合JavaBean规范)

第三种:接口注入

注意:Spring 框架规范中通过配置文件配置的方式.只支持构造器参数注入setter方法属性注入,不支持接口注入 

测试构造器参数注入:

新建一个类,生成构造器

 

//目标,构造器参数注入,new car直接将参数的值直接赋值
public class Car {
    private Integer id;
    private String name;
    private Double price;
    //有参构造
    public Car(Integer id, String name, Double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }
    
    //取值要用getter
    public Integer getId(){
        return this.id;
    }
    
    
    public String toString() {
        return "Car [id=" + id + ", name=" + name + ", price=" + price + "]";
    }

}

 

配置容器中的bean写法:<>

<!-- 构造器注入属性的值 -->
    <bean id="car" class="com.igeek.xmlpropertydi.Car">
        <!--constructor-arg:告诉spring容器,要调用有参构造方法了,不再调用默认的构造方法了  
        new Car(1,"宝马",99999d)
        参数第一组:定位属性
            * index:根据索引定位属性,0表示第一个位置
            * name:根据属性参数名称定位属性
            * type:根据属性数据类型定位属性
        参数第二组:值
            * value:简单的值,字符串
            * ref:复杂的(由spring容器创建的bean对象)
        -->
        <!-- <constructor-arg index="0" value="1"/> -->
        <constructor-arg index="0" name="id" value="1"/>
        <!-- <constructor-arg name="name" value="宝马1代"/> -->
        <constructor-arg name="name" >
            <value>宝马2代</value>
        </constructor-arg>
        <constructor-arg type="java.lang.Double" value="99999d"/>
    </bean>

测试构造器生成对象:

@Test
    public void test(){
        //spring容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取car
        Car car =(Car) applicationContext.getBean("car");
        System.out.println(car);
    }

测试setXxx方法属性注入property:

创建Person类,设置属性,setget方法:

public class Person {
    private Integer id;
    private String name;
    private Car car;
    //必须提供setter属性方法
    public void setId(Integer id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setCar(Car car) {
        this.car = car;
    }
    
    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", car=" + car + "]";
    }

}

配置spring容器中的bean写法:------->property

<!-- setter方法属性注入:调用默认构造器,相当于new Person() -->
<bean id="person" class="com.igeek.xmlpropertydi.Person">
<!-- property:专门进行setter属性注入用的标签 。
            * name:setter方法的属性的名字,例如SetXxx-那么name的属性值为xxx。
            * value:简单的值
            * ref:bean的名字,对象的引用
        -->
        <property name="id" value="1001"/>
        <property name="name" value="Tom"/>
        <!-- <property name="car" ref="car"/> --><!--等同于-->
        <property name="car">
            <ref bean="car"/>
        </property>
    </bean>

测试set注入bean属性:

@Test
    public void test1(){
        //spring容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");        
        //获取人
        Person person=(Person)applicationContext.getBean("person");
        System.out.println(person);
    }

引入P命名空间:为简化set方法属性依赖注入

需要引入p名称空间:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd">

对比   set---->preporty与p命名写法

<!-- p命名空间写法-->
<bean id="person2" class="com.igeek.xmlpropertydi.Person" p:id="1002" p:name="关羽" p:car-ref="car"/>

<!-- property写法-->
<bean id="person" class="com.igeek.xmlpropertydi.Person">
        <!-- 
        property:专门进行setter属性注入用的标签 。
            * name:setter方法的属性的名字,例如SetXxx-那么name的属性值为xxx。
            * value:简单的值
            * ref:bean的名字,对象的引用
        -->
        <property name="id" value="1001"/>
        <property name="name" value="Tom"/>
        <!-- <property name="car" ref="car"/> --><!--等同于-->
        <property name="car">
            <ref bean="car"/>
        </property>
    </bean>

 

 

posted @ 2020-03-06 15:29  我的二天  阅读(209)  评论(0编辑  收藏  举报