Spring 作为一种IOC容器最大的目的就是降低组件与组件之间的依赖关系。而BeanFactory作为整个Spring IOC容器的核心使用了一种统一的方法来装配所有的应用对象,通过Java的反射机制和依赖注入(Dependency Injection)来实现这一装配过程,使受之管理的对象无需知道Spring的存在(受管对象甚至不用import 任何Spring的class),同时也降低了组件间的依赖程度,同时受管对象的生命周期由BeanFactory来统一管理,开发者就不用实现大量的自制的工厂Singleton。
注:以下那些受Spring IOC容器即BeanFactory控制管理的对象简称bean对象
一. BeanFactory
作为整个Spring IOC容器核心Interface BeanFacotry被放在包 org.springframework.beans.factory中,这是一个非常简单的接口,如果Spring现有的BeanFactory的实现无法满足你的要求(这种情况应该不多J),你可以很容易创建自己的一个实现。
public interface BeanFactory {
Object getBean(String name) throws BeansException;
Object getBean(String name, Class requiredType) throws BeansException;
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name) throws NoSuchBeanDefinitionException;
}
这就是BeanFactory的代码,总共有5个函数所组成,2个getBean函数提供根据String类型的名称来寻找受BeanFactory的bean对象,区别在于其中一个函数提供了类型检测的功能,来检测取得bean对象是否为所需的类型,如果类型不符将抛出一个BeanNotOfRequiredTypeException的异常。
函数isSingleton 则用来判断BeanFactory的bean对象被定义为Singleton还是Prototype。如果被定义为Singleton的话,在BeanFactory的生命周期内,所有对getBean的调用将返回一个bean对象的实例引用,如果是Prototype则每次调用getBean对会创建一个独立的对象实例。
如果一个bean对象被定义了别名,那么函数getAliases就可以用来取得该bean对象的所有别名。
二. 使用BeanFactory
前面介绍了Spring IOC容器的核心Interface BeanFactory,现在我们通过一个的例子来简单的了解如何使用BeanFactory。这个例子中,使用了BeanFactory最常用的几个实现之一XMLBeanFactory,这个BeanFactory实现是通过XML来组装bean对象的(当然BeanFactory 还有一个实现是通过Java配置文件.propeties来组装bean对象)。
例子有1个Interface 和3个Class所组成,先来看Interface:
package net.hashmap.spring.ioc.example.dao;
public interface AbstractDAO {
public void insert();
public void update();
public void delete();
public void get();
}
AbstractDAO这个接口定义了4个访问数据库的方法,然后来看看AbstractDAO的2个实现HibernateDAO和JDBCDAO。
package net.hashmap.spring.ioc.example.dao.support;
import net.hashmap.spring.ioc.example.dao.AbstractDAO;
public class HibernateDAO implements AbstractDAO {
public void insert() {
System.out.println("This is HibernateDAO.insert");
}
public void update() {
System.out.println("This is HibernateDAO.update");
}
public void delete() {
System.out.println("This is HibernateDAO.delete");
}
public void get() {
System.out.println("This is HibernateDAO.get");
}
}
package net.hashmap.spring.ioc.example.dao.support;
import net.hashmap.spring.ioc.example.dao.AbstractDAO;
public class JdbcDAO implements AbstractDAO {
public void insert() {
System.out.println("This is JdbcDAO.insert");
}
public void update() {
System.out.println("This is JdbcDAO.update");
}
public void delete() {
System.out.println("This is JdbcDAO.delete");
}
public void get() {
System.out.println("This is JdbcDAO.get");
}
}
这2个Class都实现了AbstractDAO,但是一个提供了通过Hibernate来访问数据库,而另外一个则使用了JDBC(具体和数据库交互的代码,不在讨论范畴内)。
现在再来看看具体的模拟业务逻辑的Class
package net.hashmap.spring.ioc.example.logic;
import net.hashmap.spring.ioc.example.dao.AbstractDAO;
public class LogicBusinessImpl {
private AbstractDAO _dao;
public AbstractDAO getDao() {
return _dao;
}
public void setDao(AbstractDAO _dao) {
this._dao = _dao;
}
public void BusinessHandle() {
_dao.insert();
_dao.get();
_dao.update();
_dao.delete();
}
}
LogicBusinessImpl定义了一个方法getDao,这个getter就是用来给IOC容器进行依赖注入的。
接着就是相当重要的组装bean对象的xml。
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="hibernatedao" class="net.hashmap.spring.ioc.example.dao.support.HibernateDAO" />
<bean id="jdbcdao" class="net.hashmap.spring.ioc.example.dao.support.JdbcDAO" />
<bean id="HLogicImpl" class="net.hashmap.spring.ioc.example.logic.LogicBusinessImpl">
<property name="dao">
<ref local="hibernatedao" />
</property>
</bean>
<bean id="JLogicImpl" class="net.hashmap.spring.ioc.example.logic.LogicBusinessImpl">
<property name="dao">
<ref local="jdbcdao" />
</property>
</bean>
</beans>
Xml文件里总共组装了2个LogicBusinessImpl,一个的使用HibernateDAO来作为bean对象的DAO,另一个则使用了JdbcDAO。通过这样组装bean对象,我们就可以不用在bean对象中显示的声明所依赖的对象,从而降低了对象间的依赖程度,同时由于我们依赖的只有一个接口,所以这样的代码更容易测试。
再来看看我们如何使用Spring的BeanFactory
Resource res = new ClassPathResource("bean.xml");
XmlBeanFactory bf = new XmlBeanFactory(res);
LogicBusinessImpl HbuisImpl = (LogicBusinessImpl ) bf.getBean("HLogicImpl");
HbuisImpl.BusinessHandle();
System.out.println("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");
LogicBusinessImpl JBuisImpl = (LogicBusinessImpl ) bf.getBean("JLogicImpl");
JBuisImpl.BusinessHandle();
XmlBeanFactory 通过ClassPathResource来读入组装bean对象的xml文件,Spring 不光提供了访问Classpath的ClassPathResource,还有访问文件路径的FileSystemResource,访问Url的UrlResource,以及流形式的InputStreamResource。
以上就是使用Spring的XmlBeanFactory做的一个example,例子很简单,但是后续针对Spring IOC的学习都会基于这个例子。
分享到:
相关推荐
《Spring框架中的IOC容器与XML配置详解》 在软件开发领域,Spring框架以其强大的依赖注入(Dependency ...在后续的学习中,进一步探索Spring的AOP、事务管理等功能,将有助于提升你的开发技能和项目实施能力。
核心容器包括Bean工厂(BeanFactory)和ApplicationContext,它们是Spring的核心,负责对象的创建、管理及依赖注入。 在`spring-framework-5.1.4.RELEASE-docs.zip`中,我们可以找到详细的API文档和用户指南,这些...
深入学习Spring源码,不仅能够帮助我们理解其工作原理,还能提升我们在实际项目中的问题排查能力。例如,当我们遇到Spring的依赖注入问题时,可以通过查看`BeanFactory`和`ApplicationContext`的相关源码来定位问题...
例如,`org.springframework.beans.factory.BeanFactory`接口是Spring容器的核心,负责创建和管理Bean。`BeanPostProcessor`接口允许自定义初始化和销毁Bean的逻辑。而`org.springframework.aop.framework....
通过学习和分析源码,开发者不仅可以提升自身的技术水平,也能更好地利用Spring Framework来构建复杂的企业级应用。而参照文章《https://mp.csdn.net/mdeditor/89521580》提供的指导,可以进一步加深对Spring框架的...
1. **核心容器**:这是Spring框架的基础,包括Bean工厂(BeanFactory)和应用上下文(ApplicationContext)。BeanFactory负责创建、管理对象,而ApplicationContext则增加了国际化、事件传播、AOP代理等功能。 2. *...
在源码中,`org.springframework.beans.factory`和`org.springframework.context`这两个包下的类和接口,如`BeanFactory`和`ApplicationContext`,是实现IOC的关键。 **Spring AOP(Aspect Oriented Programming)*...
同时,BeanFactory和ApplicationContext接口是Spring容器的基石,它们管理着对象的生命周期和依赖关系。 其次,Spring的AOP(面向切面编程)在2.5.6版本中也得到支持。AOP允许开发者定义"切面",即跨越多个对象的...
- **spring-framework-4.3.25.RELEASE-docs.zip**:包含了官方文档,是学习和理解Spring框架的重要资源,包括API参考、开发者指南和用户手册。 - **spring-framework-4.3.25.RELEASE-schema.zip**:提供了Spring ...
在源码中,我们可以找到关于BeanFactory和ApplicationContext的实现,理解它们如何加载配置、实例化和管理Bean。 4. **AOP(面向切面编程)**:Spring的AOP模块支持声明式事务管理和其他横切关注点,如日志记录、...
“tiny-spring-step-4-config-beanfactory-with-xml.zip”继续深化,讲解了如何通过XML配置文件来配置BeanFactory,包括Bean的定义、属性注入、构造函数注入等,让你全面掌握BeanFactory的配置方式。 第五步,...
通过深入学习和理解Spring Framework 5.1.6.RELEASE的源码,开发者不仅能掌握其工作原理,还能提升解决实际问题的能力,从而在实际项目中更好地利用Spring的特性,编写出更加高效、可维护的代码。
在使用Spring 5.0.2.RELEASE中文注释版时,开发者可以清晰地理解每个类、接口和方法的功能,这对于深入学习和掌握Spring至关重要。例如,`org.springframework.beans.factory.BeanFactory`接口定义了容器的基本操作...
2. BeanFactory:作为ApplicationContext的底层实现,BeanFactory是Spring的核心容器,负责Bean的实例化、配置和管理。它提供了基本的DI功能,但功能相对较少,适合小型项目。 3. AOP(面向切面编程):Spring 1.0...
2. **核心容器**:该模块包含Bean工厂(BeanFactory)和ApplicationContext,它们是Spring的核心。BeanFactory负责对象的创建、管理,而ApplicationContext则提供更高级的上下文功能,如事件传播、国际化等。 3. **...
《Spring框架5.3.29深度...通过深入学习和理解Spring 5.3.29的源码,开发者可以更好地利用其特性,编写出高效、灵活的Java应用。同时,掌握Spring框架的核心原理也有助于开发者在解决实际问题时更有针对性和创造性。
《深入剖析Spring Framework 5.1.13.RELEASE...通过深入学习Spring Framework 5.1.13.RELEASE的源码,不仅可以提高我们的技术水平,也能帮助我们在实际项目中更好地利用Spring提供的功能,提升软件开发的效率和质量。
通过对Spring 4.3.2.RELEASE源码的深入研究,我们可以了解其设计理念,学习到如何优雅地管理依赖、实现面向切面编程,以及如何利用Spring构建高效、健壮的Web应用。同时,源码阅读也能帮助我们理解Spring如何与其他...
**Spring--IOC** Spring框架是Java企业级应用开发中的核心组件,它的全称是Spring Inversion of ...了解和掌握这些知识点,对于初级入门的开发者来说至关重要,能够为后续深入学习和使用Spring框架打下坚实的基础。
`spring-framework-master`源码中,这些模块分布在不同的子目录下,如`spring-context`、`spring-beans`、`spring-aop`等,这为我们学习和研究提供了清晰的组织结构。 2. **Core Container** - `spring-beans`:这...