三Spring中Bean的基础配置1

来源:互联网 发布:html转xml python 编辑:程序博客网 时间:2024/06/07 21:02

配置bean的方式通常有2种:

1.通过XML方式进行配置

2.通过注解的方式进行配置

还是举上边的那个例子:

<bean id="cat1" class="beans.Cat">         <property name="name" value="狗子"></property>  </bean>  
class:bean的全类名,通过反射的方式在IOC容器中创建Bean.

id:表示容器中的bean,id值唯一

Spring 提供了两种类型的 IOC 容器实现. 
BeanFactory: IOC 容器的基本实现.
ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口.
BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;ApplicationContext 面向使用 Spring 框架的开发者,

几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory
无论使用何种方式, 配置文件是相同的.
ApplicationContext是一个接口,有两个主要实现类:

ClassPathXmlApplicationContext:从类路径下加载配置文件
–FileSystemXmlApplicationContext:从文件系统中加载配置文件


ConfigurableApplicationContext 扩展于 ApplicationContext,新增加两个主要方法:refresh() 和 close(), 让 ApplicationContext 具有启动、刷新和关闭上下文的能力。

ApplicationContext 在初始化上下文时就实例化所有单例的 Bean。
WebApplicationContext 是专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作。

通过WebApplicationContext 的getBean()方法可以从 IOC 容器中获取 到Bean,这里主要有2中重载的方法:

1.getBean("id号")

2.getBean("类名")-要求IOC容器中只能有一个这个Bean


Spring 支持 3 种依赖注入的方式
-属性注入(Bean总必须有无参数的构造器
属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象
属性注入使用 <property> 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 <value> 子节点指定属性值 
属性注入是实际应用中最常用的注入方式

-构造器注入
通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。
构造器注入在 <constructor-arg> 元素里声明属性, <constructor-arg> 中没有 name 属性
考虑如下的情形:
public class Dog {    private String name;    private int age;    private double weigth;    private int bitenums;    public Dog(String name, int age, double weigth) {        this.name = name;        this.age = age;        this.weigth = weigth;    }    public Dog(String name, int age, int bitenums) {        this.name = name;        this.age = age;        this.bitenums = bitenums;    }    @Override    public String toString() {        return "Dog{" +                "name='" + name + '\'' +                ", age=" + age +                ", weigth=" + weigth +                ", bitenums=" + bitenums +                '}';    }}
有俩个构造方法,我们打算分别使用这俩个构造方法来给属性赋值:
下面是Bean配置:
<bean id="dog1" class="beans.Dog">        <constructor-arg value="dogge" index="0"></constructor-arg>        <constructor-arg value="20" index="1"></constructor-arg>        <constructor-arg value="200" index="2"></constructor-arg>    </bean>    <!--这里打算使用第二个构造方法-->    <bean id="dog2" class="beans.Dog">        <constructor-arg value="ZZD" ></constructor-arg>        <constructor-arg value="20" ></constructor-arg>        <constructor-arg value="10" ></constructor-arg>    </bean>
主程序中进行调用:
Dog dog1= (Dog) ctx.getBean("dog1");        System.out.println(dog1.toString());        Dog dog2= (Dog) ctx.getBean("dog2");        System.out.println(dog2.toString());

输出结果:

可以看到第二个构造函数其实并没有起到作用,都匹配到第一个构造函数上去了,
正确的配置方式:
<bean id="dog1" class="beans.Dog">        <constructor-arg value="dogge" type="java.lang.String"></constructor-arg>        <constructor-arg value="20" type="int"></constructor-arg>        <constructor-arg value="200" type="double"></constructor-arg>    </bean>    <!--这里打算使用第二个构造方法-->    <bean id="dog2" class="beans.Dog">        <constructor-arg value="ZZD" type="java.lang.String" ></constructor-arg>        <constructor-arg value="20" type="int"></constructor-arg>        <constructor-arg value="10" type="int"></constructor-arg>    </bean>




-工厂方法注入(很少使用,不推荐)



0 0