Spring(二)——注入对象

首先明确xml文件中的一些配置:
id和name:表示标识这个<bean>节点,name可以有特殊字符
scopebean的生存范围,有singleton(单例,默认)、prototype(非单例)、request、session、globalsession
class表示关联的类文件名称(包名 + 类名)
value注入基本数据类型或字符串
ref注入一个对象引用
factory-bean调用的工厂Bean实例
factory-method调用的工厂方法
<property>节点可以调用类中的setter方法,name对应参数名称,value对应参数值。
<constructor-arg>节点可以调用类中的构造器,name对应参数名称,value对应参数值。

一:通过构造函数创建对象。

1.无参构造函数+setter方法注入值

package com.spring.bean;
public class Person {

    private String name;
    private Integer id;
    
    public String getName() {
        return name;
    }

    public void setName(String name) {//调用这个
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {//调用这个
        this.id = id;
    }
}

XML配置:

    <!--调用了无参构造函数-->
    <bean class="com.spring.bean.Person" id="person">
   
        <property name="name" value="LiuChunfu"></property><!--调用了setter方法-->
        <property name="id" value="125"></property>
    </bean>
    
</beans>

2 利用有参构造函数直接注入

package com.mc.base.learn.spring.bean;

public class Person {

    private String name;
    private Integer id;
    
    public Person(String name, Integer id) {//调用这个
        super();
        this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
}

xml配置:

    <bean class="com.spring.bean.Person" id="person">
    <!--有参构造函数注入-->
    <!--调用有参数构造函数,通过<constructor-arg>标签注入参数-->
        <constructor-arg name="id" value="123"></constructor-arg>
        <constructor-arg name="name" value="LiuChunfu"></constructor-arg>
    </bean>
    
</beans>

二.静态工厂创建(使用静态方法)

静态工厂的对象,在容器加载的时候就被创建了。

    public static Person createPerson(Integer id,String name){
    return new Person(name,id);
    }

xml:

<!--静态的工厂方法核心是class+factory-method,直接调用类方法-->
 <bean id="person" class="com.spring.factory.PersonStaticFactory" factory-method="createPerson">
    <!--通过property标签向createPerson传递参数 -->
    <property name="name" value="LiuChunfu"></property>
    <property name="id" value="125"></property>
</bean>

三、通过实例工厂方式创建对象

实例工厂就是通过实例来调用对象,但是所得到的对象最终也是单例模式。实例工厂和静态工厂创建的对象都是单例模式,两者的区别就是创建对象的实际不同,静态工厂是在创建容器的时候就创建了,实例工厂是在调用方法的时候才创建。


public class PersonFactory {
    //非静态方法返回实例
    public Person createInstance() {
        return new Person();
    }
}

xml:

<!--创建类的工厂Bean实例-->
<bean id="personFactory" class="cn.test.util.PresonFactoryInstance"></bean>
    <!--有了实例之后才能调用成员方法-->
    <bean id="person4" factory-bean="personFactory" factory-method="createPerson">
        <property name="name" value="LiuChunfu"></property>
        <property name="id" value="125"></property>
</bean>

四.自动装配

在bean节点中, 添加autowire属性来完成自动装配的操作
1,no : 默认设置 , 表示关闭自动装配
2,byName : 通过名称完成自动装配:
例如: 当前我们容器中存在一个对象, id为book;
而刚好当前的这个person类中有一个名称为book的属性
那么这个时候, 我们的容器, 会自动完成两个对象的关联
byName 不会判断传入的参数类型是否匹配, 只要名称相同, 就会强行建立依赖关系 , 导致报错!

3, byType : 通过类型完成自动装配
例如: 当前我们容器中存在一个Book类的对象
而刚好我们当前的Person有一个Book类型的属性
我们的容器, 就会自动完成两个对象的关联。如果存在多个同类型对象则报错
4,constructor 与byType的方式类似,不同之处在于它应用于构造器参数
5,autodetect 通过bean类来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType

    原文作者:Myosotis
    原文地址: https://segmentfault.com/a/1190000013292124
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞