IOC操作Bean管理
1、什么是Bean管理
Bean管理指的是两个操作
Spring创建对象;
Spring注入属性
2、Bean管理操作有两种方式
(1)基于xml配置文件方式实现
(2)基于注解方式实现
IOC操作Bean管理(基于XML方式)
1、基于xml方式创建对象
<bean id="user" class="com.feng.pojo.User"></bean>
(1)在spring配置文件中,使用bean标签,标签添加对应的属性,就可以实现对象的创建
(2)在bean标签中有很多属性,常用的有:
- id属性:唯一标识*
- class属性:类全路径(包+类)*
(3)创建对象时,默认执行无参构造方法完成对象创建
2、基于xml方式注入属性
DI依赖注入,就是注入属性(是IOC中一种具体实现,表示依赖注入)
第一种:set方法注入属性
(1)创建类:定义属性,和set方法
(2)在spring的xml配置文件中输入以下代码
<!--使用set方法注入属性-->
<bean id="user" class="com.feng.pojo.User">
<!--使用property完成属性注入
name:类中的属性名
value:属性值
-->
<property name="name" value="Tom"></property>
<property name="sex" value="男"></property>
</bean>
第二种:有参构造注入
(1)创建类:定义属性,和全参构造
<!--使用有参构造注入属性-->
<bean id="user" class="com.feng.pojo.User">
<!--使用constructor-arg完成属性注入
name:类中的属性名
value:属性值
index:索引值(第几个属性名下标)
-->
<constructor-arg name="name" value="Tom"></constructor-arg>
<constructor-arg name="sex" value="男"></constructor-arg>
<!--<constructor-arg index="0" value="Tom"></constructor-arg>
<constructor-arg index="1" value="男"></constructor-arg>-->
</bean>
p命名空间(property)(第一种:set方法注入属性)和c命名空间(constructor-arg)(第二种:有参构造注入)(了解)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
要添加p、c命名空间在配置文件中
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
-->
<!--p命名空间注入-->
<bean id="user" class="com.feng.pojo.User" p:name="汤姆" p:age="8" scope="singleton"/>
<!--c命名空间注入-->
<bean id="user2" class="com.feng.pojo.User" c:name="杰克" c:age="18" scope="prototype"/>
</beans>
IOC操作Bean管理(XML注入其他类型属性)
1、字面量
(1)null值
<bean id="user" class="com.feng.pojo.User">
<property name="name" value="Tom"></property>
<property name="sex" value="男"></property>
<property name="address">
<null/>
</property>
</bean>
(2)属性值包含特殊符号
<bean id="user" class="com.feng.pojo.User">
<property name="name" value="Tom"></property>
<property name="sex" value="男"></property>
<property name="address">
<value><![CDATA[<<北京>>]]><value/>
</property>
</bean>
2、注入属性-外部bean
(1)创建两个类service类和dao类
(2)在service调用dao里面的方法
(3)在spring配置文件中进行配置
public class UserService {
//创建UserDao类型属性,生成set方法
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add() {
System.out.println("service add...............");userDao.update();
}
}
<!--1 service和dao对象创建-->
<bean id="userService" class="com.feng.service.UserService">
<!--注入userDao对象name属性:
类里面属性名称ref属性:创建userDao对象bean标签id值-->
<property name="userDao" ref="userDaoImpl"></property>
</bean>
<bean id="userDaoImpl" class="com.feng.dao.UserDaoImpl"></bean>
3、注入属性-内部bean
(1)一对多关系:部门和员工
(2)部门类
public class Dept {
private String dname;
public void setDname(String dname) {
this.dname = dname;
}
}
(3)员工类
public class Emp {
private String ename;
private String sex;
//员工属于某一个部门,使用对象形式表示
private Dept dept;
public void setDept(Dept dept) {
this.dept = dept;
}
public void setEname(String ename) {
this.ename = ename;
}
public void setSex(String sex) {
this.sex= sex;
}
}
(4)在spring配置文件中进行配置
<bean id="emp" class="com.feng.bean.Emp">
<!--设置两个普通属性-->
<property name="ename" value="Tom"></property>
<property name="sex" value="男"></property>
<!--设置对象类型属性-->
<property name="dept">
<bean id="dept" class="com.feng.bean.Dept">
<property name="dname" value="研发部"></property>
</bean>
</property>
</bean>
4、注入属性-级联赋值
第一种写法:
<bean id="emp" class="com.feng.bean.Emp">
<!--设置两个普通属性-->
<property name="ename" value="Tom"></property>
<property name="sex" value="男"></property>
<!--级联赋值-->
<property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="com.feng.bean.Dept">
<property name="dname" value="财务部"></property>
</bean>
第二种写法:
<bean id="emp" class="com.feng.bean.Emp">
<!--设置两个普通属性-->
<property name="ename" value="Tom"></property>
<property name="sex" value="男"></property>
<!--级联赋值-->
<property name="dept" ref="dept"></property><!--这个必须有-->
<!--要配合get方法使用-->
<property name="dept.dname" value="研发部"></property>
</bean>
<bean id="dept" class="com.feng.bean.Dept">
<property name="dname" value="财务部"></property><!--这个可以没有-->
</bean>
public Dept getDept() {
return dept;
}
5、注入属性-集合
(1)注入数组类型属性
(2)注入List集合类型属性
(3)注入Map集合类型属性
(3)注入Set集合类型属性
public class Stu {
//数组
private String[] courses;
//list集合
private List<String> list;
//map集合
private Map<String,String> map;
//set集合
private Set<String> set;
public void setCourses(String[] courses) {
this.courses = courses;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void test(){
System.out.println(Arrays.toString(courses));
System.out.println(list);
System.out.println(map);
System.out.println(set);
}
}
<bean id="stu" class="com.feng.bean.Stu">
<property name="courses">
<array>
<value>语文</value>
<value>数学</value>
<value>英语</value>
</array>
</property>
<property name="list">
<list>
<value>小明</value>
<value>小花</value>
<value>小张</value>
</list>
</property>
<property name="map">
<map>
<entry key="1" value="Java"></entry>
<entry key="2" value="Python"></entry>
</map>
</property>
<property name="set">
<set>
<value>HTML</value>
<value>JSP</value>
</set>
</property>
</bean>
(5)在集合中设置对象型值
//新建类
public class Course {
private String cname;
public void setCname(String cname) {
this.cname = cname;
}
@Override
public String toString() {
return "Course{" +
"cname='" + cname + '\'' +
'}';
}
}
//在Stu类中添加
private List<Course> course;
public void setCourse(List<Course> course) {
this.course = course;
}
<bean>
<property name="course">
<list>
<!--引入对象id-->
<ref bean="course1"></ref>
<ref bean="course2"></ref>
<ref bean="course3"></ref>
</list>
</property>
</bean>
<!--创建多个course对象-->
<bean id="course1" class="com.feng.bean.Course">
<property name="cname" value="Java基础"></property>
</bean>
<bean id="course2" class="com.feng.bean.Course">
<property name="cname" value="Spring框架"></property>
</bean>
<bean id="course3" class="com.feng.bean.Course">
<property name="cname" value="MyBatis框架"></property>
</bean>
(6)把集合部分提取出来
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!--
引入util命名空间
xmlns:util="http://www.springframework.org/schema/util"
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-->
<util:list id="list">
<value>小明</value>
<value>小花</value>
<value>小张</value>
</util:list>
<bean id="stu" class="com.feng.bean.Stu">
<!--把list集合单独抽取出来-->
<property name="list" ref="list"></property>
</bean>
</beans>