Spring框架技术总结

Posted 生命是有光的

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring框架技术总结相关的知识,希望对你有一定的参考价值。

0、目录总览

1、Spring

1.0、Spring程序开发步骤

创建一个maven项目

  1. 在pom.xml导入Spring开发的基本包坐标
<!--导入spring的context坐标,context依赖core、beans、expression-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.0.5.RELEASE</version>
</dependency>
  1. 编写Dao接口和实现类

UserDao接口

public interface UserDao{
    public void save();
}

UserDaoImpl实现类

public class UserDaoImpl implements UserDao{
    @Override
    public void save(){
        System.out.println("save running....");
    }
}
  1. 在类路径下(resources)创建applocationContext.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"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">

    </bean>
</beans>    
  1. 测试
public class UserDaoDemo {
    public static void main(String[] args) {
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) app.getBean("userDao");
        userDao.save();
        //save running....
    }
}

2、Spring配置文件

2.1、Bean标签基本配置

默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功

2.1.1、bean

  • 名称:bean

  • 类型:标签

  • 归属:beans标签

  • 作用:定义spring中的资源,受此标签定义的资源将受到spring控制

  • 格式:

    <beans>
    	<bean />
    </beans>
    
  • 基本属性:

    <bean id="beanId" name="beanName1,beanName2" class="ClassName"></bean>
    

    id:bean的名称,通过id值获取bean

    class:Bean的全限定名称

    name:bean的名称,可以通过name值获取bean,用于多人配合时给bean起别名

例如:

<bean id="userDao" name="userDao1,userDao2"  class="com.itheima.dao.impl.UserDaoImpl" >

</bean>

2.1.2、bean属性scope

  • 名称:scope

  • 类型:属性

  • 归属:bean标签

  • 作用:定义bean的作用范围

  • 格式:

    <bean scope="singleton"></bean>
    
  • 取值:

    • singleton:设定创建出的对象保存在spring容器中,是一个单例的对象,默认值
    • prototype:设定创建出的对象保存在spring容器中,是一个非单例的对象
    • request、session、application、 websocket :设定创建出的对象放置在web容器对应的位置

2.1.2.1、singleton

  • 将scope作用范围设置为单例
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" scope="singleton">

</bean>
  • 测试
@Test
// 测试scope属性
public void test1(){
    ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserDao userDao1 = (UserDao) app.getBean("userDao");
    UserDao userDao2 = (UserDao) app.getBean("userDao");
    System.out.println(userDao1 == userDao2);
    // true,两次创建出来的对象是相同的
}

2.1.2.2、prototype

  • 将scope作用范围设置为多例
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" scope="prototype">

</bean>
  • 测试
@Test
// 测试scope属性
public void test1(){
    ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserDao userDao1 = (UserDao) app.getBean("userDao");
    UserDao userDao2 = (UserDao) app.getBean("userDao");
    System.out.println(userDao1 == userDao2);
    // false,两次创建出来的对象是不相同的
}

2.1.3、bean声明周期

  • 名称:init-method,destroy-method

  • 类型:属性

  • 归属:bean标签

  • 作用:定义bean对象在初始化或销毁时完成的工作

  • 格式:

    <bean init-method="init" destroy-method="destroy"></bean>
    
  • 取值:bean对应的类中对应的具体方法名

  • 注意事项:

    • 当scope=“singleton”时,spring容器中有且仅有一个对象,init方法在创建容器时仅执行一次

    • 当scope=“prototype”时,spring容器要创建同一类型的多个对象,init方法在每个对象创建时均执行一次

    • 当scope=“singleton”时,关闭容器会导致bean实例的销毁,调用destroy方法一次

    • 当scope=“prototype”时,对象的销毁由垃圾回收机制gc()控制,destroy方法将不会被执行

2.1.4、总结

  1. 当scope的取值为singleton
  • Bean的实例化个数:1个

  • Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例

    • ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
      
    • 也就是上述代码执行时,实例化配置的Bean实例

  • Bean的生命周期

    • 对象创建:当应用加载,创建Spring容器时,对象就被创建了
    • 对象运行:只要Spring容器在,对象一直活着
    • 对象销毁:当应用卸载,销毁容器时,对象就被销毁了
  1. 当scope的取值为prototype
  • Bean的实例化个数:多个

  • Bean的实例化时机:当调用getBean()方法时实例化Bean实例

    • ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
      UserDao userDao1 = (UserDao) app.getBean("userDao");
      
  • Bean的生命周期

    • 对象创建:当使用对象时,创建新的对象实例
    • 对象运行:只要对象在使用中,就一直或者
    • 对象销毁:当对象长时间不用时,被 Java 的垃圾回收期回收

2.2、Bean实例化三种方式

  • 无参构造方法实例化(重要)
  • 工厂静态方法实例化(了解)
  • 工厂实例方法实例化(了解)

2.2.1、无参构造方法实例化

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

<!--    无参构造创建对象-->
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" 

</bean>

2.2.2、工厂静态方法实例化

工厂的静态方法返回Bean实例 :

  • 使用class属性来指定包含static工厂方法的类的全限名
  • 使用factory-method 属性来指定工厂方法本身的名称
  1. 编写工厂静态方法
/**
 * 工厂静态方法
 */
public class StaticFactory {
    public static UserDao getUserDao(){
        return new UserDaoImpl();
    }
}
  1. 在Spring核心配置文件配置
<!--    工厂静态方法创建对象-->
<bean id="userDao" class="com.itheima.factory.StaticFactory" factory-method="getUserDao">

</bean>

2.2.3、工厂实例方法实例化

工厂的非静态方法返回Bean实例:

  • 使用此机制,请将class属性留空,并在factory-bean属性中,指定包含要创建对象的实例方法的bean的名称
  • 使用factory-method属性设置工厂方法本身的名称
  1. 编写工厂实例方法
/**
 * 工厂实例方法创建对象
 */
public class DynamicFactory {
    public  UserDao getUserDao(){
        return new UserDaoImpl();
    }
}
  1. 在Spring核心配置文件配置
<!--    工厂实例方法创建对象-->
<bean id="factory" class="com.itheima.factory.DynamicFactory"></bean>
<bean id="userDao" factory-bean="factory" factory-method="getUserDao" />

2.3、Bean的依赖注入

  • IoC(Inversion Of Control)控制翻转,Spring反向控制应用程序所需要使用的外部资源
  • DI(Dependency Injection)依赖注入,应用程序运行依赖的资源由Spring为其提供,资源进入应用程序的方式称为注入

因为UserService和UserDao都在Spring容器中,而最终程序直接使用的是UserService,所以可以在Spring容器中,将UserDao设置到UserService内部。

2.3.1、依赖注入概念

  • 依赖注入 Dependency Injection:它是Spring框架核心IOC的具体实现

  • 在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层(Service)仍会调用持久层(Dao)的方法。

  • 简单的说,就是坐等框架把持久层(Dao)对象传入业务层(Service),而不用我们自己去获取

2.3.2、依赖注入方式

怎么将UserDao(持久层)怎样注入到UserService(业务层)内部呢?

  • 构造方法
  • set方法

2.3.2.1、set方法注入(主流)

  • 名称:property

  • 类型:标签

  • 归属:bean标签

  • 作用:使用set方法的形式为bean提供资源

  • 格式:

    <bean>
    	<property />
    </bean>
    
  • 基本属性:

    <property name="propertyName" value="propertyValue" ref="beanId"/>
    

name:对应bean中的属性名,要求该属性必须提供可访问的set方法(严格规范为此名称是set方法对应名称)

value:设定非引用类型属性对应的值,不能与ref同时使用

ref:设定引用类型属性对应bean的id ,不能与value同时使用

  • 注意:一个bean可以有多个property标签

要求被注入的属性,必须有set方法,set方法的方法名由set + 属性首字母大写

  1. 在UserServiceImpl中添加setUserDao方法
public class UserServiceImpl implements UserService {
    private UserDao userDao;
    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }
    @Override
    public void save() {
        userDao.save();
    }
}
  1. 配置Spring容器调用set方法进行注入
    • 注意点:这里的值是一个引用,ref
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
    <!--        name是属性名,也就是setUserDao方法去掉set,之后首字母小写-->
    <!--        Bean引用注入,用ref-->
    <property name="userDao" ref="userDao"></property>
</bean>

2.3.2.2、构造方式注入(了解)

  • 名称:constructor-arg

  • 类型:标签

  • 归属:bean标签

  • 作用:使用构造方法的形式为bean提供资源,兼容早期遗留系统的升级工作

  • 格式:

    <bean>
    	<constructor-arg />
    </bean>
    
  • 基本属性:

    <constructor-arg name="argsName" value="argsValue />
    

    name:对应bean中的构造方法所携带的参数名

    value:设定非引用类型构造方法参数对应的值,不能与ref同时使用

  • 其他属性:

<constructor-arg index="arg-index" type="arg-type" ref="beanId"/>

ref:设定引用类型构造方法参数对应bean的id ,不能与value同时使用

type :设定构造方法参数的类型,用于按类型匹配参数或进行类型校验

index :设定构造方法参数的位置,用于按位置匹配参数,参数index值从0开始计数

  • 注意:一个bean可以有多个constructor-arg标签
  1. 创建有参构造
public class UserServiceImpl implements UserService {
    private UserDao userDao;

    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }
    @Override
    public void save() {
        userDao.save();
    }
}
  1. 配置Spring容器调用有参构造时进行注入
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
    <constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>

2.3.3、依赖注入数据类型

上面的操作,都是注入的引用Bean,都是对UserDao对象的引用进行注入的,除了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入。

对于集合数据类型注入:

  • 名称:array,list,set,map,props

  • 类型:标签

  • 归属:property标签 或 constructor-arg标签

  • 作用:注入集合数据类型属性

  • 格式:

    <property>
    	<list></list>
    </property>
    
  1. 常量注入
<bean id="student" class="com.kuang.pojo.Student">
<!--        第一种,普通值注入,value-->
</bean>
  1. Bean注入
    • 注意点:这里的值是一个引用,ref
<bean id="student" class="com.kuang.pojo.Student">
<!--        第二种,Bean注入,ref-->
    <property name="address" ref="address" />
</bean>
  1. 数组注入
<bean id="student" class="com.kuang.pojo.Student">
<!--        第三种,数组注入-->
    <property name="books">
        <array>
            <value>红楼梦</value>
            <value>西游记</value>
            <value>水浒传</value>
            <value>三国演义</value>
        </array>
    </property>
</bean>
  1. List注入
<bean id="student" class="com.kuang.pojo.Student">
<!--        第四种,List注入-->
    <property name="hobbys">
        <list>
            <value>听歌</value>
            <value>看木鱼水心</value>
            <value>敲代码</value>
            <value>玩游戏哈哈</value>
        </list>
    </property>
</bean>
  1. Map注入
<bean id="student" class="com.kuang.pojo.Student">
<!--        第五种,Map注入-->
    <property name="card">
        <map>
            <entry key="身份证" value="123456123456123456" />
            <entry key="银行卡" value="654321654321654321" />
        </map>
    </property>
</bean>
  1. set注入
<bean id="student" class="com.kuang.pojo.Student">
<!--        第六种,Set注入-->
    <property name="games">
        <set>
            <value>英雄联盟</value>
            <value>刀塔</value>
            <value>刺客信条</value>
            <value>虐杀原型</value>
        </set>
    </property>
</bean>
  1. null注入
<bean id="student" class="com.kuang.pojo.Student">
<!--        null空值注入-->
    <property name="wife">
        <null />
    </property>
</bean>
  1. Properties注入
<bean id="student" class="com.kuang.pojo.Student">
<!--        properties
    		key = value
-->
    <property name="info">
        <props>
            <prop key以上是关于Spring框架技术总结的主要内容,如果未能解决你的问题,请参考以下文章

spring框架的一些技术总结

Spring框架技术总结

SpringMVC框架技术总结

SpringMVC框架技术总结

万字Spring框架学习总结(附核心代码详细注释)

万字Spring框架学习总结(附核心代码详细注释)