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属性或者相关注解指定其作用域
- Singleton:单实例,是默认值,这种作用域标识的对象具有全局唯一性
(当把一个bean实例scope设定为singleton时,springIOC容器只会创建该对象的唯一实例,这个唯一实例会被存储到单例缓存,并且后续所有针对该对象的引用和请求,都是直接返回缓存中的这个唯一实例)
- 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时执行 * */