韶光淑气_Spring_4.0 注入详解_2020年4月10日12:01:25

直接值赋值

  • 直接值可理解为String类型或其他基本类型值,可将这类值直接注入到实例中:

    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <!-- results in a setDriverClassName(String) call -->
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
        <property name="username" value="root"/>
        <property name="password" value="masterkaoli"/>
    </bean>
  • 不仅可使用以上常规的setter方法进行注入,还可使用p-属性名的方式进行注入,这类内容作为属性存放在bean标签中。需要注意的是,要在xmlns中添加对p-指令的相关约束:

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close"
            p:driverClassName="com.mysql.jdbc.Driver"
            p:url="jdbc:mysql://localhost:3306/mydb"
            p:username="root"
            p:password="masterkaoli"/></beans>
  • 直接值还可书写在value标签中,存在于property标签中:

    <bean id="mappings"
        class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="properties">
            <value>            
                jdbc.driver.className=com.mysql.jdbc.Driver
                jdbc.url=jdbc:mysql://localhost:3306/mydb
            </value>
        </property>
    </bean>

    value属性中的键值对格式数据将被转换为java.util.Properties类型实例,并对相应的键进行赋值。

  • 在进行注入时,还可直接指定id进行属性注入,使用idref标签进行指定,此类方式优于其他bean指定方式,因其会在部署时验证idref所指向的bean是否存在,而其他方式仅会在运行时发成错误:

    <bean id="theTargetBean" class="..."/><bean id="theClientBean" class="...">
        <property name="targetName">
            <idref bean="theTargetBean"/>
        </property>
    </bean>

引用其他实例

  • 在xml文件中,可通过consructor-arg对构造方法参数进行赋值,或使用property调用setter方法进行赋值。

  • 并且还可以使用ref标签进行bean的引用,这种引用方式与填入bean的id的方式是相同的。

<bean id="accountService" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target">
        <ref parent="accountService"/> 
    </property>
</bean>

内部类实例

  • 可在bean标签中内嵌bean标签,从而给内部类创建实例。

<bean id="outer" class="...">
    <property name="target">
        <bean class="com.example.Person"> <!-- this is the inner bean -->
            <property name="name" value="Fiona Apple"/>
            <property name="age" value="25"/>
        </bean>
    </property>
</bean>

集合赋值

  • 失灵list、set、map、props标签可定义集合内容进行注入。

  • list标签主要用于List相关子类赋值,value标签中的内容为基本类型与String类型,ref为引用其他实例赋值:

    <bean class='...' id='...'>
        <property name="someList">
            <list>
                <value>a list element followed by a reference</value>
                <ref bean="myDataSource" />
            </list>
        </property>
    </bean>
  • set标签主要用于Set子类赋值,与list标签使用方式相同:

    <bean class='...' id='...'>
        <property name="someSet">
            <set>
                <value>just some string</value>
                <ref bean="myDataSource" />
            </set>
        </property>
    </bean>
  • map标签用于给Map子类赋值,其中使用entry标签指定键值对,key属性表示键内容,value可指定为String类型或基本类型,value-ref用于指定其他实例:

    <bean class='...' id='...'>
         <property name="someMap">
            <map>
                <entry key="an entry" value="just some string"/>
                <entry key ="a ref" value-ref="myDataSource"/>
            </map>
        </property>
    </bean>
  • props中存在prop字标签,其中可存放Map或List或Set的任意类型值:

    <bean>
        <property name="adminEmails">
            <props>
                <prop key="administrator">[email protected]</prop>
                <prop key="support">[email protected]</prop>
                <prop key="development">[email protected]</prop>
            </props>
        </property>
    </bean>

集合合并

  • 可对一个bean中的集合做合并操作,合并进去的内容需要在另一个bean中定义。被合并bean要添加abstract属性并定义为true,合并的bean要调价parent属性指定要合并到哪里去。合并的集合可以使用props标签定义,并需添加merge属性而true表示融合:

    <bean id='paret' abstract='true' class='...'>
        <property name='adminEmails'>
            <props>
                <prop key="administrator">[email protected]</prop>
                <prop key="support">[email protected]</prop>
            </props>
        </property>
    </bean>
    
    <bean parent='parent'>
        <property name="adminEmails">
            <props merge="true">
                <prop key="sales">[email protected]</prop>
                <prop key="support">[email protected]</prop>
            </props>
        </property>
    </bean>
  • 如上文所示,合并之后的相同的key值的内容将覆盖本来存在的key的值。

  • 不可对不同类型集合进行合并,只能同类类型合并。merge要在子集合中定义,在父集合中定义多余。

存在泛型集合的注入

  • 自Java1.5之后,存在泛型的概念,即集合存储的值的类型有一定限制,故要对值进行考虑。

  • Spring会通过反射的方式读取到泛型内容,并对内容进行自动转型后赋值。

    <beans>
        <bean id="something" class="x.y.SomeClass">
            <property name="accounts">
                <map>
                    <entry key="one" value="9.99"/>
                    <entry key="two" value="2.75"/>
                    <entry key="six" value="3.99"/>
                </map>
            </property>
        </bean>
    </beans>
    public class SomeClass {
    
        private Map<String, Float> accounts;
    
        public void setAccounts(Map<String, Float> accounts) {
            this.accounts = accounts;
        }
    }

    上文集合泛型值类型为Float,那将对value属性中的内容进行转换后赋值。

空与空串

  • Spring中指定空字符串依然可使用""表示,其等效于java中的空字符串。

  • 如果要存储类似java的null值的内容,需使用null单标签:

    <property name="email">
        <null/>
    </property>

快捷输入方式

  • p-namespace可用于类似property标签的替代,使用属性的方式减少标签的数量:

    <bean name="john-modern" class="com.example.Person"
          p:name="John Doe"
          p:spouse-ref="jane"/>
  • 在使用p:的时候,需要引入相关xml格式约束:

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd">
  • c-namespace可用于constructor-arg标签的替代,及构造函数参数赋值:

    <bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo"
            c:thingThree-ref="beanThree" c:email="[email protected]"/>
  • 使用c:时同样要引入相关xml格式约束文件:

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:c="http://www.springframework.org/schema/c"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd">
  • 以上使用方式中,凡是以-ref后缀的参数名皆参考自其它bean标签。

  • 使用c:方式还可指定构造方法参数下标的方式进行赋值,因为语法限制的问题,下标前要前缀_:

    <bean id="beanOne" class="x.y.ThingOne" c:_0-ref="beanTwo" c:_1-ref="beanThree"
        c:_2="[email protected]"/>

属性的属性

  • 如想向实例中某引用类型属性的属性赋值,可直接使用.的方式进行调用:

    <bean id="something" class="things.ThingOne">
        <property name="fred.bob.sammy" value="123" />
    </bean>

    以上及表示想本实例中fred属性的bob属性的sammy属性中赋值为123。

强制初始化

  • 一般情况下,依赖可以叫做对象中属性实例的创建,但是有时候依赖并没有这样直接,而是由很多错综复杂的情况构成。故创建此实例时,要将看似不相干的一个或多个实例创建出来,因为可能其简介存在依赖关系。

  • 这类依赖要在当前实例创建之前实例化,使用depends-on在当前实例指定实例,即可在创建此实例时优先创建指定的实例后在创建本实例:

    <bean id="beanOne" class="ExampleBean" depends-on="manager"/>
    <bean id="manager" class="ManagerBean" />
  • 若对多个实例形成间接依赖,则可使用逗号将多个实例隔开:

    <bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao"></bean>
    
    <bean id="manager" class="ManagerBean" />
    <bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" />

猜你喜欢

转载自www.cnblogs.com/agoodjavaboy/p/12672566.html