JavaWeb框架&JavaWeb工具学习

Spring(一)

2019-12-09  本文已影响0人  So_ProbuING

Spring

Spring概述

Spring优势

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

Spring的体系结构

Spring的体系结构

IOC

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

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() {
        
    }
}

加入配置文件

<?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介绍

创建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"/>

依赖注入

依赖注入: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"/>

生命周期图例

image.png
上一篇下一篇

猜你喜欢

热点阅读