*一、IOC接口(BeanFactory)
**
1、IOC思想基于IOC容器,IOC容器底层就是对象工厂
2、Spring提供IOC容器实现两种方式(两个接口)
(1)BeanFactory
IOC容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用
加载配置文件时不会创建对象,在获取对象(使用)才去创建对象
(2)ApplicationContext
BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用
加载配置文件时就会把配置文件对象进行创建
3、ApplicationContext接口的实现类
二、IOC操作Bean管理(基于xml)
1、基于XML创建对象
<!--<配置User对象创建>-->
<bean id="user" class="com.study.user.User"></bean>
常用的属性:
id属性:唯一标识
class属性:类全路径(包类路径)
2、注入属性的两种方式
- 第一种方式:使用set方法注入
/**
* 演示进行依赖注入的方式
*/
public class Book {
//创建属性
private String bName;
private String bAuthor;
//set注入
public void setbName(String bName) {
this.bName = bName;
}
public void setbAuthor(String bAuthor) {
this.bAuthor = bAuthor;
}
}
- 第二种方式:使用有参数的构造函数注入
①、创建类、定义属性,同时定义有属性值的构造函数
/**
*演示依赖注入的方式
*/
public class Order {
private String oName;
private String address;
//使用有参数的构造函数进行属性注入
public Order(String oName, String address) {
this.oName = oName;
this.address = address;
}
}
②、编写xml文件,并在其中配置属性值
<bean id="order" class="com.study.order.Order">
<constructor-arg name="oName" value="Water"></constructor-arg>
<constructor-arg name="address" value="China"></constructor-arg>
</bean>
三、操作Bean管理(基于注解)
1、注入属性-外部Bean
①、创建两个类UserService类和UserDao类
②、在UserService调用UserDao里面的方法
③、在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......");
//在service中调用dao中的方法
userDao.update();
}
}
bean.xml:
<!--<1、将service和da对象进行创建>-->
<bean id="userService" class="com.study.service.UserService">
<!--<注入userDao对象>-->
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="com.study.dao.UserDaoImpl"></bean>
测试程序:
public class TestBean {
@Test
public void testAdd(){
//1、加载spring配置文件
ApplicationContext context=new
ClassPathXmlApplicationContext("bean.xml");
//2、获取配置创建的对象
UserService userService=context.getBean("userService", UserService.class);
System.out.println(userService);
userService.add();
}
}
2、注入属性-内部Bean
最常见的使用内部bean的情况为一对多的情况
-第一步首先建立两个类,如部门类和员工类(表现为一对多的关系)
//Department类*(部门)
public class Dept {
private String dName;
public void setdName(String dName) {
this.dName = dName;
}
@Override
public String toString() {
return "Dept{" +
"dName='" + dName + '\'' +
'}';
}
}
//Emplement类(员工)
public class Emp {
private String eName;
private String gender;
//员工属于某个部门,使用对象形式表示
private Dept dept;
public void setDept(Dept dept) {
this.dept = dept;
}
public void seteName(String eName) {
this.eName = eName;
}
public void setGender(String gender) {
this.gender = gender;
}
public void print(){
System.out.println(eName+"::"+gender+"::"+dept);
}
}
- 在配置文件中进行内部bean的配置:
<!--<内部bean>-->
<bean id="emp" class="com.study.bean.Emp">
<!--<设置两个普通属性>-->
<property name="eName" value="lucy"></property>
<property name="gender" value="女"></property>
<!--<设置对象类型属性>-->
<property name="dept">
<bean id="dept" class="com.study.bean.Dept">
<property name="dName" value="安保部"></property>
</bean>
</property>
</bean>
- 第三步,编写测试方法
@Test
public void testBean3(){
//1、加载spring配置文件
ApplicationContext context=
new ClassPathXmlApplicationContext("bean.xml");
//2、获取配置,创建对象
Emp emp=context.getBean("emp",Emp.class);
System.out.println(emp);
emp.print();
}
3、注入属性-级联赋值
- 上面的部门类和员工类不做任何改变,只需修改xml文件和测试程序即可实现。
bean.xml:
<!--<级联赋值>-->
<bean id="emp" class="com.study.bean.Emp">
<property name="eName" value="luck"></property>
<property name="gender" value="男"></property>
<!--<级联赋值>-->
<property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="com.study.bean.Dept">
<property name="dName" value="财务部"></property>
</bean>
测试程序:
@Test
public void testBean3_1(){
ApplicationContext context=
new ClassPathXmlApplicationContext("bean.xml");
Emp emp=context.getBean("emp",Emp.class);
System.out.println(emp);
emp.print();
}