目录
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自动装配。
第三步将用注解的方式来实现自动装配。
使用注解方式需要增加一些配置。
-
在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
-
开启属性注解支持!
<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的方式匹配。