почему @Autowired может получить тип FactoryBean и тип Bean? - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть создание фабричного компонента Spring в .xml

 <bean id="tool" class="pojo.ToolFactory">
    <property name="factoryId" value="9090"/>
    <property name="toolId" value="1"/>
 </bean>

и ToolFactory код, подобный этому, который реализует FactoryBean и создает bean-компонент Tool:

public class ToolFactory implements FactoryBean<Tool> {

private int factoryId;
private int toolId;

public ToolFactory() {
}

public ToolFactory(int factoryId, int toolId) {
    this.factoryId = factoryId;
    this.toolId = toolId;
}

@Override
public Tool getObject() throws Exception {
    return new Tool(toolId);
}

@Override
public Class<?> getObjectType() {
    return Tool.class;
}

@Override
public boolean isSingleton() {
    return false;
}

public int getFactoryId() {
    return factoryId;
}

public void setFactoryId(int factoryId) {
    this.factoryId = factoryId;
}

public int getToolId() {
    return toolId;
}

public void setToolId(int toolId) {
    this.toolId = toolId;
}

@Override
public String toString() {
    return "ToolFactory{" +
            "factoryId=" + factoryId +
            ", toolId=" + toolId +
            '}';
}

}

когда я использую @Autowired, чтобы получить бин с именем «tool», тип которого может быть Tool, что не странно, но когда я устанавливаю бин с типом ToolFactory, он также может быть скомпилирован и беги правильно, тогда я запутался, кто-нибудь может дать мне объяснение? спасибо ~

вот код @Autowired:

@Autowired
private Tool tool; //i can understand this

 @Autowired
private ToolFactory tool; // but  this can be compiled and run correctly, which is confused

и затем, когда я использую @Autowired с @Qualifier, тип Tool или ToolFactory также может быть распознан:

@Autowired
@Qualifier("tool")
private Tool tool;

 @Autowired
@Qualifier("tool")
private ToolFactory tool;

почему bean-компонент с именем "tool" может иметь тип Tool или ToolFactory?

1 Ответ

0 голосов
/ 19 ноября 2018

Ваш первый образец автоматической проводки выполнен по типу, а название не имеет значения. Поле можно даже назвать foo, и оно все равно будет работать. Имя поля не имеет ничего общего с именем компонента, который вы ищете.

Когда дело доходит до автоматической проводки по типу, FactoryBean немного особенный, так как вы можете либо ввести сам FactoryBean, либо тип, который он генерирует. Spring обнаружит тип поля и либо найдет прямой компонент этого типа, либо поставщика этого типа (в данном случае FactoryBean).

Теперь @Qualifier не обязательно связано с именем. Классификатор может быть даже другой аннотацией и т. Д. Это может быть что угодно. Имя используется в качестве квалификатора, однако типы, сгенерированные из FactoryBean (частично), наследуют те же классификаторы, что и фабрики, предоставляющие их. Это единственный способ указать квалификаторы, кроме настраиваемой квалификационной аннотации для сгенерированного типа.

Так вот почему оба образца для автоматической проводки будут работать.

...