文章目录
一、Bean的管理及自动装配
bean管理指的是如下的两个操作:
- 创建对象
- 注入属性
Bean管理操作的两种方式:
- 基于xml配置文件的方式实现
- 基于注解方式实现
自动装配
我们在做一个类装入属性时,我们都会通过在xml配置文件中,通过property标签中的name属性,指定value属性值,向类中设置值,这个值可以设置成普通类型,也可以设置成对象类型这种方式叫做手动装配。
自动装配可以不需要property标签,不需要属性名称和属性值,Spring会帮我们自动的完成属性值的注入。
二、通过xml文件配置
cat类
public class Cat {
public void shout() {
System.out.println("miaomiao");
}
}
dog类
public class Dog {
public void shout() {
System.out.println("wangwang");
}
}
people类
public class People {
private Dog dog;
private Cat cat;
public Dog getDog() {
return dog;
}
public Cat getCat() {
return cat;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public void setCat(Cat cat) {
this.cat = cat;
}
}
1.手动配置
<bean id="dog" class="com.zhang.bean.Dog"/>
<bean id="cat" class="com.zhang.bean.Cat"/>
<bean id="people" class="com.zhang.bean.People">
<property name="dog" ref="dog"/>
<property name="cat" ref="cat"/>
</bean>
2.byName(根据属性名称注入)
修改配置文件,加上autowire=“byName”
<bean id="people" class="com.zhang.bean.People" autowire="byName">
</bean>
将会根据名字自动寻找属性名相同的实体类,无需再声明属性标记,spring会在people中寻找是否存在cat和dog这个属性,再去IOC容器中寻找cat和dog对象,如果有的话就装配。
注意实体类中的属性名要和id保持一致才能成功装配,假如你的beans.xml文件里面没有配置对应的属性,也是会暴空指针异常的。
3.byType(根据属性类型注入)
修改bean.xml里面的autowire=“byType”,这样就会根据属性的类型自动匹配。
这时候beans.xml中的属性名可以和实体类中的属性名不一致,甚至不设置name属性也能成功输出结果。
<bean id="dog" class="com.zhang.bean.Dog"/>
<bean class="com.zhang.bean.Cat"/>
<bean id="people" class="com.zhang.bean.People" autowire="byType">
</bean>
但是配置中不能出现两条类型相同的bean,否则就会报错。
三、使用注解
什么是注解?
- 注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值…)
- 使用注解,注解作用在类上面,方法上面,属性上边
- 使用注解的目的:简化XML配置
Spring针对Bean管理中创建对象提供的注解
- @Component 普通的类
- @Controller 表现层
- @Service 业务层
- @Repository 持久层
【注意】上边四个功能一样,都可以用来创建bean实例
1.@Autowired注解
在实体类中的set方法上面添加@Autowired注解
public class People {
private Dog dog;
private Cat cat;
public Dog getDog() {
return dog;
}
@Autowired
public void setDog(Dog dog) {
this.dog = dog;
}
public Cat getCat() {
return cat;
}
@Autowired
public void setCat(Cat cat) {
this.cat = cat;
}
}
- @Autowired(required=false)
说明:false,对象可以为null;true,对象必须存对象,不能为null。
2. @Qualifier注解
配合@Qualifier注解[@Qualifier(value = “xxx”)]使用,可以根据byName的方式自动装配
@Qualifier不能单独使用。
@Autowired
@Qualifier(value = "cat1")
public void setCat(Cat cat) {
this.cat = cat;
}
3.Resource注解
@Resource(name = “配置对象的id”)
@Resource(name = "cat1")
public void setCat(Cat cat) {
this.cat = cat;
}
当有name属性时,将按该属性进行byName方式查找装配;
没有name属性时,进行默认的byName方式进行装配;
不成功,byType的方式自动装配
都不成功,报错
@Autowired与@Resource区别:
1.@Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在set方法上。
2.@Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果想使用名称装配可以结合@Qualifier注解进行使用
3.@Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配
@Value 用于注入普通类型(String,int,double等类型)
@Autowired 默认按类型进行自动装配(引用类型)
@Qualifier 不能单独使用必须和@Autowired一起使用,强制使用名称注入
@Resource Java提供的注解,也被支持。使用name属性,按名称注入