初识Spring(五) | Spring中Bean的装配与管理

Bean的装配与管理

  • 在很多情况下,我们需要在一个类中使用另一个类对象,但是我们已经将对象的创建交给了Spring管理。
  • 所以我们需要通过一些方式来对我们的类中的对象属性进行装配,也就是对象注入,其原理方式和属性值的注入类似。

1 通过ref来装配

我们现在有三个类

public class Cat{
	public void hello(){
		System.out.println("hello,I am cat");
	}
}
pulbic class Dog{
	private name;
	public void hello(){
		System.out.println("hello,I am dog");
	}
}
public class People{
	private name;
	private Dog dog;
	private Cat cat;
	public void setCat(){}
	public void setDog(){}
	public void setName(){}
	public Cat getCat(){}
	public Dog getDog(){}
	public String getName(){}
	public void show(){
		System.out.println("hello,I am "+this.getName());
		cat.hello();
		dog.hello();
	}
}
  • 我们必须将三个类注入到SpringIOC容器中
  • 并将Cat和Dog装配到Peoson中才可以正常使用,就和属性值的注入类似。
  • 实质就是将Cat和Dog实例从IOC中取出并赋值给Peoson类。
<bean id="cat" class="com.lyj.bean.Cat"/>
<bean id="dog" class="com.lyj.bean.Dog"/>
<bean id="people" class="com.lyj.bean.People">
    <property name="name" value="张三"/>
    <property name="cat" ref="cat"/>
    <property name="dog" ref="dog"/>
</bean>

这样手动装配也很方便,但是又更加简便的方式来简化这一过程–>自动装配autowire。

我们可以使用xml配置 , 或者注解的方式来实现自动装配。

2 xml配置实现自动配置

2.1 byName

<bean id="cat" class="com.lyj.bean.Cat"/>
<bean id="dog" class="com.lyj.bean.Dog"/>
<bean id="people" class="com.lyj.bean.People" autowire="byName">
    <property name="name" value="张三"/>
</bean>

只需要通过这种简单的自动装配方式就可以实现之前的功能。它是根据bean的id来和set方法属性名来自动进行匹配的。

2.2 byType

<bean id="cat" class="com.lyj.bean.Cat"/>
<bean id="dog" class="com.lyj.bean.Dog"/>
<bean id="people" class="com.lyj.bean.People" autowire="byType">
    <property name="name" value="张三"/>
</bean>

用法一样,这个是通过类的类型来自动装配。因为是通过类型,所以同一类型的对象实例只能同时存在一个。

3 使用注解实现自动装配

jdk1.5开始支持注解,spring2.5开始全面支持注解。

第一步我们使用ref引用的方式来bean实例装配。

第二步我们使用autowire的方式来实现bean自动装配。

第三步将用注解的方式来实现自动装配。

使用注解方式需要增加一些配置。

  1. 在spring配置文件中引入context头文件。

    xmlns:context="http://www.springframework.org/schema/context"
    
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    
  2. 开启属性注解支持!

    <context:annotation-config/>
    

3.1 Autowired

  • @Autowired是按类型自动转配的,不支持id匹配。

  • 需要导入 spring-aop的包!(已经在mvc的jar包中导入)

使用方法:

实体类:

@Autowired
private Cat cat;

@Autowired
private Dog dog;
private String name;

bean.xml

<bean id="cat" class="com.lyj.bean.Cat"/>
<bean id="dog" class="com.lyj.bean.Dog"/>
<bean id="people" class="com.lyj.bean.People"/>

@Autowired默认是通过类型来匹配的,可以理解为byType的匹配规则

因为注解方式不是使用set的方法来进行注入,所以在实体类中可以不写set方法。

3.2 @Qualifier

  • @Autowired是根据类型自动装配的,加上@Qualififier则可以根据byName的方式自动装配

  • @Qualififier不能单独使用。

使用方法:

实体类:

@Autowired
@Qualifier(value = "cat1")
private Cat cat;
@Autowired
private Dog dog;
private String name;

bean.xml

<bean id="cat1" class="com.lyj.bean.Cat"/>
<bean id="cat2" class="com.lyj.bean.Cat"/>
<bean id="dog" class="com.lyj.bean.Dog"/>
<bean id="people" class="com.lyj.bean.People"/>

通过这么一种方式,就可以实现和ref一样的功能。

它也可以写在set方法上。

@Autowired(required = false) //这个注解意思是允许参数为空,但是我测试默认他就允许为空,不知道它的意义在哪。

4 使用另一种注解的方式来实现自动配置

4.1 @Resource

  • @Resource如有指定的name属性,先按该属性进行byName方式查找装配;
  • 其次再进行默认的byName方式进行装配;
  • 如果以上都不成功,则按byType的方式自动装配。

实体类:

@Resource(name = "cat1")
private Cat cat;

bean.xml

<bean id="cat1" class="com.lyj.bean.Cat"/>
<bean id="cat2" class="com.lyj.bean.Cat"/>
<bean id="dog" class="com.lyj.bean.Dog"/>
<bean id="people" class="com.lyj.bean.People"/>

通过这样的方式,也可以实现ref的功能。

它和**@Autowired一样可以写在set方法**上。

5 @Autowired与@Resourse的异同

  • 同样可以写在属性或者set方法上,配合属性使用可以实现ref的功能。
  • @Autowired属于spring规范,默认byType的方式匹配
  • @Resource(属于J2EE复返),默认通过byname的方式匹配。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值