spring知识点总结-1

本文深入讲解Spring框架的核心概念,包括其轻量级特性、控制反转(IOC)、面向切面编程(AOP)以及容器管理等内容。同时,文章对比了BeanFactory与ApplicationContext的区别,详细解析了IOC容器的工作原理和Bean的生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.什么是Spring?

Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性。我们一般说的Spring框架指的是Spring Framework,它是很多模块的集合,使用这些模块可以很方便的协助我们开发。这些模块是:核心容器、数据访问/集成、Web、AOP(面向切面编程)、工具、消息和测试模块。比如:Core Container中的Core组件是Spring所有组件的核心,Beans组件和Context组件是实现IOC和依赖注入的基础,AOP组件用来实现面向切面编程。

二.使用Spring框架有什么好处呢?

  1. 轻量:Spring是轻量的,相对其他框架来说。
  2. 控制反转:Spring通过控制反转实现了松散耦合,对象给出他们的依赖,而不是创建或查找依赖的对象们。
  3. 面向切面编程(AOP):Spring支持面向切面编程,并且把业务逻辑和系统服务分开。
  4. 容器:Spring包含并管理应用中对象的生命周期和配置。
  5. MVC框架:Spring的WEB框架是个精心设计的框架,是WEB框架的一个很好的替代品。
  6. 事务管理:Spring提供一个持续的事务管理接口,提供声明式事务和编程式事务。
  7. 异常处理:Spring提供方便的API把具体技术相关的异常转化为一致的unchecked异常。

三.什么是Spring的控制反转?

控制反转(Inversion Of Control,缩写为IOC)是一个重要的面向对象编程的法则来削减程序的耦合问题,也是spring框架的核心。
应用控制反转,对象在被创建的时候,由一个调控系统内的所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是关于一个对象如何获取他所依赖的对象的引用,这个责任的反转
还有几个常见的问题:
8. 谁依赖谁-当然是应用程序依赖于IOC容器。
9. 为什么需要依赖-应用程序需要IOC容器来提供对象需要的外部资源。
10. 谁注入谁-很明显是IOC容器注入应用程序某个对象,应用程序依赖的对象
11. 注入了什么-就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)

四.IOC的优缺点:

优点:实现了组件之间的解耦,提高程序的灵活性和可维护性
缺点:对象生成因为是反射编程,在效率上有些损耗

五.Spring管理这么多对象,肯定需要一个容器吧。你能说下对IOC容器的理解吗?

在每个框架中都有个容器的概念,所谓的容器就是将常用的服务封装起来,然后用户只需要遵循一定的规则就可以达到统一、灵活、安全、方便和快速的目的。IOC容器是具有依赖注入功能的容器,负责实例化、定位、配置应用程序中的对象以及建立这些对象间的依赖。

六.IOC容器是怎么工作的?

  1. Bean的概念:Bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没什么区别了。
  2. 元数据BeanDefinition:确定如何实例化Bean、管理bean之间的依赖关系以及管理bean,这就需要配置元数据,在spring中由BeanDefinition代表。
  3. 工作原理:
	3.1 准备配置文件:配置文件中声明Bean定义也就是为Bean配置元数据。
	**3.2 由IOC容器进行解析元数据:** IOC容器的Bean Reader读取并解析配置文件,根据定义生成BeanDefinition配置元数据对象,IOC容器根据BeanDefinition进行实例化、配置以及组装Bean。
	3.3 实例化IOC容器:由客户端实例化容器,获取需要的Bean。

举个例子:

@Test  
public void testHelloWorld() {
 //1、读取配置文件实例化一个IoC容器
 ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");
 //2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”
  HelloApi helloApi = context.getBean("hello", HelloApi.class);
  //3、执行业务逻辑
  helloApi.sayHello();
}

七.BeanFactory和ApplicationContext的区别

  1. BeanFactory是Spring中最基础的接口。它负责读取读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期。
  2. ApplicationContext是BeanFactory的子接口,除了提供上述BeanFactory的所有功能外,还提供了更完整的框架功能:如国际化支持,资源访问,事件传递等。
  3. ApplicationContext的初始化和BeanFactory有一个重大区别:
1. BeanFactory在初始化容器时,并未实例化Bean,知道第一次访问某个Bean时才实例化Bean;
2. ApplicationContext则在初始化应用上下文时就实例化所有的单例Bean,因此ApplicationContext的初始化时间会比BeanFactory稍长一些。

八.BeanFactory 和 FactoryBean 的区别:

摘要:
BeanFacotry是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。
ApplicationContext接口,它由BeanFactory接口派生而来。ApplicationContext包含BeanFactory的所有功能,通常建议比BeanFactory优先。
区别:
1. BeanFactory是接口,提供了IOC容器最基本的形式,给具体的IOC容器的实现提供了规范,
2. FactoryBean也是接口,为IOC容器中Bean的实现提供了更加灵活的方式,FactoryBean在IOC容器的基础上给Bean的实现加上了一个简单工厂模式和装饰模式.
3. BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。
4. 但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似

九.BeanFactory详解:

BeanFactory,以Factory结尾,表示它是一个工厂类(接口), 它负责生产和管理bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖

BeanFactory只是个接口,并不是IOC容器的具体实现,但是Spring容器给出了很多种实现,如 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,其中XmlBeanFactory就是常用的一个,该实现将以XML方式描述组成应用的对象及对象间的依赖关系。XmlBeanFactory类将持有此XML配置元数据,并用它来构建一个完全可配置的系统或应用。

BeanFactory为其他具体的IOC容器提供了最基本的规范,例如DefaultListableBeanFactory,XmlBeanFactory,ApplicationContext 等具体的容器都是实现了BeanFactory,再在其基础之上附加了其他的功能。

service层要用dao层对象需要配置到xml配置文件中,至于对象是怎么创建的,关系是怎么组合的都交给了spring框架去实现。
方式一:

Resource resource = new FileSystemResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);

方式二:

ClassPathResource resource = new ClassPathResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);

方式三:

ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml", "applicationContext-part2.xml"});
BeanFactory factory = (BeanFactory) context;

基本就是这些了,接着使用getBean(String beanName)方法就可以取得bean的实例;

BeanFactory提供的方法及其简单,仅提供了六种方法供客户调用:

  • boolean containsBean(String beanName) 判断工厂中是否包含给定名称的bean定义,若有则返回true
  • Object getBean(String)
    返回给定名称注册的bean实例。根据bean的配置情况,如果是singleton模式将返回一个共享实例,否则将返回一个新建的实例,如果没有找到指定bean,该方法可能会抛出异常
  • Object getBean(String, Class) 返回以给定名称注册的bean实例,并转换为给定class类型
  • Class getType(String name)
    返回给定名称的bean的Class,如果没有找到指定的bean实例,则排除NoSuchBeanDefinitionException异常
  • boolean isSingleton(String) 判断给定名称的bean定义是否为单例模式
  • String[] getAliases(String name) 返回给定bean名称的所有别名

十.FactoryBean详解:

一般情况下,Spring通过反射机制利用的class属性指定实现类实例化Bean,在某些情况下,实例化Bean过程比较复杂,如果按照传统的方式,则需要在中提供大量的配置信息。配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案.

Spring为此提供了一个org.springframework.bean.factory.FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。FactoryBean接口对于Spring框架来说占用重要的地位,Spring自身就提供了70多个FactoryBean的实现。它们隐藏了实例化一些复杂Bean的细节,给上层应用带来了便利。从Spring3.0开始,FactoryBean开始支持泛型,即接口声明改为FactoryBean的形式

以Bean结尾,表示它是一个Bean,不同于普通Bean的是:它是实现了FactoryBean接口的Bean,根据该Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身,如果要获取FactoryBean对象,请在id前面加一个&符号来获取。

FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(String BeanName)获取到的Bean对象并不是FactoryBean的实现类对象,而是这个实现类中的getObject()方法返回的对象。要想获取FactoryBean的实现类,就要getBean(&BeanName),在BeanName之前加上&

FactoryBean源码:

public interface FactoryBean<T> {
    @Nullable
    //返回由FactoryBean创建的Bean实例,如果isSingleton()返回true,则该实例会放到Spring容器中单实例缓存池中;
    T getObject() throws Exception; 

    @Nullable
    //返回FactoryBean创建的Bean类型
    Class<?> getObjectType();
	////返回由FactoryBean创建的Bean实例的作用域是singleton还是prototype;
    default boolean isSingleton() {
        return true;
    }
}

十一.常用的获取ApplicationContext的方法:

  1. FileSystemXmlApplicationContext:从文件系统或者url指定的xml配置文件创建,参数为配置文件名或者文件名数组。
  2. ClassPathXmlApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配置文件
  3. WebApplicationContextUtils:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者servlet来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值