бобовая электропроводка в весенней рамке - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь узнать Весну из книги Pro Spring 5.

Вот пример, который я не понял по автопроводке:

<?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="fooOne" class="com.apress.prospring5.ch3.xml.Foo"/>
    <bean id="barOne" class="com.apress.prospring5.ch3.xml.Bar"/>

    <bean id="targetByName" autowire="byName" class="com.apress.prospring5.ch3.xml.Target"
        lazy-init="true"/>

    <bean id="targetByType" autowire="byType" class="com.apress.prospring5.ch3.xml.Target"
        lazy-init="true"/>

    <bean id="targetConstructor" autowire="constructor" 
        class="com.apress.prospring5.ch3.xml.Target" lazy-init="true"/>
</beans>

Класс Tarjet

package com.apress.prospring5.ch3.xml;

import org.springframework.context.support.GenericXmlApplicationContext;

public class Target {
    private Foo fooOne;
    private Foo fooTwo;
    private Bar bar;

    public Target() {
    }

    public Target(Foo foo) {
        System.out.println("Target(Foo) called");
    }

    public Target(Foo foo, Bar bar) {
        System.out.println("Target(Foo, Bar) called");
    }

    public void setFooOne(Foo fooOne) {
        this.fooOne = fooOne;
        System.out.println("Property fooOne set");
    }

    public void setFooTwo(Foo foo) {
        this.fooTwo = foo;
        System.out.println("Property fooTwo set");
    }

    public void setBar(Bar bar) {
        this.bar = bar;
        System.out.println("Property bar set");
    }

    public static void main(String... args) {
        GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
        ctx.load("classpath:spring/app-context-03.xml");
        ctx.refresh();

        Target t = null;

        System.out.println("Using byName:\n");
        t = (Target) ctx.getBean("targetByName");

        System.out.println("\nUsing byType:\n");
        t = (Target) ctx.getBean("targetByType");

        System.out.println("\nUsing constructor:\n");
        t = (Target) ctx.getBean("targetConstructor");

        ctx.close();

    }
}

Foo Class

package com.apress.prospring5.ch3.xml;

public class Foo {

}

Бар класса

package com.apress.prospring5.ch3.xml;

public class Bar {

}

Что я не понял:

<bean id="targetByName" autowire="byName" class="com.apress.prospring5.ch3.xml.Target"
        lazy-init="true"/>

Как будут вводиться целевые атрибуты (fooOne, fooTwo, bar), зная, что мы не использовали какое-либо свойство или конструктор для определения bean-компонента?

обычно мы должны иметь что-то вроде:

 <property name = "fooOne">
         <bean id = "fooOne" class = "com.apress.prospring5.ch3.xml.Foo"/>
      </property>

1 Ответ

0 голосов
/ 15 января 2019
<bean id="targetByName" autowire="byName" class="com.apress.prospring5.ch3.xml.Target"
lazy-init="true"/>

Поскольку он объявляет режим автоматической проводной связи как " byName ", который имеет следующее поведение (взято из docs ):

Автопроводка по названию свойства. Весна ищет боб с тем же имя как свойство, которое должно быть автоматически подключено. Например, если для определения компонента установлено автоматическое подключение по имени, и оно содержит мастер свойство (то есть, у него есть метод setMaster (..)), Spring ищет определение компонента с именем master и использует его для установки свойства.

Это означает, что это инъекция сеттера.

Вернемся к вашему примеру, поскольку Target имеет следующие установщики, spring сделает следующее для инъекции:

public class Target {

    // Find a bean which name is "fooOne" , and call this setter to inject 
    public void setFooOne(Foo fooOne) {}

    // Find a bean which name is "fooTwo" , and call this setter to inject (As no beans called fooTwo in your example , it will be null) 
    public void setFooTwo(Foo foo) {}

    //Find a bean which name is "bar" , and call this setter to inject (As no beans called bar in your example  , it will be null)   
    public void setBar(Bar bar) {}      
}

Конечно, если тип бина не совпадает с типом аргумента установщика, произойдет исключение.

...