目录
一:概述
Spring的BeanFactory的开发步骤如下:
- 程序代码-----》第三方-----》配置清单---》Bean类
- 程序代码-----》第三方-----》配置文件---》UserServicelmpl/UserDaoImpl
BeanFactory,以Factory结尾,表示它是一个工厂类(接口), 它负责生产和管理bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
BeanFactory只是个接口,并不是IOC容器的具体实现,但是Spring容器给出了很多种实现,如 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,其中**XmlBeanFactory就是常用的一个,该实现将以XML方式描述组成应用的对象及对象间的依赖关系**。XmlBeanFactory类将持有此XML配置元数据,并用它来构建一个完全可配置的系统或应用。
它为其他具体的IOC容器提供了最基本的规范,例如DefaultListableBeanFactory,XmlBeanFactory,ApplicationContext 等具体的容器都是实现了BeanFactory,再在其基础之上附加了其他的功能。
原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。ApplicationContext接口,它由BeanFactory接口派生而来。现在一般使用ApplicationnContext,其不但包含了BeanFactory的作用,同时还进行更多的扩展。
BeanFactory实际上是实例化,配置和管理众多bean的容器。 这些bean通常会彼此合作,因而它们之间会产生依赖。 BeanFactory使用的配置数据可以反映这些依赖关系中,一个BeanFactory可以用接口org.springframework.beans.factory.BeanFactory表示, 这个接口有多个实现。 最常使用的的简单的BeanFactory实现是org.springframework.beans.factory.xml.XmlBeanFactory。
几乎所有被BeanFactory管理的用户代码都不需要知道BeanFactory, 但是BeanFactory还是以某种方式实例化。
二:快速入门
-
导入Spring的jar包或Maven坐标;
<!--Spring核心-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.23</version>
</dependency>
2.定义UserService接口及其UserServicelmpl实现类;
public interface IUserService {}
public class UserServiceImpl implements IUserService {}
3.创建beans.xml配置文件, 将UserServiceImpl的信息配置到该xml中;
<bean id="userService" class="com.tangyuan.service.impl.UserServiceImpl"></bean>
4.编写测试代码, 创建BeanFactory, 加载配置文件, 获取UserService实例对象。
//创建工厂对象
DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();
//创建读取器(xml文件)
XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader(beanFactory);
//读取配置文件给工厂
reader.loadBeanDefinitions("beans.xml");
//根据id获取Bean实例对象
IUserService userService = (IUserService) beanFactory.getBean("userService");
System.out.println(userService);//com.tangyuan.service.impl.UserServiceImpl@2a18f23c
上面使用BeanFactory完成了loC思想的实现, 下面去实现以下DI依赖注入:
-
定义UserDao接口及其UserDaolmpl实现类;
public interface IUserService {}
public class UserServiceImpl implements IUserService {}
2.修改UserServicelmpl代码, 添加一个setUserDao(UserDao userDao) 用于接收注入的对象;
//BeanFactory去调用该方法 从容器中获得userDao设置到此处
public void setUserDao(UserDao userDao) {
System.out.println("BeanFactory去调用该方法获得userDao设置到此处"+userDao);
}
3.修改beans.xml配置文件, 在UserDaolmpl的<bean>中嵌入<property>配置注入;
<!--配置UserServiceImpl-->
<bean id="userService" class="com.tangyuan.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
- name---->与setUserDao形成对应,大写变成小写
- ref------》引入Bean的id
4.修改测试代码, 获得UserService时, setUserService方法执行了注入操作。
//创建工厂对象
DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();
//创建读取器(xml文件)
XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader(beanFactory);
//读取配置文件给工厂
reader.loadBeanDefinitions("beans.xml");
//根据id获取Bean实例对象
IUserService userService = (IUserService) beanFactory.getBean("userService");