Spring入门基础总结一

25 篇文章 1 订阅

0 IDEA创建maven工程

  1. 打开IDEA,选择New Project,选择Java点击Next

  1. 输入项目名即路径

  1. 右键Spring项目,选择New->Moudle

  1. 在左侧选择框点击Maven,点击Next

  1. 填写信息,点击Next

  1. 点击Finish

至此,一个Maven项目创建完成,但是还需要进行最后的Maven配置(可参考上一篇文章),选择Maven路径,点击OK

1 什么是Spring

1.1 概述

​ Spring是分为层的Java SE/EE应用full-stack轻量级开源框架,以IoC(控制反转)和AOP(面向切面编程)为内核。

​ 提供了展现层SpringMVC和持久层Spring JDBCTemplate以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的JavaEE企业应用开源框架。

1.2 优势

  • 方便解耦,简化开发
  • AOP编程的支持
  • 声明式事务的支持
  • 方便程序的测试

2 Spring快速入门

2.1 Spring程序开发步骤

    1. 导入Spring开发的基本包坐标
    1. 编写Dao接口和实现类
    1. 创建Spring核心配置文件
    1. 在Spring配置文件中配置UserDaoImpl
    1. 使用Spring的API获得Bean实例

2.2 实操演示

2.2.1 导入Spring开发的基本包坐标

在pom.xml里面添加代码:

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

2.2.2 编写Dao接口和实现类

在src->main->java文件夹下面创建com.itcast.dao包,编写Dao接口,

UserDao代码:

package com.itcast.dao;

public interface UserDao {
    void save();
}

UserDaoImpl代码:

package com.itcast.dao.impl;

import com.itcast.dao.UserDao;

public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("UserDao save method running....");
    }
}

2.2.3 创建Spring核心配置文件

在类路径下{resource}创建applicationContext.xml配置文件(约定俗成的写法),右键创建spring选择New->Xml Configration file->Srping config:

<?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">

</beans>

这里可能会出现一个警告提示:application context not configured for this file,解决方案:

  • 打开file->Project Structure选择Moudles,依次点击spring和右边的加号

image-20201014092824369

选中该配置文件点击ok

image-20201014092920112

后面直接ok就行。

2.2.4 在配置文件中配置UserDaoImpl

<?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">
        <bean id="userDao" class="com.itcast.dao.impl.UserDaoImpl"></bean>
</beans>
  • 注:bean中的id=“userDao”是唯一标识,方便在其他地方调用时直接找该唯一id即可。

2.2.5 使用Spring的API获得Bean实例

package com.itcast.demo;

import com.itcast.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Demo {
    @Test
    public void test1(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
        userDao.save();
    }
}
  • 注:getBean里面的参数就是配置文件中的id,注意要一致!

运行该测试将会在控制台打印:UserDao save method running…

3 配置文件

3.1 Bean标签基本配置

功能:用于配置对象交由Spring来创建。默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。

基本属性:

  • id:Bena实例在Spring容器中的唯一标识
  • class:Bean的全限定名称

3.2 Bean标签范围配置

scope:指对象的作用范围,常用的两个取值

取值范围说明
singleton默认值,表示单例的
prototype多例的
  1. 当scope的取值为singleton时

    Bean的实例化个数:1个

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

    Bean的生命周期:

    ​ 对象创建:当应用加载,创建容器时,对象就被创建了

    ​ 对象运行:只要容器在,对象一直活着

    ​ 对象销毁:当应用卸载,销毁容器时,对象就被销毁了

    1. 当scope的取值为prototype时
      Bean的实例化个数:多个
      Bean的实例化时机:当调用getBean()方法时实例化Bean

    Bean的生命周期

    ​ 对象创建:当使用对象时,创建新的对象实例
    ​ 对象运行:只要对象在使用中,就一直活着
    ​ 对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了

3.3 Bean生命周期配置

init-method:指定类中的初始化方法名称

destroy-method:指定类中销毁方法名称

3.4 Bean实例化三种方式

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

3.5 Bean的依赖注入

首先,创建UserService,内部调用UserDao的save方法

public class UserServiceImpl implements UserService {
    public void save() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicaionContext.xml");
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
        userDao.save();
    }
}

创建一个假的web层进行测试:

package com.itcast.demo;

import com.itcast.service.UserService;
import com.itcast.service.impl.UserServiceImpl;

public class UserController {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        userService.save();
    }
}

这里是new了一个UserServiceImpl,并没有从spring容器中获得,spring的开发过程应该是下图这样:

image-20201014101925665

因此,我们要将UserServiceImpl的创建权交给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 http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="userDao" class="com.itcast.dao.impl.UserDaoImpl"/>
    <bean id="userService" class="com.itcast.service.impl.UserServiceImpl"/>
</beans>

配置好之后,UserController的代码就可以改成如下写法了:

public class UserController {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) applicationContext.getBean("userService");
        userService.save();
    }
}

3.5.1 依赖注入概念及分析

​ 依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现。
​ 在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。
​ IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。
​ 那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。
​ 简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。

​ 在上面的例子中,结构图如下所示:

image-20201014102803357

其中,业务层和持久层都需要我们去获取,为了降低耦合性,我们可以在spring容器中让业务层去调用持久层。结构图如下:

image-20201014103433119

3.5.2 Bean的依赖注入方式

  1. 构造方法
  2. set方法

第一种方法:构造方法,UserServiceImpl类改下如下:

public class UserServiceImpl implements UserService {
    private UserDao userDao;  // 容器当中的dao

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

    public UserServiceImpl() {
    }

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

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

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>

注意:name是有参构造方法的参数名,ref是容器里bean的id的引用!

第二种方法:使userDao对象在UserService里通过set方法获取。此时,UserServiceImpl类可以改写为如下:

public class UserServiceImpl implements UserService {
    private UserDao userDao;  // 容器当中的dao
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    public void save() {
        userDao.save();
    }
}

这样之后,service层就不用getBean(“userDao”)了,所以还要在spring容器内把dao通过set方法注入给service,配置如下:

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>

如上,只需要在userService的配置中增加一个property属性,注意:property属性的name指的是属性名(即set方法setUserDao把set去掉,U变小写后的名userDao),ref的值指的是对象的引用(这里是容器当中的id为userDao的对象)。

set方法简化操作:p命名空间注入。需要引入p命名空间:

xmlns:p="http://www.springframework.org/schema/p"

然后,修改注入方式:

<bean id="userService" class="com.itheima.service.impl.UserServiceImpl" p:userDao-ref="
userDao"/>

4 Spring相关API

4.1 ApplicationContext的继承体系

applicationContext:接口类型,代表应用上下文,可以通过其实例获得 Spring 容器中的 Bean 对象

4.2 ApplicationContext的实现类

1)ClassPathXmlApplicationContext
它是从类的根路径下加载配置文件 推荐使用这种
2)FileSystemXmlApplicationContext
它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
3)AnnotationConfigApplicationContext
a.service.impl.UserServiceImpl" p:userDao-ref="
userDao"/>


# 4 Spring相关API

## 4.1 ApplicationContext的继承体系

applicationContext:接口类型,代表应用上下文,可以通过其实例获得 Spring 容器中的 Bean 对象

## 4.2 ApplicationContext的实现类

1)ClassPathXmlApplicationContext
它是从类的根路径下加载配置文件 推荐使用这种
2)FileSystemXmlApplicationContext
它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
3)AnnotationConfigApplicationContext
当使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值