前言
Spring框架里面最核心的就是Bean的概念。而在这里我们将讲述创建Bean实例的三种方法。
目前创建的Bean的方法有三种。
(1)通过XML配置Bean
(2)通过注解声明Bean
(3)通过JavaConfig配置Bean
XML配置Bean
缺点:
(1)XML配置繁琐。
(2)无法在编译的时候发现配置错误。
实现方法:
(1)声明类
(2)通过XML配置文件,定义类对应的Bean实例
(3)spring扫描对应的XML配置文件创建Bean实例
步骤一:声明类
//声明类
public class Rabbit {
private String eyes;
private String legs;
public Rabbit(String eyes, String legs) {
this.eyes = eyes;
this.legs = legs;
}
public String getEyes() {
return eyes;
}
public void setEyes(String eyes) {
this.eyes = eyes;
}
public String getLegs() {
return legs;
}
public void setLegs(String legs) {
this.legs = legs;
}
}
步骤二:通过XML配置文件,定义类对应的Bean实例
(1)通过调用类中的构造函数,创建Bean。
因为类中会有无参构造函数和有参构造函数。所以通过构造函数创建Bean的方式也有两种。一种是调用无参构造函数创建Bean,一种是调用有参构造函数创建Bean。
方法一:调用有参构造函数创建Bean
//调用带参构造函数,声明Bean
<bean id="rabbit" class="com.test.domain.Rabbit">
<constructor-arg name="eyes" value="兔子的眼睛"/>
<constructor-arg name="legs" value="兔子的退"/>
</bean>
如上所示,id用于唯一确定一个Bean,class指对应类的在项目的位置,name指的是类中字段的名称,value指要给对应字段要赋的值。
方法二:调用无参构造函数创建Bean
//调用无参构造函数,声明Bean
<bean id="rabbit" class="com.test.domain.Rabbit">
</bean>
如上所示,便声明了一个Bean。
基于注解创建Bean
实现步骤:
(1)类添加注解
(2)spring扫描对应的class文件创建Bean实例
实例如下:
//声明类
//添加注解
@Resource
public class Rabbit {
private String eyes;
private String legs;
public Rabbit(String eyes, String legs) {
this.eyes = eyes;
this.legs = legs;
}
public String getEyes() {
return eyes;
}
public void setEyes(String eyes) {
this.eyes = eyes;
}
public String getLegs() {
return legs;
}
public void setLegs(String legs) {
this.legs = legs;
}
}
然后spring就会根据扫描到该类,看到注解后,就自动生成对应的Bean。
JavaConfig配置Bean
实现:
(1)声明对应的方法,用于创建Bean。其中BeanId就是方法的名称。
(2)spring扫描到@Bean方法,就会根据方法,创建对应的Bean。
//声明类
public class Rabbit {
private String eyes;
private String legs;
public Rabbit(String eyes, String legs) {
this.eyes = eyes;
this.legs = legs;
}
public String getEyes() {
return eyes;
}
public void setEyes(String eyes) {
this.eyes = eyes;
}
public String getLegs() {
return legs;
}
public void setLegs(String legs) {
this.legs = legs;
}
}
//通过@Bean注解,创建对应的Bean
@Bean
public Rabbit rabbit(){
Rabbit rabbit = new Rabbit();
return userDao;
}
注意了,这里有个误区,这里通过JavaConfig方式配置Bean,里面虽然也是用了new关键词去创建一个Bean,但是什么时候去调用这个方法去实例一个对象,依旧是由IOC容器控制的,所以依旧符合IOC控制反转的理念。