在春天自动怀疑?

时间:2011-06-27 18:47:34

标签: spring

经过autowiring concept之后 我有一些问题。这些是: -

  • 如果我需要在课程byTypebyName下面自动装配,是否必须在班级学院中使用setStudent()方法?

public class College {

  private Student student1;
  private String registration1;
}

  • <bean id="student1" class="Student"/> - 如果是byname,它会查看id属性,如果是bytype,它会查找class属性以上 Stetement。对?如果它为同一类型找到两个bean dean标签,它将在bytype的情况下抛出致命错误。正确的吗?

  • autodetect场景通过内省bean类选择constructorbyType。如果找到默认构造函数,则为byType模式 将适用。 我的问题在于,如果找不到默认构造函数,并且找到带有参数的构造函数,则由构造函数自动装配 将适用。正确的吗?

  • 我们是否需要在@Autowired中的某处指定College以应用自动装配。正如我在this example中看到的那样 但没有指定任何内容here

2 个答案:

答案 0 :(得分:4)

1),4)Spring中有两种不同的自动装配方式:基于XML和基于注释。

基于XML的自动装配从XML配置激活,如here所述。最后,它会调用setter方法,因此这里需要setStudent()方法。

另一方面,基于启蒙的自动装配是通过反射魔法进行的。它会尝试使用@Autowired注释填充您标记的所有内容。实际上,它可以设置没有访问器的私有字段,如

public class Foo {
    @Autowired private Thingy thing; // No getThing or setThing methods

    private void doStuff() {
       // thing is usable here
    }
}

要使@Autowired注释起作用,您需要定义相应的bean后处理器;它是通过将以下行添加到xml config来完成的:

<context:annotation-config/>

请注意,这两种自动装配方法是独立的,并且可以(但不建议)同时使用它们。在这种情况下,xml自动装配将覆盖注释。

2)一般情况下,如果无法找到一个且只有一个注射候选者,则自动装配将失败。因此,在您的情况下,它将在容器创建时失败。有一些后备怪癖,但总的来说它可靠地运作。

3)是的,documentaion这样说。

关于byNamebyType自动装配。虽然byName自动装配只是尝试匹配bean名称(可以使用id属性指定),但byTypeclass属性查找复杂一点。它通过 type 搜索bean,它将匹配接口。例如:

public interface SomeService {
    void doStuff();
}

public class SomeServiceImpl implements SomeService {
    @Override public void doStuff() {
        // Implementation
    };
}

public class ServiceUser {
    @Autowired
    private SomeService someService; // SomeServiceImpl instance goes here
}

P.S。您在问题中引用了两个不同版本的Spring,即2.5和3.0。自动装配行为在两者中都是相同的。

答案 1 :(得分:1)

另外如果您使用@Autwired注释,则需要将类标记为自动装配的候选者。应该使用以下注释之一来完成:

@Repository
@Service
@Component
@Controller

因为你可以在不同的范围配置它:

@Scope("prototype")
@Repository
public class MovieFinderImpl implements MovieFinder {
    // ...
}

希望它更清楚。