Spring框架的学习

Spring框架的学习,第1张

Spring框架的学习

Spring是目前非常流行的Java Web开发框架,用于解决企业应用的复杂性问题。

  • Spring框架是一个开放源代码的J2EE应用程序框架,是针对bean的生命周期进行管理的轻量级容器
  • 控制反转——Spring通过一种称作控制反转(IoC)的技术促进了低耦合。
  • 面向切面——允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发。
  • 容器
  • 框架——Spring可以将简单的组件配置、组合成为复杂的应用。
 

org.springframework
spring-webmvc
5.3.13

文章目录
  • 1、为什么要使用Spring框架?
  • 2、什么是IoC?
  • 3、什么是DI?
  • 4、使用IoC/DI的好处?
  • 5、IoC/DI的实现
    • ①、Spring核心容器
    • ②、IoC/DI实现方式

1、为什么要使用Spring框架?

之前的业务中,用户的需求会影响原本的代码,需要根据用户的需求去修改源代码。
如果程序代码量很大,修改一次代码的代价会非常大。
在传统的面向对象编程方式里,获取对象的方式一般都是new一个新对象,进行调用
但是在spring框架中,利用了IoC的方式对象的生命周期由Spring框架提供的IoC容器来管理,所有的对象都存储在容器里,控制权由应用程序交给了IoC容器。
当我们需要使用的时候,直接去容器中拿取,更加的方便快速

2、什么是IoC?

IoC译为控制反转。
将创建对象的过程由主动变为被动,即把创建对象交给IoC容器处理,控制权反转过来,就是控制反转。
IoC理论上是借助了第三方实现具有依赖关系对象之间的解耦,把各个对象类封装后,通过IoC容器来关联这些对象类。这样对象与对象直接就没有什么直接的关系,而是通过IoC容器进行联系。

3、什么是DI?

DI译为依赖注入
所谓依赖注入,就是由IoC容器在运行期间动态地将某种依赖关系注入对象之中。

事实上,依赖注入(DI)和控制反转(IoC)是对同一个事情的不同描述。
依赖注入是从程序的角度描述,即应用程序依赖容器创建并注入它需要的外部资源;
而控制反转是从容器的角度描述,即容器控制程序,由容器反向地向应用程序注入应用程序所需要的外部资源。
这里的外部资源可以是外部实例对象,也可以是外部文件对象。

4、使用IoC/DI的好处?
  • 可维护性比较好,便于单元测试、调试程序和诊断故障。代码的每一个class都可以单独调试,彼此之间互不影响,只有保证自身的功能无误就可以,这就是组件之间的低耦合或者无耦合带来的好处!
  • 在团队开发中,只需要关注自己的业务实现就可以。因为自己的任务跟别人的任务没有任何关系,自己的任务可以单独测试,不用依赖别人的组件。
  • 可复用性好。可以将具有普遍性的常用组件独立出来,反复应用到项目中的其他部分,或者是其他项目,当然这也是面向对象的基本特征。IoC更好的贯彻了这个原则,提高了模块的可复用性。
    符合接口标准的实现都可以插接到支持此标准的模块中!
  • 生成对象的方式转为外置方式,就是把对象生成放在配置文件中进行定义。这样,当我们更换一个实现子类的将会变得更加简单,只有修改配置文件即可。完全符合热插拔的特性!
5、IoC/DI的实现

Spring框架主要功能是通过容器来实现。Spring框架提供了两种核心容器分别是BeanFactory和ApplicationContext。IoC/DI通常有setter注入和构造方法注入两种实现方式。

①、Spring核心容器

Spring框架的两个最基本和最重要的包是org.springframework.beans.factory(主要接口:BeanFactory)
和org.springframework.context(主要接口:ApplicationFactory)

Spring IoC框架主要组件有Beans、配置文件applicationContext.xml、BeanFactory接口及其相关类、ApplicationContext接口及其相关类

(1)、Beans是指项目中提供业务功能的Bean,即容器要管理的Bean。Beans就是一个常见的JavaBean、Java类

(2)、在Spring中对Bean的管理是在配置文件中进行的。在Spring容器内编辑配置文件管理Bean又称Bean的装配,实际上装配就是告诉容器需要哪些Bean,以及容器是如何使用IoC将它们配合起来的。
Bean的配置文件是一个xml文件,可以命名为applicationContext.xml或其他,一般习惯applicationContext.xml

配置文件包含Bean的id、类、属性、及其值。包含一个元素和数个子元素。
Spring IoC框架可根据Bean的id从Bean配置文件中取得该Bean的类,并生成该类的一个实例对象,
继而从配置文件中获得该对象的属性和值。
常见的配置文件格式如下:



    

    

    
    
    
    
    	
    

	
    
        
    


(3)、BeanFactory采用工厂设计模式,即Bean容器模式,负责读取Bean的配置文件,管理对象的生成、加载,维护Bean对象与Bean对象之间的依赖关系,负责Bean的生命周期。
对于简单的程序来说,使用BeanFactroy已经足够管理Bean了,在对象的管理上可以获得许多便利性。
org.springframework.beans.factory.BeanFactory是一个顶级接口,包含管理Bean的各种方法。Spring框架也提供了一些实现该接口的类
org.springframework.beans.factory.xml.XmlBeanFactory是BeanFactory常用的实现类,根据配置文件中的定义装载Bean。要创建XmlBeanFactory,需要传递一个FileInputStream对象,该对象把XML文件提供给工厂。

BeanFactroy factory = new XmlBeanFactory(new FileInptStream("applicationContext.xml"));

BeanFactory的常用方法如下:

  • getBean(String name):可根据Bean的id生成该Bean的对象,一般要强制转型,才可以使用
  • getBean(String name,Class requiredType):可根据Bean的id和相应类生成该Bean的对象。

(4)、ApplicationContext接口提供高级功能的容器,基本功能和BeanFactory很相似,但它还有一下功能:

  • 提供访问资源文件更方便的方法
  • 支持国际化消息
  • 提供文字消息解析的方法
  • 可以发布事件,对事件感兴趣的Bean可以接受到这些事件

ApplicationContext接口的常用实现类有以下三个:

  • FileSystemXmlApplicationContext:从文件系统中的xml文件加载上下文中定义的信息
  • ClassPathXmlApplicationContext:从类路径中的xml文件加载上下文中定义的信息,把上下文中定义的文件当成类路径资源
  • XmlWebApplicationContext:从web系统中的xml文件加载上下文中定义的信息

其中,FileSystemXmlApplicationContext和ClassPathXmlApplicationContext的使用如下:

ApplicationContext context = new FileSystemXmlApplicationContext("d:/applicationContext.xml");

//重点使用
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

第一种使用文件系统的方式来查询配置文件,此时配置文件位于D盘下。
第二种使用类路径查询配置文件,此时配置文件很久位于项目的src目录下,一般IDEA创建的Maven项目应该在resources目录下。
区别:
FileSystemXmlApplicationContext只能在指定的路径下查询配置文件,ClassPathXmlApplicationContext可以在整个类路径中查询配置文件。

②、IoC/DI实现方式

实现方式主要有两种方式:一种是setter()方法注入,另一种是构造方法注入。

  • 属性setter()方法注入:IoC容器使用setter()方法注入被依赖的实例。通过调用无参构造器或无参静态工厂方法实例化Bean后,调用该Bean的setter()方法,即可实现基于setter()方法的依赖注入。该方法简单直观,而且容易理解,所以Spring的设置注入被大量使用
  • 构造方法注入:IoC容器使用构造方法注入被依赖的实例。基于构造方法的依赖注入通过调用带参数的构造方法来实现,每个参数代表一个依赖。

构造方法注入的方式:
首先需要有一个没有set方法的类

public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
}

1、下标赋值

    
        
        
    

2、类型创建

	
        
        
    

3、参数名创建(常用)

    
        
        
    

总结:在配置文件加载的时候,容器中管理的对象已经初始化了,如果在容器中创建了,那么在运行的时候容器中的对象会被全部取出!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5683498.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-17
下一篇2022-12-17

发表评论

登录后才能评论

评论列表(0条)

    保存