这个系列 【spring核心】 分享一些spring核心的知识点和实践,主要是IOC和AOP
现在框架越来越先进了 特别是springboot出现之后,很多底层的东西框架都帮我们做了,
导致我们只能感知到表面的一些东西,用起来是很爽,但是用完之后我们还是要尝试学习一下底层的东西,这样可以让我们更深入的理解和体会
IOC容器管理Bean
所谓的bean 就是spring 的核心 IOC容器中,所管理的对象。
这些对象在我们配置(比如xml配置 比如类上面加注解配置等等)之后
在spring启动的时候 spring容器会把他们加载到IOC容器中
方便我们去调用 去使用他们。
那么问题来了 spring是怎么根据我们的配置 创建出这些bean的?
来代替我们自己new这个对象呢?
这里要说一个它的核心概念 就是
BeanFactory
看名字就很好理解 bean工厂? 就是生产bean的地方,我的博客还是按 照顾新手 的原则。
我们先来一个最原始 最复古的方法:
首先你有一个接口和接口实现方法 : UserInter UserInterImpl
我们自己创建一个 xml配置 把bean配置好:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="UserInter" class="com.example.srpingcorerush.ioc.TestClass.test1.UserInterImpl"></bean>
</beans>
这里新手要注意 把接口作为bean id的命名是一个好习惯
我们创建一个bean工厂对象 然后创建一个xml读取器 去扫描xml文件中bean配置
@Test
public void TestBeanFactory(){
//创建一个bean工厂
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
//创建一个xml读取器
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
//读取这个xml文件
reader.loadBeanDefinitions("ioc-beans.xml");
UserInter userInter = (UserInter)factory.getBean("UserInter");
System.out.println("获取bean工厂中创建的bean"+userInter);
}
这样我们就可以bean工厂中获取到bean了
获取bean工厂中创建的beancom.example.srpingcorerush.ioc.TestClass.test1.UserInterImpl@1a1d6a08
我们平时习惯用注解来创建bean 然后用注解来获取bean,其实这些简便做法的底层就是这样来的。
其实beanfactory是一种比较原始 比较复古的底层手段 来创建和获取bean。
你可以把它称为一个容器 。 而在它基础上
Spring 就把它进行了一层封装 ,在他的基础上 搞一个更强大的spring容器:
ApplicationContext
(spring就喜欢干这种事情 封装和集成,见到好东西 自己懒的再重做,二话不说就封装)
用它就更简单了:
@Test
public void TestAPPcontext(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ioc-beans.xml");
UserInter userInter = (UserInter)applicationContext.getBean("UserInter");
System.out.println("获取封装bean工厂-applicationContext中创建的bean"+userInter);
}
跟上面比较一下 显然这个更简单是吧
二者的区别
BeanFactory(Bean工厂):
BeanFactory是Spring框架的最基本的接口,提供了最简单的Bean容器的功能。
BeanFactory以延迟加载的方式实例化和管理Bean对象,即在使用时才去创建Bean实例。
BeanFactory的主要功能是提供Bean的实例化、依赖注入和生命周期管理。
BeanFactory是一个轻量级的容器,适用于资源受限的环境或需要精细控制Bean实例化和管理的情况。
ApplicationContext(应用上下文):
ApplicationContext是BeanFactory的一个子接口,提供了更多的功能和扩展性。
ApplicationContext在容器启动时就完成了Bean的实例化,提前解决了Bean的依赖关系。
ApplicationContext提供了更多的特性,如国际化支持、事件发布、AOP集成、资源加载等。
ApplicationContext是一个更重量级的容器,适用于大多数应用场景,提供更便捷的开发体验。
主要区别:
实例化方式:BeanFactory使用延迟加载,而ApplicationContext在容器启动时就完成了Bean的实例化。
功能和特性:ApplicationContext提供了更多的功能和特性,如国际化支持、事件发布、AOP集成等,而BeanFactory提供了基本的Bean管理功能。
资源消耗:BeanFactory是轻量级容器,占用较少的资源;而ApplicationContext是重量级容器,占用较多的资源。
使用场景:BeanFactory适用于资源受限的环境或需要精细控制Bean实例化和管理的情况;ApplicationContext适用于大多数应用场景,提供更便捷的开发体验和更丰富的功能。