Spring框架的学习

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

  • Spring框架是一个开放源代码的J2EE应用程序框架,是针对bean的生命周期进行管理的轻量级容器
  • 控制反转——Spring通过一种称作控制反转(IoC)的技术促进了低耦合。
  • 面向切面——允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发。
  • 容器
  • 框架——Spring可以将简单的组件配置、组合成为复杂的应用。
<!--需要导入的spring的jar包-->
 <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.13</version>
</dependency>

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、类、属性、及其值。包含一个<beans>元素和数个<bean>子元素。
Spring IoC框架可根据Bean的id从Bean配置文件中取得该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">

    <!--使用Spring创建对象,在Spring都成为bean
    id=变量名,也是程序中要取出的标记
    class= new的对象
    property相当于给对象中的属性设置的一个值
    -->

    <!--使用Spring来创建对象,在Spring这些都成为Bean-->

    <bean id="UserDaoImpl" class="com.study.dao.UserDaoImpl"/>
    
    <bean id="UserDaoImpl1" class="com.study.dao.UserDaoImpl1">
    <!--name后传入的参数是我们在实体类中已经创建过的,我们在这里通过value传入参数给它赋值-->
    	<property name="str" value="Hello World"/>
    </bean>

	<!--ref="id",传入的id是我们已经创建的bean的id,一般用ref来传入参数的情况,
	这个bean都是可以直接使用的类,而不需要传参的方法类、实体类-->
    <bean id="t" class="com.study.service.UserServiceImpl">
        <property name="str" ref="UserDaoImpl"/>
    </bean>

</beans>

(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、下标赋值

<!--下标赋值 index表示第几个参数 如果不写 默认为0-->
    <bean id="user" class="pojo.User">
        <constructor-arg index="0" value="小明"/>
        <constructor-arg index="1" value="10"/>
    </bean>

2、类型创建

<!--一般用于乱序-->
	<bean id="getInfo" class="User.User">
        <constructor-arg type="java.lang.String" value="小明"/>
        <constructor-arg type="int" value="10"/>
    </bean>

3、参数名创建(常用)

    <bean id="user" class="User">
        <constructor-arg name="name" value="小明"/>
        <constructor-arg name="age" value="10"/>
    </bean>

在这里插入图片描述

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值