Spring(一)

Spring

Spring概述

  • Spring是与2003年兴起的一个full-stack轻量级的Java开源框架。
  • Spring以IOC(控制反转)和AOP(面向切面编程)为核心
  • Spring提供了展现层SpringMVC、持久层SpringJDBC、业务层事务管理等众多企业级应用技术
  • Spring还能整合开源世界众多的第三方框架和类库

Spring优势

  1. 方便解耦、简化开发
  2. AOP编程支持
  3. 声明式事务支持
  4. 方便程序的测试
  5. 方便集成各种优秀的框架
  6. 降低JavaEE API的使用难度
  7. 开源源代码

Spring的体系结构

Spring的体系结构

IOC

IOC(控制反转)是一种设计思想

  • 控制:指的是控制权,在Java中可以简单理解为对象的控制权限(比如对象的创建、销毁等权限)
  • 反转:指的是将对象的控制权由原来的程序员在类中主动控制反转到由Spring容器来控制

Spring入门

导入坐标

    <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.6.RELEASE</version>
        </dependency>

创建dao接口和实现类

public interface IUserDao {
    void save();
}
public class UserDaoImplv2 implements IUserDao {
    public void save() {
        
    }
}

加入配置文件

  • spring的配置文件 applicationContext.xml
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
</beans>

测试

<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
</beans>

Spring的IOC容器工作原理

  1. 当Spring的IOC容器加载时,会读取配置文件中的诸多bean
  2. 根据bean的class的值寻找对应的Class字节码文件
  3. 通过反射技术,创建出一个个对象
  4. 创建的对象会被存放到内部的一个Map结构中,等待被使用
  5. 当需要使用具体的对象时无须自己创建,直接从Spring的IOC容器中取

Spring的API介绍

  • BeanFactory
    • BeanFactory是Spring的心脏
    • BeanFactory是IOC容器的核心接口,它定义了IOC的节本功能
    • Spring使用它来配置文档,管理bean的加载,实例化并维护bean之间的依赖关系,负责bean的生命周期
  • ApplicationContext
    • ApplicationContext由BeanFactory派生而来,可以理解为Spring的躯体
    • ApplicationContext由BeanFactory的基础上添加了很多功能
      • 支持了aop功能和web应用
      • MessageSource,国际化的消息访问
      • 通过配置来实现BeanFactory中很多编码才能实现的功能
    • ApplicationContext的常用实现类
      • ClassPathXmlApplicationContext:从classpath目录读取配置文件
      • FileSystemXmlApplicaitonContext:从文件系统或者url中读取配置文件
      • AnnotationConfigApplicationContext:当我们使用注解配置容器对象时,需要使用此类来创建Spring容器。它用来读取注解
  • 两者的区别
    • beanFactory主要是面向Spring框架的基础设施,也就提供spring自身内部调用。而ApplicationContext主要面向Spring的使用者
    • BeanFactory在第一次使用到某个Bean时(调用getBean())才对该Bean进行加载实例化,而ApplicationContext是在容器启动时,一次性创建并加载了所有的Bean

创建Bean对象的不同方式

默认无参构造函数

会根据默认无参构造函数来创建类对象,如果bean中没有默认无参构造函数,将会创建失败

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>

工厂模式创建对象

在Spring中还可以通过工厂模式来创建对象

工厂模式又分两种:

​ 静态工厂:先不生产工厂的实例,直接调用工厂的静态方法

​ 实例工厂:先产生工厂的实例,再调用工厂实例的方法创建对象

  • 工厂类
public class FactoryCreateBean{
    //静态
    public static UserDao createUserDao(){
        return new UserDaoImpl();
    }
    
    public UserDao createUserDaoSimple(){
        return new UserDaoImpl();
    }
    
}
<bean id="userDao1" class="com.itheima.factory.FactoryCreateBean" factory-method="createUserDao"/>
<!--使用实例工厂创建对象-->
<bean id="factoryCreateBean" class="com.itheima.factory.FactoryCreateBean"/>
<bean id="userDao2" factory-bean="factoryCreateBean" factory-method=“createUserDaoSimple”/>

Bean对象的作用域

所谓Bean的作用域其实就是指Spring给我们创建出的对象的存活范围

可以在spring配置文件中通过bean标签中的scope属性来对当前bean对象的作用域进行指定

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" scope="prototype"/>
  • scope属性有五个取值:
    • Singleton(默认) 创建出的实例为单例模式,IOC只创建一次,然后一直存在
    • Prototype 创建出的实例为多例模式,每次获取bean的时候,IOC都给我们重新创建新对象
    • request(web) web项目中,Spring创建一个Bean的对象,将对象存入到request中
    • session(web) web项目中,Spring创建一个Bean的对象,将对象存入到session域中
    • globalSession 创建的实例绑定全局session对象

依赖注入

依赖注入:Dependency Injection 是spring框架核心ioc的具体实现

通过构造函数注入

public Book(String name,Float price,Date publishDate){
    this.name = name;
    this.price = pricae;
    this.publishDate = publicshDate;

}
<bean id= "date" class="java.util.Data"/>
<bean id="book" class="com.itheima.spring.book">
    <!--
        index:指定参数在构造函数参数列表的索引位置,从0开始
        name:指定参数在构造函数中的名称
        type:指定参数在构造函数中的数据类型,可以通过反射拿到,不需要关系
        value:它能赋的值是基本数据类型和String类型
        ref:它能赋的值是其他bean类型,也就是说,必须得是在配置文件中配置过的bean
    -->
    <constructor-arg name="name" value="sd"/>
    <constructor-arg name="price" value="1"/>
    <constructor-arg name="publishDate" ref="date"/>
</bean>

通过setter属性注入

<bean id="book" class="com.itheima.spring.book">
    <!--
        name:类中set方法后面的部分
        ref:给属性赋值是其他bean类型
        value:给属性赋值是基本数据类型和String类型的
    -->
    <property name="name" value="xdsa"/>
    <property name="price" value="1"/>
    <property name="publishDate" ref="date"/>
</bean>

注入集合属性

注入集合也是用的set方法注入,只不过变量的数据类型都是集合

<bean id="book" class="com.itheima.spring.Book">
<!--List-->
<property name="list">
<list>
<value>1</value>
<value>2</value>
</list>
</property>
<!--Set-->
<property name="set">
<set>
<value>3</value>
<value>4</value>
</set>
</property>
<!--数组-->
<property name="array">
<array>
<value>5</value>
<value>6</value>
</array>
</property>
<!--Map-->
<property name="map">
<map>
<entry key="7" value="7-1" />八、Bean对象的生命周期
所谓的Bean对象生命周期其实指的是Bean创建到销毁的这么一段时间。
8.1 粗粒度生命周期验证
在Spring中可以通过配置的形式,指定bean在创建后和销毁前要调用的方法。
经测试得知:
spring中单例对象的生命周期为:
出生:IOC容器加载时出生
存活:IOC容器运行时存活
死亡:IOC容器销毁时死亡
spring中多例对象的生命周期为:
出生:使用对象时出生
存活:一直存活
死亡:由java垃圾回收器负责销毁
8.2 细粒度生命周期验证
出生过程
1. 实例化bean对象【IOC】
2. 为对象属性赋值【DI】
3. 处理实现的Aware接口
① 如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,
此 处传递的就是Spring配置文件中Bean的id值。
<entry key="8" value="8-1" />
</map>
</property>
<!--Properties-->
<property name="properties">
<props>
<prop key="9">9-1</prop>
<prop key="10">10-1</prop>
</props>
</property>
</bean>

Bean对象的生命周期

粗粒度生命周期验证

在Spring中可以通过配置的形式,指定bean在创建后和销毁前要调用的方法

<bean id="userDao" class="xxx" scope="prototype"
init-method="init" destroy-method="destroy"/>
  • spring中单例对象的生命周期为:
    • 出生:IOC容器加载时出生
    • 存活:IOC容器运行时存活
    • 死亡:IOC容器销毁时死亡
  • spring中多例对象的生命周期为
    • 出生:使用对象时出生
    • 存活:一直存活
    • 死亡:由java垃圾回收器负责销毁

生命周期图例

image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容