Spring--3.bean管理 控制反转(xml)

来源:互联网 发布:王者荣耀知乎 编辑:程序博客网 时间:2024/06/18 12:06

1       实例化的方式

1.1  第一种 使用类的无参数构造创建(重点)

 

1.2  第二种 使用静态工厂创建

       调用静态工厂方法创建 Bean是将对象创建的过程封装到静态方法中. 当客户端需要对象时, 只需要简单地调用静态方法, 而不同关心创建对象的细节.

       创建静态的方法,返回类对象

       class 属性:指向静态工厂方法的全类名

       factory-method 属性:指向静态工厂方法的名字

       constructor-arg 属性:如果工厂方法需要传入参数,用其配置参数

 

 

1.3  第三种 使用实例工厂创建

       实例工厂方法: 将对象的创建过程封装到另外一个对象实例的方法里. 当客户端需要请求对象时, 只需要简单的调用该实例方法而不需要关心对象的创建细节.

       要声明通过实例工厂方法创建的 Bean

1.        在 bean 的factory-bean 属性里指定拥有该工厂方法的 Bean

2.        在 factory-method 属性里指定该工厂方法的名称

3.        使用 construtor-arg 元素为工厂方法传递方法参数

 

       创建不是静态的方法,返回类对象

       factory-bean 属性:指向实例工厂方法的全类名

    factory-method 属性:指向静态工厂方法的名字

    constructor-arg 属性:如果工厂方法需要传入参数,用其配置参数

 

 

1.4  第四种 factorybean

Spring 中有两种类型的 Bean, 一种是普通Bean,另一种是工厂Bean, 即FactoryBean.

bean-factorybean.xml

<!--       通过FactoryBean 来配置 bean 的实例       class:指向 FactoryBean 的全类名       property:配置 FactoryBean 的属性       但实际返回的实例确实 FactoryBean 的 getObject() 的方法返回的实例     -->    <bean id="car"class="spring.factorybean.CarFactoryBean">       <property name="brand"value="福特"></property>    </bean> 

       工厂Bean 跟普通Bean不同,其返回的对象不是指定类的一个实例, 其返回的是该工厂 Bean 的 getObject 方法所返回的对象

CarFactoryBean

//自定义 FactoryBean 必须实现FactoryBean接口public class CarFactoryBean implements FactoryBean<Car>{    private String brand;       public void setBrand(String brand) {       this.brand = brand;    }     @Override    public Car getObject() throws Exception {       //返回 bean 对象       return new Car(brand ,500000);    }     @Override    public Class<?> getObjectType() {       //返回 bean 类型       return Car.class;    }     @Override    public boolean isSingleton() {       return true;    }

 

2       Bean 自动装配—这里用于创建对象

2.1  三种方式

       SpringIOC 容器可以自动装配 Bean.需要做的仅仅是在 <bean> 的 autowire 属性里指定自动装配的模式

2.1.1      byType(根据类型自动装配):

       若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配.

 

2.1.2      byName(根据名称自动装配):

       必须将目标 Bean 的名称和属性名设置的完全相同.

<bean id="address" class="spring.autowire.Address"p:city="北京" p:street="天安门"></bean>    <!-- <beanid="address2" class="spring.autowire.Address" p:city="北京" p:street="天安门"></bean>-->     <bean id="car"class="spring.autowire.Car" p:brand="奥迪" p:price="30000"></bean>     <!-- 可以使用自动装配autowire    byname : 名字匹配,上面id名必须和实体类匹配    byType:类型匹配,一个以上抛异常eg:address和address2    -->    <bean id="person"class="spring.autowire.Person" p:name="老兰" autowire="byType"></bean>
 

2.1.3      constructor(通过构造器自动装配):

       当 Bean 中存在多个构造器时, 此种自动装配方式将会很复杂. 不推荐使用

 

2.2  缺点

       在 Bean 配置文件里设置 autowire 属性进行自动装配将会装配 Bean 的所有属性. 然而, 若只希望装配个别属性时, autowire 属性就不够灵活了.

       autowire属性要么根据类型自动装配, 要么根据名称自动装配, 不能两者兼而有之.

       一般情况下,在实际的项目中很少使用自动装配功能,因为和自动装配功能所带来的好处比起来,明确清晰的配置文档更有说服力一些

 

 

 

 

 

 

 

 

原创粉丝点击