• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

谷谷不咕咕

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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节点)对象,
所以在自动注入时就找不到,所以会报错。

posted on 2021-03-03 19:54  谷谷不咕咕  阅读(57)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3