spring创建bean及数据注入

通过spring的IoC可以实现由配置文件来创建类的对象,可以降低类鱼类之间的耦合,

通常我们都是在代码中控制对象的生成和属性注入,而使用IoC后,就可以将设计好的类交给IoC容器,让容器去控制对象的生成和属性的注入,称为控制反转。生成对象的过程就是将对象依赖的属性进行注入的过程,因此也称依赖注入。

1.实例化bean:通过无参构造;工厂静态方法;工厂非静态方法等

2.属性注入:set方法注入;构造器(构造方法)注入

各类属性的注入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-4.3.xsd">
    




    <bean id="user" class="ni.jun.yang.bean.User" lazy-init="true" 
        init-method="init" destroy-method="destroy" scope="prototype">
        
        <constructor-arg name="card" ref="payCard"/>
        <constructor-arg name="name" type="java.lang.String" value="zhangsan"/>
        <constructor-arg name="age" type="int" value="123"/>
    bean>
    
    <bean id="user1" class="ni.jun.yang.bean.User" lazy-init="true"  scope="prototype">
        
        
        <property name="cards">
            <list>
                <ref bean="payCard"/>
                <ref bean="payCard1"/>
                <ref bean="payCard2"/>
            list>
        property>
        
        
        <property name="setCards">

            <set>
                <ref bean="payCard"/>
                <ref bean="payCard1"/>
                <ref bean="payCard2"/>
            set>
        property>
        
        
        <property name="mapCards">
            <map>
                <entry key="1" value-ref="payCard" >entry>
                <entry key="2" value-ref="payCard1">entry>
                <entry key="3" value-ref="payCard2">entry>
            map>        
        property>
        
                
        <property name="proCards">
            <props>
                <prop key="1">中国银行prop>
                <prop key="2">农业银行prop>
                <prop key="3">建设银行prop>
            props>
        property>
        
    bean>
    
    
    <bean id="payCard" class="ni.jun.yang.bean.PayCard">
        <property name="id" value="98746546764">property>
        <property name="bankName" value="中国银行">property>
    bean>
    <bean id="payCard1" class="ni.jun.yang.bean.PayCard">
        <property name="id" value="12365478932544">property>
        <property name="bankName" value="农业银行">property>
    bean>
    <bean id="payCard2" class="ni.jun.yang.bean.PayCard">
        <property name="id" value="45678975456751">property>
        <property name="bankName" value="建设银行">property>
    bean>
    
beans>

对象的获取:

     ApplicationContext  ctxt = new ClassPathXmlApplicationContext("user-bean.xml");//配置文件名字
        User user = (User) ctxt.getBean("user"); //bean标签的id值

 

3.自动装配:autowire=byName(通过属性名字)   autowire="byType" (通过类型)   autowire="constructor"(通过构造器)

感觉不是很好用:

byName主要是根据set方法来进行自动注入值的,相对靠谱

byType 如果有多个值,就会出异常,它不知道到底该用哪个值去装配

constructor :与 byType 非常相似

感觉用自动装配,代码的可读性,不如手动装配注入,而且byType 这种方式容易出异常

你可能感兴趣的:(spring创建bean及数据注入)