IOC容器-实例化Bean、注入的4种配置方式(无注解方式)

有java类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Addr {
    private String addr;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private Integer age;
   private Addr addr; //地址信息
}

第一种:基于Get/Set 框架使用反射创建对象,通过配置的class全限定名

<!-- get set-->
<bean id="UserInfo" class="com.spring.domain.User">
     <property name="name" value="孙旺"></property>
     <property name="age" value="18"></property>
     <property name="addr" ref="AddrInfo"></property>
</bean>
<bean id="AddrInfo" class="com.spring.domain.Addr">
    <property name="addr" value="中国山东"></property>
</bean>
property 标签为实体中的属性
  -- name 属性为实体属性的变量名
  -- value 属性为属性的值
  -- ref 当注入属性为对象时使用ref注入

第二种:使用静态工厂方法创建对象

工厂类

public class BeanFactory {
    public static User getUser() { return new User("小王", 19, new Addr("中国山东")); } 
}

此工静态工厂类的方法必须为static静态

<bean id="UserInfo2" class="com.spring.factory.BeanFactory" factory-method="getUser"></bean>
factory-method -- 静态工厂中,创建对象的方法
class -- 静态工厂的类的全限定名称

第三种:使用实例工厂方法创建对象

public class BeansFactory {
    public User getUser() {
        return new User("小王", 19, new Addr("中国山东"));
    }
}
<bean id="UserFactory" class="com.spring.factory.BeansFactory"></bean>
<bean id="UserInfo3" factory-bean="UserFactory" factory-method="getUser"></bean>
factory-bean -- 属性: 设置实例工厂对象的引用
factory-method -- 属性 : 设置实例工厂对象的方法,用于创建对象

第四种:构造函数注入<constructor-arg>

<!--基于 构造方法-->
<bean id="BeanUser" class="com.spring.domain.UserBean">
   <constructor-arg name="name" value="小孙"></constructor-arg>
   <constructor-arg name="age" value="9"></constructor-arg>
   <constructor-arg name="list">
       <array>
          <value>s1</value>
          <value>s2</value>
      </array>
   </constructor-arg>
</bean>

扩展 

上面根据构造注入时注入了一个list,下面扩展

get/set 方法的复杂类型注入(构造注入时相同)

可以注入任意的数据类型:

  • 基本数据类型及其包装类

  • 引用数据类型【所有写得类】枚举、数组、集合【Map、List、Set】

@Data
public class NewUser {
    //引用数据类型
    private Addr addr;

    //声明成员变量
    private String name;
    private String age;

    //多种数据类型成员变量
    private String[] myStrs;//数组
    private List<String> myList;//list集合
    private Set<String> mySet;//set集合
    private Map<String,String> myMap;//map
}
    <!--复杂映射-->
    <bean id="NewUser" class="com.spring.domain.NewUser">
        <property name="addr" ref="newUserAddr"></property>
        <property name="name" value="小溪西"></property>
        <property name="age" value="99"></property>
        <!--list-->
        <property name="myList">
            <array>
                <value>list1</value>
                <value>list2</value>
            </array>
        </property>
        <!-- map -->
        <property name="myMap">
            <map>
                <entry key="k1" value="v1"></entry>
                <entry key="k2" value="v2"></entry>
            </map>
        </property>
        <!-- set -->
        <property name="mySet">
            <set>
                <value>s1</value>
                <value>s2</value>
            </set>
        </property>
        <!-- arr[] -->
        <property name="myStrs">
            <array>
                <value>[]1</value>
                <value>[]2</value>
            </array>
        </property>
    </bean>
    <bean id="newUserAddr" class="com.spring.domain.Addr">
        <property name="addr" value="中国西藏"></property>
    </bean>

 

posted @ 2020-09-05 21:06  一半人生  阅读(371)  评论(0编辑  收藏  举报