Spring框架01

这里我们首先介绍一下什么是框架:

  • 框架是一个封装了很多功能和模块的程序的半成品。可以理解为是一个由很多工具类组合而成的一个工具包。

什么是Spring框架呢?

  • Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架。是Java开发的灵魂框架。
  • Spring有两大内核:
    • IOC(Inverse Of Control:控制反转)
    • AOP(Aspect Oriented Programming:面向切面编程)

Spring功能:

  • IOC:控制反转,其实就是把对象的创建权,交给spring,由Spring负责给我们创建对象。
  • DI: 依赖注入,其实就是给对象的成员变量赋值。
  • AOP:面向切面编程,底层就是动态代理。
  • 事务: Spring提供了声明式事务,也就是说,我们可以通过配置的方式来添加事务。

这里我们通过一个小案例首先感受一下Spring的功能:

Spring入门案例

首先导入Spring 的核心坐标

<!--spring核心-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.9.RELEASE</version>
</dependency>

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
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--把对象的创建,交给spring来管理-->
    <bean id="userService" class="com.itheima.service.impl.UserServiceImpl"/>

</beans>

编写代码

package com.itheima.service;

public interface UserService {
    void save();
}
package com.itheima.service.impl;

import com.itheima.service.UserService;

public class UserServiceImpl implements UserService {

    @Override
    public void save() {
        System.out.println("run");
    }
}

编写测试类进行测试

package com.itheima.test;

import com.itheima.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        //加载配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取资源
        UserService userService = (UserService) applicationContext.getBean("userService");
        userService.save();
    }
}

Spring 框架的优点:

  • 方便解耦,简化开发
  • 方便集成各种优秀框架
  • 方便程序的测试
  • AOP 编程的支持
  • 声明式事务的支持
  • 降低 JavaEE API 的使用难度
  • Java 源码是经典学习范例

Spring 框架体系结构:

在这里插入图片描述

IOC配置-XML格式:

bean 标签
  • 作用:定义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属性scope

  • 归属:bean标签
  • 作用:定义bean的作用范围
  • 格式:
<bean scope="singleton"></bean>
  • 取值:
    • singleon:设定创建出的对象保存在spring容器中,是一个单例的对象。
    • prototype:设定创建出的对象保存在spring容器中,是一个非单例的对象。
    • request、session、application、websocket:设定创建出的对象放置在web容器对应的位置。
  • 单例的对象在加载配置文件的时候创建对象
  • 非单例的对象在获取对象 (get bean) 时创建对象
生命周期
  • 名称:init-method,destroy-method
  • 作用:定义bean对象在初始化或销毁时完成的工作
  • 格式:
<bean init-method="bean初始化时执行的方法" destroy-method="bean销毁时执行的方法"></bean>

注意事项:

  • 当scope=“singleton”时,spring容器中有且仅有一个对象,init方法在创建容器时仅执行一次
  • 当scope=“prototype”时,spring容器要创建同一类型的多个对象,init方法在每个对象创建时均执行一次
  • 当scope=“singleton”时,关闭容器会导致bean实例的销毁,调用destroy方法一次
  • 当scope=“prototype”时,对象的销毁由垃圾回收机制gc()控制,destroy方法将不会被执行

依赖注入-DI

  • 依赖注入(Dependency Injection):是SpringIOC的具体体现,简单来说,就是给对象的属性赋值。
依赖注入的两种方式:
  • Set 注入
  • 构造器注入

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同时使用
-->

构造器注入:

在类中提供有参构造

public class UserServiceImpl implements UserService {	
    private UserDao userDao;

    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void save() {
        userDao.save();
    }
 }

配置Spring容器调用有参构造时进行注入

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
    <!-- 使用构造方法,把userDao对象,注入userService中 -->
    <constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>

集合类型数据注入

list
<property name="al">
    <list>
        <value>itheima</value>
        <value>66666</value>
        <!--如果集合元素是对象,则可以注入对象(直接创建新对象)-->
        <bean class="com.itheima.domain.User"/>
        <!--如果集合元素是对象,则可以注入对象(引入已经创建的对象)-->
        <ref bean="u1"/>
    </list>
</property>
rops
<property name="properties">
    <props>
        <prop key="name">itheima666</prop>
        <prop key="value">666666</prop>
    </props>
</property>
array
<property name="arr">
    <array>
        <value>123456</value>
        <value>66666</value>
    </array>
</property>
set
 <property name="hs">
     <set>
         <value>itheima</value>
         <value>66666</value>
     </set>
</property>
map
<property name="hm">
    <map>
        <entry key="name" value="itheima66666"/>
        <entry key="value" value="6666666666"/>
    </map>
</property>

引入properties文件

  • Spring 提供了读取外部 properties 文件的机制,使用读取到的数据为 bean 的属性赋值

操作步骤

  • 准备外部 properties 文件
  • 开启 context 命名空间支持
xmlns:context="http://www.springframework.org/schema/context"
  • 加载指定的 properties 文件
<context:property-placeholder location="classpath:filename.properties">
  • 使用加载的数据
<property name="propertyName" value="${propertiesName}"/>

注意:

  • 如果需要加载所有的properties文件,可以使用*.properties表示加载所有的properties文件
  • 读取数据使用${propertiesName}格式进行,其中propertiesName指properties文件中的属性名

import 标签

  • 归属:beans标签
  • 作用:在当前配置文件中导入其他配置文件中的项
  • 格式:
<beans>
    <import/>
</beans>
  • 基本属性:
<import resource="config.xml"/>
<!-- resource:加载的配置文件名 -->
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页