Spring Bean Autowire(自动装配)
1.Autowire byName
spring容器在XML配置中查找bean,其名称与类属性名称相同。如果在我们的XML配置中有多个具有不同bean名称的相同类的bean,则自动装配不会发生冲突,并将匹配的bean名称与类属性名称一起使用。在我们的示例中找到用作bean的类。
Address.java
public class Address {
private String city;
private String state;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
Employee.java
public class Employee {
private String empName;
@Autowired
private Address address;
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
SpringDemo.java
public class SpringDemo {
public static void main(String[] args) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext("application-config.xml");
Employee employee = (Employee) context.getBean("employee");
System.out.println(employee.getEmpName());
System.out.println(employee.getAddress().getCity());
System.out.println(employee.getAddress().getState());
context.close();
}
}
application-config.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" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.example.demo" />
<bean name="address" class="com.example.demo.Address">
<property name="city" value="Varanasi" />
<property name="state" value="Uttar Pradesh" />
</bean>
<bean name="address2" class="com.example.demo.Address">
<property name="city" value="Bhopal" />
<property name="state" value="Madhya Pradesh" />
</bean>
<bean name="employee" class="com.example.demo.Employee"
autowire="byName">
<property name="empName" value="Manohar Parikar" />
</bean>
</beans>
2.Autowire byType
在byType自动装配的情况下,spring容器查找类类型。如果在XML配置中存在多个符合条件类类型,则容器将抛出错误,在类型自动装配的情况下可能发生三种情况。
1.如果在容器中,只有一个所需类类型的bean,则执行自动装配。
2.如果容器中有多个具有相同类类型的bean,则会引发致命错误并且不执行自动装配。
3.如果容器中没有所需类型的bean,无法执行自动装配,也不会抛出错误。
3.Autowire constructor
constructor自动装配类似于byType自动装配。在constructor自动装配的情况下,spring容器仅实现构造函数参数自动装配。
1.如果在spring容器中,只存在一个构造函数参数的自动装配候选bean,则执行基于构造函数的依赖性。
2.如果有多个相同类类型的bean,则不会执行自动装配并抛出致命错误。
3.如果构造函数自动装配没有所需类类型的bean,则抛出错误。