spring-依赖注入之类类型、数组、list、map赋值、 Bean作用域和生命周期

1.为类类型进行赋值(以用户和所属的班级为例子)

User和Class类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer user_id;
    private String user_name;
    private String gender;
    private Integer age;
    private Class aClass;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Class implements Serializable {
    private Integer class_id;
    private String class_name;
}

1.1通过ref标签进行

  <bean id="User" class="com.chen.pojo.User">
                <property name="user_id" value="1001"></property>
                <property name="user_name" value="cyc"></property>
                <property name="gender" value="男"></property>
                <property name="age" value="18"></property>
                <property name="AClass" ref="classone"></property>
        </bean>
<!--    ref引用当前IOC容器中的某个bean的id为对象进行赋值-->
    <bean id="classone" class="com.chen.pojo.Class">
        <property name="class_id" value="2010"></property>
        <property name="class_name" value="软件工程"></property>
    </bean>

 1.2内部bean

        <bean id="User" class="com.chen.pojo.User">
                <property name="user_id" value="1001"></property>
                <property name="user_name" value="cyc"></property>
                <property name="gender" value="男"></property>
                <property name="age" value="18"></property>
                <property name="AClass">
<!--内部bean只能在当前bean的内部使用,不能直接通过IOC容器直接获取-->
                    <bean id="classtwo" class="com.chen.pojo.Class">
                        <property name="class_id" value="2010"></property>
                        <property name="class_name" value="软件工程"></property>
                    </bean>
                </property>
        </bean>
 @Test
    public void test(){
        //获取ioc容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = ioc.getBean(User.class);
        System.out.println(user);
    }
}

2.为数组类型进行赋值

在用户实体类中添加一个数组类型

    private String hobby[];
 <property name="hobby">
<!--                数组进行赋值为字面量类型的使用value标签 如果是引用类型的通过ref标签-->
                <array>
                    <value>唱</value>
                    <value>跳</value>
                    <value>rap</value>
                </array>
            </property>
        </bean>

3.为list集合属性赋值

在Class类中添加对应属性

    private List<User> users;

3.1内部list

    <bean id="Class" class="com.chen.pojo.Class">
        <property name="class_id" value="2010"></property>
        <property name="class_name" value="软件工程"></property>
        <property name="users">
            <list>
                <ref bean="User"></ref>
            </list>
        </property>
    </bean>

3.2list的bean的引用

  <bean id="Class" class="com.chen.pojo.Class">
        <property name="class_id" value="2010"></property>
        <property name="class_name" value="软件工程"></property>
        <property name="users" ref="userList"></property>
    </bean>
    <util:list id="userList">
        <ref bean="User"></ref>
    </util:list>
 @Test
    public void test(){
        //获取ioc容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
        Class bean = ioc.getBean(Class.class);
        System.out.println(bean);
    }
}

4.map集合赋值

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
    private Integer teacher_id;
    private String teacher_name;
}

在User中添加map集合

    private Map<String,Teacher> teacherMap;

4.1通过map标签

 <property name="teacherMap">
        <map>
            <entry key="1001" value-ref="teacher01"></entry>
            <entry key="1002" value-ref="teacher02"></entry>
        </map>
    </property>
</bean>
<bean id="teacher01" class="com.chen.pojo.Teacher">
    <property name="teacher_id" value="1001"></property>
    <property name="teacher_name" value="漳卅"></property>
</bean>
<bean id="teacher02" class="com.chen.pojo.Teacher">
    <property name="teacher_id" value="1002"></property>
    <property name="teacher_name" value="李四"></property>
</bean>

4.2 util:map

        <property name="teacherMap" ref="teamap">

        </property>
    </bean>
    <util:map id="teamap">
        <entry  key="1001" value-ref="teacher01"></entry>
        <entry  key="1002" value-ref="teacher02"></entry>
    </util:map>
    <bean id="teacher01" class="com.chen.pojo.Teacher">
        <property name="teacher_id" value="1001"></property>
        <property name="teacher_name" value="漳卅"></property>
    </bean>
    <bean id="teacher02" class="com.chen.pojo.Teacher">
        <property name="teacher_id" value="1002"></property>
        <property name="teacher_name" value="李四"></property>
    </bean>

5.bean作用域

Bean对象的作用域(单例和多例)

在spring容器中管理的bean对象,可以通过scope属性或者相关注解指定其作用域

  1. Singleton:单实例,是默认值,这种作用域标识的对象具有全局唯一性

  (当把一个bean实例scope设定为singleton时,springIOC容器只会创建该对象的唯一实例,这个唯一实例会被存储到单例缓存,并且后续所有针对该对象的引用和请求,都是直接返回缓存中的这个唯一实例)

  1. Prototype:多实例,这种作用域标识的对象每次获取都会创建新的对象

(当把一个bean实例scope设定为prototype作用域,springIOC容器会在每次获取当前bean对象,都会产生一个新的bean对象,相当于的new的操作)

为什么用单例或者多例?

使用单例,在没有线程安全问题的前提下,没必要每一个请求都去创建新的对象,这样会浪费CPU,还浪费内存

使用多例,是为了防止并发问题,即一个请求改变了对象的状态,此时对象又处理了另一个请求,而之前的请求对对象的改变导致另一个请求作出了错误的处理

    <bean id="class01" class="com.chen.pojo.Class" scope="prototype" >
        <property name="class_id" value="10"></property>
        <property name="class_name" value="软件开发"></property>
    </bean>
        Class aclass = ioc.getBean(Class.class);
        Class aclass1 = ioc.getBean(Class.class);
        System.out.println(aclass == aclass1);

6.bean生命周期

/*
* 1实例化
* 2依赖注入
* 3初始化   init-method=""属性指定初始化方法
* 4IOC容器关闭销毁,需要通过  destroy-method=""指定销毁的方法
* 注意:bean作用域为单例时,生命周期前三个步骤会在获取IOC容器时执行
* bean作用域为多例时,生命周期前三个步骤会在获取bean时执行
* */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值