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">
    
<!--     lazy-init="true" : true:需要用的时候才实例化bean,默认加载配置文件时候实例化bean -->
<!--     init-method="init" 初始化bean,调用init方法 -->
<!--     destroy-method="destroy"  销毁bean调用destroy方法 -->
<!--     scope="prototype"    prototype:创建对象不是单例模式,默认singleton: 单例 -->
    <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">
        
        <!-- list集合注入值 -->
        <property name="cards">
            <list>
                <ref bean="payCard"/>
                <ref bean="payCard1"/>
                <ref bean="payCard2"/>
            </list>
        </property>
        
        <!-- set集合注入值 -->
        <property name="setCards">

            <set>
                <ref bean="payCard"/>
                <ref bean="payCard1"/>
                <ref bean="payCard2"/>
            </set>
        </property>
        
        <!-- map集合注入值 -->
        <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>
        
        <!--Properties集合注入值 -->        
        <property name="proCards">
            <props>
                <prop key="1">中国银行</prop>
                <prop key="2">农业银行</prop>
                <prop key="3">建设银行</prop>
            </props>
        </property>
        
    </bean>
    
    <!--set方法赋值 -->
    <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 这种方式容易出异常

posted @ 2017-10-18 18:59  白露非霜  阅读(1285)  评论(0编辑  收藏  举报
访问量