DI—XML自动装配
<bean>元素中的: autowire 属性,格式如下:
<bean id="somebean" class="SomeBean" autowire="byTeyp"/>
class = “SomeBean”为所指定类的完整类名 ;
autowire 属性:让Spring按照一定的规则方式自己找到合适的对象,并完成DI操作
•default:不要自动注入,缺省default表示no
•no:不要自动注入
•byName:按照名字注入(按照属性的名字在spring中找bean)
factory.getBean(String beanName)
•byType:按照依赖对象的类型注入
factory.getBean(Class requiredType)
•constructor:按照对象的构造器上面的参数类型注入
Ps:如果使用 byName 自动注入,要求所有的属性名字和id的名字必须保证一种规范的命名方式;
如果使用byType注入,如果Spring中同一个类型有多个实例,会报bean不是唯一 类型错误,该方式不推荐使用。
实例:
原代码(注意导入lombok依赖和包):
Lombok依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
1.编写Person类:
@NoArgsConstructor
@Setter
@Getter//注:添加lombok的依赖
public class Person{
private Dog dog;
}
2.编写Dog类:
@NoArgsConstructor
@Getter
@Setter
public class Dog {
private String name;
}
3.在配置文件中进行配置
<bean id="person" class="gu.Person">
<property name="dog" ref="dog"/>
</bean>
<bean id="dog" class="gu.Dog">
<property name="name" value="小黄"/>
4.测试类
public class PersonTest {
public static void main(String[] args) {
ApplicationContext context = new
ClassPathXmlApplicationContext("di-xml.xml");
Person person = context.getBean("person", Person.class);
System.out.println(person.getDog().getName());
}
}

<!-- 自动装配,可更该上述第3步配置内容为下 -->
<bean id="dog" class="gu.Dog">
<property name="name" value="小黄"/>
</bean>
<!-- 自动装配 ,byType:按照依赖对象的类型注入-->
<bean id="person" class="gu.Person" autowire="byType"></bean>
</beans>
但是使用的是按照依赖对象的类型注入的,所以在有两个Dog类型的实例对象
时就会被读取到,就会报错,如:
——>available: expected single matching bean but found 2: dog,dog1
更改代码如下:
<bean id="dog" class="gu.Dog">
<property name="name" value="小黄"/>
</bean>
<bean id="dog1" class="gu.Dog">
<property name="name" value="小黑"/>
</bean>
<!-- 自动装配 -->
<bean id="person" class="gu.Person" autowire="byName">
</bean>
执行结果——> 小黄
运行的结果为“小黄”,为什么呢?原因是因为在Person中的属性名称为dog,
如果想输出的结果为“不黑”,那么需要修改Person类中的Dog类型的属性为
dog1即可。
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
public class Person {
private Dog dog1;
}
修改测试类:
public class PersonTest {
public static void main(String[] args) {
ApplicationContext context = new
ClassPathXmlApplicationContext("spring.xml");
Person person = context.getBean("person", Person.class);
System.out.println(person.getDog1().getName());
}
运行结果——>小黑
注意:如果把Person中的Dog类型的属性名改为dog2时,再执行就会报空指针了。
因为在spring.xml文件中没有名称(id属性)为dog2的实例(bean节点)对象,
所以在自动注入时就找不到,所以会报错。
浙公网安备 33010602011771号