spring自动装配
自动装配是根据容器的上下文去寻找,不需要人为的去自动装配,例如ref元素,自动转配可以减少指定属性和构造函数参数的需要,并且随着对象的发展不断更新配置,例如,如果您需要向类添加依赖项,则无需修改配置即可自动满足该依赖项。因此,自动装配在开发过程中特别有用,当代码库变得更稳定时,不会否定切换到显式装配的选项。
自动装配使用autowire元素实现自动注入bean,自动装配模式介绍三种,每个bean都可以指定自动装配,但要分清需要装配的依赖。
模式 | 说明 |
---|---|
no | 默认值,没有自动装配,需要通过ref引用bean,对于较大的部署,希望使用这种模式,清晰明白,结构可以更好的控制 |
byName | 按属性名称自动装配,会去查找需要自动装配属性同名的bean,且属性名在容器中不重复,否则会报错,可以不存在,但不会报错 |
byType | 如果容器中存在一个属性类型的bean,也就是class元素,则会自动装配,如果存在多个,则会报错,如果没有匹配的bean,也不会报错 |
创建三个类,以下案例都是借助这三个类
Address类
public class Address {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Address{" +
"name='" + name + '\'' +
'}';
}
}
Game类
public class Game {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Game{" +
"name='" + name + '\'' +
'}';
}
}
User类
public class User {
private String name;
private Game game;
private Address address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Game getGame() {
return game;
}
public void setGame(Game game) {
this.game = game;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", game=" + game +
", address=" + address +
'}';
}
}
byName自动装配
beans.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: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 class="com.yc.ch.Address" id="address" p:name="游泳"/>
<bean class="com.yc.ch.Game" id="game" p:name="计算机"/>
<bean class="com.yc.ch.User" id="user" p:name="Tom" autowire="byName"/>
</beans>
byType自动装配
<?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: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 class="com.yc.ch.Address" id="address" p:name="游泳"/>
<bean class="com.yc.ch.Game" id="game" p:name="计算机"/>
<bean class="com.yc.ch.User" id="user" p:name="Tom" autowire="byType"/>
</beans>