1 spring简介

1.1 什么是框架

框架是一个封装了很多功能和模块的程序的半成品。

可以理解为是一个由很多工具类组合而成的一个工具包。

框架可以提高我们的开发效率

1.2 spring是什么

Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架。是Java开发的灵魂框架。

Spring有两大内核:

IOC(Inverse Of Control:控制反转)

AOP(Aspect Oriented Programming:面向切面编程)

1.3 spring的主要功能

IOC: 控制反转,其实就是把对象的创建权,交给spring,由Spring负责给我们创建对象

DI: 依赖注入,其实就是给对象的成员变量赋值。(di隶属于ioc)

AOP: 面向切面编程,底层就是动态代理

事务: Spring提供了声明式事务,也就是说,我们可以通过配置的方式来添加事务。

2 一个简单案例

2.1 Spring程序开发步骤

①导入 Spring 开发的基本包坐标(5.1.9.release)

②创建Spring核心配置文件

③在 Spring 配置文件中配置要创建的对象

④通过spring获取资源(获取创建的对象)

2.2 案例实现

① 导入坐标

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

② 创建Spring核心配置文件,③配置

<?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">
    
    <!-- 1.创建spring控制的资源(让spring帮忙创建该类的对象)-->
    <bean id="userService" class="com.itheima.service.impl.UserServiceImpl"/>
    
</beans>

④ 通过spring获取资源(获取创建的对象)

public class UserApp {
    public static void main(String[] args) {
        //1.加载配置文件
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.获取资源
        UserService userService = (UserService) ctx.getBean("userService");
        //3.调用方法
        userService.save();
    }
}

3 IOC配置-XML格式

3.1 Bean标签基本配置

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

格式:

<beans>
	<bean 属性名="属性值" ></bean>
</beans>

3.2 常见属性

属性名

说明

id

Bean实例在Spring容器中的唯一标识,通过id值获取bean

class

Bean的类型, spring创建的就是该类的对象

name

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

3.3 其他属性

3.3.1 scope
  • 格式:
<bean scope="singleton"></bean>
  • 取值:
  • singleton:设定创建出的对象保存在spring容器中,是一个单例的对象,
  • prototype:设定创建出的对象保存在spring容器中,是一个多例的对象
3.3.2 生命周期
  • 格式:
<bean init-method="bean初始化时执行的方法" destroy-method="bean销毁时执行的方法"></bean>
  • 结论:
  • 当scope=“singleton”时,对象会在配置文件被加载的时候,直接创建.
  • 当scope=“prototype”时,只有在获取对象的时候,才会创建对象

3.4 对象创建方式

1) 使用无参构造方法实例化

默认调用无参构造方法创建对象,如果bean中没有默认无参构造函数,将会创建失败

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

2) 工厂静态方法实例化

工厂静态方法实例化, 指的是在创建对象的时候,是通过调用某个类的静态方法才能创建对象.

例如:

LocalDate now = LocalDate.now();

<!-- LocalDate now = LocalDate.now();  -->
<bean id="now" class="java.time.LocalDate" factory-method="now"/>

3) 工厂实例方法实例化

工厂实例方法实例化, 指的是在创建对象的时候, 需要通过其他类的对象才能创建对象.

例如:

LocalDate now = LocalDate.now();

DayOfWeek dayOfWeek = now.getDayOfWeek();

<!-- LocalDate now = LocalDate.now();  -->
<bean id="now" class="java.time.LocalDate" factory-method="now"/>

<!-- DayOfWeek dayOfWeek = now.getDayOfWeek();  -->
<bean id="dayOfWeek" factory-bean="now" factory-method="getDayOfWeek"/>

4. 依赖注入-DI

4.1 概述

依赖注入(Dependency Injection):是SpringIOC的具体体现,简单来说,就是给对象的属性赋值

4.2 Bean的依赖注入方式

4.2.1 Set方法赋值

①在UserServiceImpl中添加setUserDao方法

public class UserServiceImpl implements UserService {
    private UserDao userDao;
 
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;  
    } 
    
    @Override    
    public void save() {      
   		 userDao.save();
	}
}

②配置Spring容器调用set方法进行注入

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

①在类中提供有参构造

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>

4.3 集合类型数据注入

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