SpringIoC Bean的依赖和配置

1)Bean属性的直接赋值

这里是使用XML文件,对Bean的属性进行赋值,在赋值的过程中不仅有基本类型的属性,也有集合类型的属性,在对XML文件进行配置的时候,这些集合类型属性的赋值有些许差别,需要注意。

Bean类
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import lombok.Data;

@Data
public class Bean1 {

    private String strValue;

    private int intValue;

    private List listValue;

    private Set setValue;

    private Map mapValue;

    private String [] strArray;

    //特殊属性
    private Date dateValue;
    
}
applicationContext-beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">

    <bean id="bean1" class="com.mechanicalwood.bean.Bean1">
        <property name="strValue" value="abc"/>
        <property name="intValue" value="123"/>
        <property name="listValue">
            <list>
                <value>value1</value>
                <value>value2</value>
                <value>value3</value>
            </list>
        </property>
        <property name="strArray">
            <list>
                <value>arrayValue1</value>
                <value>arrayValue2</value>
                <value>arrayValue3</value>
            </list>
        </property>

        <property name="mapValue">
            <map>
                <entry key="mapkey1" value="mapValue1"/>
                <entry key="mapkey2" value="mapValue2"/>
                <entry key="mapkey3" value="mapValue3"/>
            </map>
        </property>

        <property name="setValue">
            <set>
                <value>setValue1</value>
                <value>setValue2</value>
                <value>setValue3</value>
            </set>
        </property>

        <property name="dateValue" value="2019-5-26"/>
    </bean>

</beans>
运行结果

在这里插入图片描述

2)配置Bean类依赖关系

Bean关系
import lombok.Data;

@Data
class Bean2 {

   private Bean3 bean3;

   private Bean4 bean4;

   private Bean5 bean5;
   
}
class Bean3 {

    private int id;

    private String username;

    private String password;
    
}
class Bean4 {

    private int id;

    private String username;
}
class Bean5 {

    private int age;
    
}

首先进行分析Bean3和Bean4有共同的属性,可以在XML文件中设置抽象Bean,Bean3、Bean4、Bean5同时又是Bean2的属性,所以要配置彼此间的关系。

applicationContext-beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">
    <!--设置抽象Bean-->
    <bean id="abstractBean" abstract="true">
        <property name="id" value="888"/>
        <property name="username" value="MechanicalWood"/>
    </bean>
    <!--bean3和bean4继承抽象类的属性-->
    <bean id="bean3" class="com.mechanicalwood.bean.Bean3" parent="abstractBean">
        <property name="password" value="666"/>
    </bean>

    <bean id="bean4" class="com.mechanicalwood.bean.Bean4" parent="abstractBean"/>


    <bean id="bean5" class="com.mechanicalwood.bean.Bean5">
        <property name="age" value="18"/>
    </bean>


    <bean id="bean2" class="com.mechanicalwood.bean.Bean2">
        <property name="bean3" ref="bean3"/>
        <property name="bean4" ref="bean4"/>
        <property name="bean5" ref="bean5"/>
    </bean>

</beans>
运行结果

在这里插入图片描述

自定义属性配置

1)自定义属性编辑器

public class MyEditConvert extends PropertyEditorSupport {

    private String dateParttern = "yyyy-MM-dd";

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        Date date = null;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(dateParttern);
            date = sdf.parse(text);
            setValue(date);
       }catch (Exception ex){
           ex.printStackTrace();
       }
    }
}

2)通过xml文件注册属性编辑器给Spring容器

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">

   <!--注册自定义的属性编辑器到spring容器中-->
    <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
        <property name="customEditors">
           <map>
               <entry key="java.util.Date" value="com.mechanicalwood.MyEditConvert"/>
           </map>
        </property>
    </bean>
</beans>

singleton/prototype(作用域)

Bean6
public class Bean6 {

    private String strValue;

    public Bean6(){

    }

    public String getStrValue() {
        return strValue;
    }

    public void setStrValue(String strValue) {
        this.strValue = strValue;
    }
}

默认情况下,Bean在IoC容器中只存在一个实例,所有对象对其的引用都返回同一个。
在这里插入图片描述
设置为多例:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">
    
    <bean id="bean6" class="com.mechanicalwood.bean.Bean6" scope="prototype">
        <property name="strValue" value="MechanicalWood"/>
    </bean>

</beans>

在这里插入图片描述

测试代码

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.Arrays;


public class BeanTest {

    private ApplicationContext context = null;

    @Before
    public void initMethod(){
        context = new ClassPathXmlApplicationContext("applicationContext-beans.xml");
    }
    @Test
    public void testSpringInject(){
        Bean1 bean1 = (Bean1) context.getBean("bean1");
        System.out.println("intValue = " + bean1.getIntValue());
        System.out.println("strValue = "+ bean1.getStrValue());
        System.out.println("strArrayValue = " + Arrays.toString(bean1.getStrArray()));
        System.out.println("listValue = " + bean1.getListValue());
        System.out.println("mapValue = " + bean1.getMapValue());
        System.out.println("setValue = " + bean1.getSetValue());

        System.out.println("dateValue = " + bean1.getDateValue());
    }

    @Test
    public void testSpringInject2(){
        Bean2 bean2 = (Bean2) context.getBean("bean2");
        System.out.println("bean3.id = " + bean2.getBean3().getId());
        System.out.println("bean3.username = " + bean2.getBean3().getUsername());
        System.out.println("bean3.password = " + bean2.getBean3().getPassword());

        System.out.println("bean4.id = " + bean2.getBean4().getId());
        System.out.println("bean4.username = " + bean2.getBean4().getUsername());

        System.out.println("bean5.age = " + bean2.getBean5().getAge());

    }
    @Test
    public void testSpringInject3(){
        Bean6 bean6_01 = (Bean6) context.getBean("bean6");
        Bean6 bean6_02 = (Bean6) context.getBean("bean6");

        if(bean6_01.equals(bean6_02)){
            System.out.println("bean6_01 equals bean6_02");
        }else{
            System.out.println("bean6_01 not equals bean6_02");
        }

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值