首页 > 其他分享 >Spring框架学习

Spring框架学习

时间:2023-04-05 22:47:38浏览次数:40  
标签:UserDao 框架 Spring void 学习 Bean save public

一、第一部分:SpringIoC & DI

1. Spring概述

1.1 Spring是什么

(1)Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架;

(2)Spring 以 IoC 和 AOP 为内核;

  • Inverse Of Control:反转控制
  • Aspect Oriented Programming:面向切面编程

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

1.2 Spring发展历程

(1)Spring 之父:Rod Johnson

(2)Spring 发布时间:

  • 2004 年 03 月,1.0 版发布

  • 2006 年 10 月,2.0 版发布

  • 2007 年 11 月更名为 SpringSource,同时发布了 Spring 2.5

  • 2009 年 12 月,Spring 3.0 发布

  • 2013 年 12 月,Pivotal 宣布发布 Spring 框架 4.0

    • 2014 年 4 月 Spring Boot 1.0.0
  • 2017 年 09 月,Spring 5.0 发布

    • 2018 年 3 月 Spring Boot 2.0.0
    • 2022 年 2 月 Spring Boot 2.6.4

1.3 Spring的优势

  • 方便解耦,简化开发

  • AOP 编程的支持

  • 声明式事务的支持

  • 方便程序的测试

1.4 Spring的体系结构

2. Sring 快速入门

2.1 Spring 程序开发步骤

(1)导入 Spring 开发的基本包坐标

(2)编写 Dao 接口和实现类

(3)创建 Spring 核心配置文件

(4)在 Spring 配置文件中配置 UserDaoImpl

(5)使用 Spring 的 API 获得 Bean 实例

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

<properties>
	<spring.version>5.0.5.RELEASE</spring.version>
</properties>

<!--导入spring的context坐标,context依赖core、beans、expression-->
<dependencies> 
    <dependency>  
        <groupId>org.springframework</groupId> 
        <artifactId>spring-context</artifactId> 
        <version>${spring.version}</version>
    </dependency>
</dependencies>

2.3 编写Dao接口和实现类

public interface UserDao {  
    public void save();
}

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

2.4 创建Spring核心配置文件

在类路径下(resources)创建 applicationContext.xml 配置文件

2.5 在 Spring 配置文件中配置 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.itheima.dao.impl.UserDaoImpl"/>

</beans>

2.6 使用Spring的API获得Bean实例

@Test
public void test01() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserDao userDao = (UserDao) applicationContext.getBean("userDao");
    userDao.save();
}

3. Spring配置文件

3.1 Bean标签基本配置

(1)bean 标签的作用:用于配置对象交由 Spring 来创建;

(2)bean 标签在 Spring 创建对象中的原理:默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功;

(3)bean 标签的基本属性:

  • id:Bean实例在Spring容器中的唯一标识

  • class:Bean的全限定名称

3.2 Bean 标签范围配置

scope:指对象的作用范围,取值如下:

取值范围 说明
singleton 默认值,单例的
prototype 多例的
request WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中
session WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中
global session WEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当于 session

(1)当 scope 的取值为 singleton 时:

  • Bean 的实例化个数:1个

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

  • Bean 的生命周期:

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

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

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

(2)当 scope 的取值为 prototype 时

  • Bean的实例化个数:多个

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

  • 对象创建:当使用对象时,创建新的对象实例

  • 对象运行:只要对象在使用中,就一直活着

  • 对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了

3.3 Bean生命周期配置

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

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

3.4 Bean实例化三种方式

(1)无参构造方法实例化

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

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

(2)工厂静态方法实例化

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

public class StaticFactoryBean {
    public static UserDao createUserDao() {
        return new UserDaoImpl();
    }
}
<bean id="userDao" class="com.itheima.factory.StaticFactoryBean" factory-method="createUserDao"/>

(3)工厂实例方法实例化

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

public class DynamicFactoryBean {
    public UserDao createUserDao() {
        return new UserDaoImpl();
    }
}
<bean id="factoryBean" class="com.itheima.factory.DynamicFactoryBean"/>
<bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>

3.5 Bean的依赖注入入门

(1)创建 UserService,UserService 内部在调用 UserDao的save() 方法

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

(2)将 UserServiceImpl 的创建权交给 Spring

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

(3)从 Spring 容器中获得 UserService 进行操作

@Test
public void test02() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserService userService = (UserService) applicationContext.getBean("userService");
    userService.save();
}

3.6 Bean的依赖注入概念

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

在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。

IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。

那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。

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

3.7 Bean的依赖注入方式

(1)有参构造方法注入

  • 创建有参构造
public class UserServiceImpl implements UserService {
    private UserDao userDao;

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

    // 这里如果利用无参构造方法创建对象,那这个对象中就没有UserDao对象,userDao.save()会报控制在异常
    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>

(2)set 方法注入

  • 在 UserServiceImpl 中添加 setUserDao 方法
public class UserServiceImpl implements UserService {
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    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">
    <property name="userDao" ref="userDao"></property>
</bean>

(3)set 方法注入:p 命名空间注入

p 命名空间注入本质也是 set 方法注入,但比起上述的 set 方法注入更加方便,主要体现在配置文件中,如下:

  • 首先,需要引入P命名空间:
xmlns:p="http://www.springframework.org/schema/p"

  • 其次,需要修改注入方式
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl" p:userDao-ref="userDao"/>

3.8 Bean的依赖注入的数据类型

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

  • 普通数据类型

  • 引用数据类型

  • 集合数据类型

其中引用数据类型,此处就不再赘述了,之前的操作都是对 UserDao 对象的引用进行注入的,下面将以 set 方法注入为例,演示普通数据类型和集合数据类型的注入。

Bean的依赖注入的数据类型

(1)普通数据类型的注入

public class UserDaoImpl implements UserDao {
    private String company;

    private int age;

    public void setCompany(String company) {
        this.company = company;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void save() {
        System.out.println(company + "===" + age);
        System.out.println("UserDaoImpl save running....");
    }
}
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
    <property name="company" value="传智播客"></property>
    <property name="age" value="15"></property>
</bean>

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

(2)集合数据类型(List)的注入

public class UserDaoImpl implements UserDao {
    private List<String> strList;

    public void setStrList(List<String> strList) {
        this.strList = strList;
    }
    
    public void save() {
        System.out.println(strList);
        System.out.println("UserDaoImpl save running....");
    }
}
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
    <property name="strList">
        <list>
            <value>aaa</value>
            <value>bbb</value>
            <value>ccc</value>
        </list>
    </property>
</bean>

(3)集合数据类型(List)的注入

public class UserDaoImpl implements UserDao {
	private List<User> userList;
	public void setUserList(List<User> userList) {
	this.userList = userList;  
 }
public void save() {
	System.out.println(userList);
	System.out.println("UserDao save method running....");
	}
}
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
    <property name="userDao" ref="userDao"></property>
</bean>

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
    <property name="strList">
        <list>
            <value>aaa</value>
            <value>bbb</value>
            <value>ccc</value>
        </list>
    </property>
</bean>

(4)集合数据类型( Map<String, User> )的注入

public class User {
    private int age;

    private String address;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}
public class UserDaoImpl implements UserDao {
    private Map<String, User> userMap;

    public void setUserMap(Map<String, User> userMap) {
        this.userMap = userMap;
    }

    public void save() {
        System.out.println(userMap);
        System.out.println("UserDaoImpl save running....");
    }
}
<?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="userService" class="com.itheima.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"/>
    </bean>
    <bean id="user1" class="com.itheima.bo.User">
        <property name="age" value="20"/>
        <property name="address" value="shanghai"/>
    </bean>
    <bean id="user2" class="com.itheima.bo.User">
        <property name="age" value="22"/>
        <property name="address" value="nanjing"/>
    </bean>
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
        <property name="userMap">
            <map>
                <entry key="u1" value-ref="user1"/>
                <entry key="u2" value-ref="user2"/>
            </map>
        </property>
    </bean>
</beans>

[ ]

(5)集合数据类型(Properties)的注入

public class UserDaoImpl implements UserDao {
    private Properties properties;
    
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
    
	public void save() {
        System.out.println(properties);
        System.out.println("UserDaoImpl save running....");
	}
}
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
    <property name="properties">
        <props>
            <prop key="p1">ppp1</prop>
            <prop key="p2">ppp2</prop>
            <prop key="p3">ppp3</prop>
        </props>
    </property>
</bean>

3.9 引入其他配置文件(分模块开发)

实际开发中,Spring 的配置内容非常多,这就导致 Spring 配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在 Spring 主配置文件通过 import标签进行加载

<import resource="applicationContext-xxx.xml"/>

4. spring 相关API

4.1 ApplicationContext 的继承体系

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

4.2 ApplicationContext 的实现类

(1)ClassPathXmlApplicationContext

它是从类的根路径下加载配置文件,推荐使用这种

(2)FileSystemXmlApplicationContext

它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。例如:

public class UserController {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new FileSystemXmlApplicationContext("D:\\Study\\Project\\Spring\\itheima_spring_ioc\\src\\main\\resources\\applicationContext.xml");
		UserService userService = (UserService) applicationContext.getBean("userService");
        userService.save();
    }
}

(3)AnnotationConfigApplicationContext

当使用注解配置容器对象时,需要使用此类来创建 spring 容器,它用来读取注解。

4.3 getBean() 的方法使用

public Object getBean(String name) throws BeansException {  
	assertBeanFactoryActive();   
	return getBeanFactory().getBean(name);
}
public <T> T getBean(Class<T> requiredType) throws BeansException {   			    		assertBeanFactoryActive();
	return getBeanFactory().getBean(requiredType);
}

其中,当参数的数据类型是字符串时,表示根据Bean的id从容器中获得Bean实例,返回是Object,需要强转。

当参数的数据类型是Class类型时,表示根据类型从容器中匹配Bean实例,当容器中相同类型的Bean有多个时,则此方法会报错

getBean()方法使用

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService1 = (UserService) applicationContext.getBean("userService");
UserService userService2 = applicationContext.getBean(UserService.class);

标签:UserDao,框架,Spring,void,学习,Bean,save,public
From: https://www.cnblogs.com/wqr2023/p/17291193.html

相关文章

  • SpringBoot启动流程
    启动类@SpringBootApplicationpublicclassApp{publicstaticvoidmain(String[]args){ SpringApplication.run(App.class,args);}}@SpringBootApplication对于一个SpringBoot程序的启动首先需要一个加了@SpringBootApplication注解的启动类。@Spr......
  • Java Stream学习笔记(一)
    JavaStream学习笔记Stream是Java8API添加的一个新的抽象,称为流Stream,以一种声明性方式处理数据集合(侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式)。一、特点1、代码简洁:函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环。2、多核友好......
  • 摸索使用Multisim_v11仿真学习电池组的串、并联_1
     想仿真1个6串8并的电池组(18650电池),这是我第1次摸索使用Multisim仿真软件,虽然这个软件躺在我的硬盘中至少有5年了,但没真正使用过有意义哪怕是简单的仿真仿真串联没问题,仿真并联失败Multisim_v11,无聊没事玩仿真,1.2个18650电池的串联, 仿真并联失败,网上寻求答案说:电池不能直......
  • 转载自团队博客:基于深度学习的人脸识别会议签到系统
    电梯演讲:https://www.bilibili.com/video/BV1kc411W7w4?t=9.9原型:1,主界面  2,会议管理  3,人员管理  4,会议室管理......
  • 【重要】Nginx模块Lua-Nginx-Module学习笔记(三)Nginx + Lua + Redis 已安装成功(非open
    一、目标使用Redis做分布式缓存;使用luaAPI来访问redis缓存;使用nginx向客户端提供服务,ngx_lua将lua嵌入到nginx,让nginx执行lua脚本,高并发,非阻塞的处理各种请求。url请求nginx服务器,然后lua查询redis,返回json数据。二、准备工作系统环境:Ubuntu14.0(64位)Redis服务安装:ap......
  • 【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种
    说明:很简单一个在HTTP模块中,而另外一个和HTTP是并列的Stream模块(Nginx1.9.0支持)一、两个模块的最简单配置如下1、HTTP负载均衡:http{includemime.types;default_typeapplication/octet-stream;upstreamlive_node{server127.0.......
  • 流媒体技术学习笔记之(十二)Linux(Ubuntu)环境运行EasyDarwin
     Debug问题???./easydarwin-c./easydarwin.xml&//这样的话是80端口./easydarwin-c./easydarwin.xml-d//8088端口 以上出现的问题:在调试模式下加载配置文件是可以的,但是在后台模式下配置文件是加载不了的,列如:在配置文件配置后台管理端口为8088,当时在后台模式......
  • 流媒体技术学习笔记之(十一)Windows环境运行EasyDarwin
     流媒体平台框架下载安装Github下载下载地址:https://github.com/EasyDarwin/EasyDarwin/releases解压安装选择Windows安装平台的安装包(下载解压) 把解压生成的文件夹重命名放在本地磁盘,我这里测试放在E盘: 介绍其中的来个批处理文件:start.batWindows调试运......
  • 流媒体技术学习笔记之(七)进阶教程OBS参数与清晰度流畅度的关系
     源码地址:https://github.com/Tinywan/PHP_Experience 很多主播问过OBS的参数到底什么影响画质,到底什么影响流畅度,那么本篇教程尽量用通俗的语言解释下一些重要参数到底是干什么的,自己一定要理解为主,每个主播的电脑、所在的平台、当天的网络状态(注意网络就和马路一样,每天的情......
  • 流媒体技术学习笔记之(六)FFmpeg官方文档先进音频编码(AAC)
     先进音频编码(AAC)的后继格式到MP3,和以MPEG-4部分3(ISO/IEC14496-3)被定义。它通常用于MP4容器格式; 对于音乐,通常使用.m4a扩展名。第二最常见的用途是在MKV(Matroska)文件内,因为它比MP4更好地支持嵌入式基于文本的软字幕。本指南中的示例将使用扩展MP4和M4A。FFmpeg的可支持两个AA......