前言
上一篇我们学习了如何建立spring项目,接下来我们学习spring bean的配置,这篇我们主要学习:
1、在 Spring 的 IOC 容器里配置 Bean
2、从 IOC 容器中获取 Bean
3、依赖注入的方式
一、在 Spring 的 IOC 容器里配置 Bean
在 xml 文件中通过 bean 节点来配置 bean
如图id:就是Bean的名称值得注意的是,id在 IOC 容器中必须是唯一的,若id没有指定,Spring自动将权限定性类名作为Bean的名字,当然,id可以指定多个名字,名字之间可用逗号、分号、或空格分隔。
在Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用。Spring 提供了两种类型的 IOC 容器实现:
BeanFactory: IOC 容器的基本实现.
ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口.
总结:BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory,无论使用何种方式, 配置文件时相同的。
二、从 IOC 容器中获取 Bean
调用 ApplicationContext 的 getBean() 方法,具体的查看我们上一篇test类中的代码:
public class test {
public static void main(String args[]){
//1创建String的IOC容器
//ApplicationContext 代表IOC 容器接口
//ClassPathXmlApplicationContext:ApplicationContext接口的实现类,该实现类从路径下加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2从IOC容器中获取Bean实例
person person= (person) context.getBean("person");
//3调用方法
System.out.println(person.toString());
}
}
三、依赖注入的方式
Spring 支持 3 种依赖注入的方式:
1、属性注入
2、构造器注入
3、工厂方法注入(很少使用,不推荐)
1、属性注入
属性注入即通过setter方法注入Bean 的属性值或依赖的对象
属性注入使用<property>元素, 使用 name 属性指定 Bean 的属性名称,value属性或 <value>子节点指定属性值
属性注入是实际应用中最常用的注入方式,我们上一篇里面用的就是属性注入。
<!-- 属性注入bean的依赖对象-->
<bean id="person"
class="entity.person">
<property name="name" value="张三"></property>
<property name="age" value="18"></property>
</bean>
2、构造器注入
通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。
构造器注入在 <constructor-arg> 元素里声明属性, <constructor-arg> 中没有 name 属性,
我们在之前的项目添加一个对象car类,在类里面添加一个构造器。
完整代码如下:
package entity;
public class car {
private String brand;
private String corp;
private double price;
private int maxSpeed;
public car(String brand,String corp,double price){
super();
this.brand=brand;
this.corp=corp;
this.price=price;
}
@Override
public String toString(){
return "Car[brand ="+brand+",corp ="+corp+ ",price ="+price+",maxSpeed ="+maxSpeed+"]";
}
}
然后在applicationContext.xml中插入:
<!-- 构造器注入bean的依赖对象-->
<bean id="car" class="entity.car">
<constructor-arg value="Audi"></constructor-arg>
<constructor-arg value="shanghai"></constructor-arg>
<constructor-arg value="23" ></constructor-arg>
</bean>
然后再test中加入:
car car=(car) context.getBean("car");
System.out.println(car.toString());
最后运行结果:
使用构造器注入属性值可以指定参数的位置和类型。以区分重载的构造器!
我们来实验一把,在car类中加入一个构造器:
public car(String brand,String corp,int maxSpeed)
{
super();
this.brand=brand;
this.corp=corp;
this.maxSpeed=maxSpeed;
}
然后在applicationContext.xml中插入:
<!-- 构造方法注入bean的依赖对象-->
<bean id="car" class="entity.car">
<constructor-arg value="Audi"></constructor-arg>
<constructor-arg value="shanghai"></constructor-arg>
<constructor-arg value="23" type="double"></constructor-arg>
</bean>
<!-- 使用构造器注入属性值可以指定参数的位置和参数的类型!以区分重载的构造器!-->
<bean id="car2" class="entity.car">
<constructor-arg value="Baoma" index="0"></constructor-arg>
<constructor-arg value="shanghai" index="1"></constructor-arg>
<constructor-arg value="190" type="int"></constructor-arg>
</bean>
在测试类中加入:
car=(car) context.getBean("car2");
System.out.println(car.toString());
最后运行结果:
3、工厂方法注入
虽然工厂注入方式不常用,但是有时候,静态工厂方法是实例化对象的唯一方法
新建一个类:
public class DBUtil {
//构造方法私有化
private DBUtil(){}
//创建一个对象实例
private static DBUtil instance = new DBUtil();
//获取对象
public static DBUtil getInstance(){
return instance;
}
public void test(){
System.out.println("调用DBUtil的test方法");
}
}
然后在applicationContext.xml中插入:
<bean id="dbUtils" class="entity.DBUtil" factory-method="getInstance"></bean>
在测试类中加入:
DBUtil dbUtil = context.getBean("dbUtils",DBUtil.class);
dbUtil.test();
运行结果:
结语
因为是边学边写的,如有错误的地方,希望大家能指导一下,一起学习进步!