80.【Spring5】(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 80.【Spring5】

(一)、Spring 简介

https://springref.com/

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#spring-core

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。

1.历史:

2022年: Spring 雏形形成。

2004年,Spring 一代正式发布。

2.Spring 目的

是现有的技术更加简单,本身是一个大杂烩,整合了现有的技术框架

SSH : Struct2 + Spring + Hibernate

SSM: SpringMvc+ Spring + Mybatis

3.Spring 引入

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.0</version>
</dependency>

4.优点

  • Spring 是一个免费开源的网站
  • Spring 是一个轻量级的,非入侵式的框架
  • 控制反转(IOC) ,面向切面编程(AOP)
  • 支持事务的处理,对框架整合的支持
    Spring 就是一个轻量级的控制反转(IOC)和切面编程(AOP)的框架

5.Spring 七大模块组成:

6.扩展(约定大于配置)

  • SpringBoot 一个快速开发的脚手架,可以快速开发一个微服务
  • SpringCloud 是基于SpringBoot实现的
  • 学习SpringBoot 的前提是完全掌握 SpringMVC Spring

(二)、IOC理论推导(Inversion of Contro)

1.以前的三层分级

  • Dao : 用于处理数据库的语句信息
    Dao层接口
package Com.Jsxs.Dao;
public interface UserDao {
    void getUser();
}

Dao层实现类01

package Com.Jsxs.Dao;
public class UserDaoImpl implements UserDao{
    @Override
    public void getUser() {
        System.out.println("用户信息,被查询");
    }
}

Dao层实现类02

package Com.Jsxs.Dao;
public class MysqlUserDaoImpl implements UserDao{
    @Override
    public void getUser() {
        System.out.println("mysql 调用用户数据");
    }
}
  • Servic :e 用于连接数据库,调用Dao
    业务接口层
package Com.Jsxs.Service;
public interface UserService {
    void getUser();
}

死型业务接口实现类

package Com.Jsxs.Service;
import Com.Jsxs.Dao.UserDao;
import Com.Jsxs.Dao.UserDaoImpl;
public class UserServiceImpl implements UserService{
    private UserDao userDao;
//   程序写死的状态
  public UserServiceImpl() {
       userDao=new UserDaoImpl();
  }
    @Override
    public void getUser() {
        userDao.getUser();
    }
}

活性业务层实现类(现在)

package Com.Jsxs.Service;
import Com.Jsxs.Dao.UserDao;
import Com.Jsxs.Dao.UserDaoImpl;
public class UserServiceImpl implements UserService{
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    @Override
    public void getUser() {
        userDao.getUser();
    }
}
  • Servlet :用于调用Service 层

2.现在对三层架构的更新

我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改代码。如果代码的数据量非常庞大,那么修改代码的成本的价值非常昂贵!!

利用 set 实现数据的动态注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

程序的控制权由(ServiceImpl层) 转向了 (Servlet层);程序员----》用户自己

这种思想,从本质上解决了问题,我们程序员不用再去管理对象的创建了,系统的耦合性(关联)大大降低,可以更加的专注于业务的实现。

这一操作 实现了IOC控制权的反转

3.什么是IOC

ioc是由spring来负责控制对象的生命周期和对象间的关系。ioc容器(Inversion of Control,控制反转)是spring的核心,贯穿始终。Ioc意味着将你设计好的对象交给容器控制,主要控制了外部资源获取。

  • 控制反转是一种通过描述(XML 或 注解) 并通过第三方去生产或获取特定对象的方式,在Spring 中控制反转的是IOC容器,其实现方法是依赖注入(Dependency injection , DI)

(三)、HelloSpring

1.怎么使用Spring?

(1). 导入Spring 的版本jar包
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>6.0.2</version>
</dependency>
(2).导入资源文件包(XMI)

(3).编写配置文件
使用Spring 来创建对象,在Spring 这些都称为Bean
    bean: 就是对象; ===> new Hello();
    id: 就是变量名;
    class :全限定名
    property: 相当于给对象中的属性赋值
    name : 键,给谁赋值?
    value : 值,赋值什么
    contex.getBean(" id ")

<?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 来创建对象,在Spring 这些都称为Bean
        bean: 就是对象; ===> new Hello();
        id: 就是变量名;
        class :全限定名
        property: 相当于给对象中的属性赋值
        name : 键,给谁赋值?
        value : 值,赋值什么
-->
    <bean id="hello" class="Com.Jsxs.pojo.Hello">
<!--        name 就是 类中的变量名, value : 随便起-->
        <property name="str" value="Spring"/>
    </bean>
</beans>
(4).第一个Spring

实体类

package Com.Jsxs.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@Data
@NoArgsConstructor
public class Hello {
    private String str;
}

配置文件

<?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 来创建对象,在Spring 这些都称为Bean
        bean: 就是对象; ===> new Hello();
        id: 就是变量名;
        class :全限定名
        property: 相当于给对象中的属性赋值
        name : 键,给谁赋值?
        value : 值,赋值什么
-->
    <bean id="hello" class="Com.Jsxs.pojo.Hello">
<!--        name 就是 类中的变量名, value : 随便起-->
        <property name="str" value="Spring"/>
    </bean>
</beans>

测试

import Com.Jsxs.pojo.Hello;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.ApplicationContext;
public class MyTest {
    public static void main(String[] args) {
//        绑定 beans.xml 配置文件 ,并获取Spring上下文的对象
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//        我们的对象现在都在Spring 中 进行管理了,我们要使,直接进去取出来就可以了
        Hello hello =(Hello) context.getBean("hello");
        System.out.println(hello.toString());
    }
}

2.雏形项目

Dao层接口

package Com.Jsxs.Dao;
public interface UserDao {
    void getUser();
}

Dao层实现类1

package Com.Jsxs.Dao;
public class MysqlUserDaoImpl implements UserDao{
    @Override
    public void getUser() {
        System.out.println("mysql 调用用户数据");
    }
}

Dao层实现类2

package Com.Jsxs.Dao;
public class UserDaoImpl implements UserDao{
    @Override
    public void getUser() {
        System.out.println("用户信息,被查询");
    }
}

Service接口

package Com.Jsxs.Service;
public interface UserService {
    void getUser();
}

Service接口的实现类一定要设置set 方法

package Com.Jsxs.Service;
import Com.Jsxs.Dao.UserDao;
import Com.Jsxs.Dao.UserDaoImpl;
public class UserServiceImpl implements UserService{
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    @Override
    public void getUser() {
        userDao.getUser();
    }
}

Spring配置文件

ref : 引用Spring 中已经创建好的对象
value : 具体的值  ,赋值;基本数据类型。
<?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="mysqlDaI" class="Com.Jsxs.Dao.MysqlUserDaoImpl"/>
    <bean id="userDaI" class="Com.Jsxs.Dao.UserDaoImpl"/>
    <bean id="userSev" class="Com.Jsxs.Service.UserServiceImpl">
<!--
        ref : 引用Spring 中已经创建好的对象
        value : 具体的值  ,赋值;基本数据类型。
-->
        <property name="userDao" ref="userDaI"/>
    </bean>
</beans>

测试

ApplicationContext context = new ClassPathXmlApplicationContext("resource 目录下的资源");
import Com.Jsxs.Dao.MysqlUserDaoImpl;
import Com.Jsxs.Service.UserService;
import Com.Jsxs.Service.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test1 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        UserService userSev = (UserService) context.getBean("userSev");
        userSev.getUser();
    }
}

3.总结:

  • 有了Spring ,我们就彻底不用在程序中去改动了,要实现不同的操作只需要在XML配置文件中进行修改,所谓的IOC,就是:对象由Spring进行创建,管理,配置。
  • 依赖注入: 就是利用set方法进行注入
  • IOC: 是一种编程思想,由主动的编程变成了被动的编程
  • 反转: 程序本身不再创建对象,转变成被动的接受对象
  • 控制: 谁来控制对象的创建。
  • 一定要存在 set 方法,Spring主要依赖于set方法进行DI注入。
  • 如果使用Spring6 ,那么JDK的版本一定要高一点
  • 如果输出中文乱码,电脑右下角输出为 GBK,不要 UTF-8

(四)、IOC对象的创建方式

1.使用无参构造函数创建对象(不存在有参)

(1).反列(没有设置无参构造函数)
package Com.Jsxs.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
public class User {
    private String name;
    public User(String name){
        System.out.println("有参构造函数!!");
    }
    public void show(){
        System.out.println("name="+name);
    }
}

(2).正列 (有设置无参构造函数,没有设置有参构造)

实体类

package Com.Jsxs.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
public class User {
    private String name;
    public User(){
        System.out.println("无参构造函数!!");
    }
    public void show(){
        System.out.println("name="+name);
    }
}

配置

<?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="user" class="Com.Jsxs.pojo.User">
            <property name="name" value="吉士先生"/>
        </bean>
</beans>

测试

import Com.Jsxs.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        User user = (User) context.getBean("user");
        user.show();
    }
}


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
存储 缓存 网络协议
dpdk课程学习之练习笔记二(arp, udp协议api测试)
dpdk课程学习之练习笔记二(arp, udp协议api测试)
304 0
|
存储 前端开发 JavaScript
医院电子病历编辑器源码 (java语言)
电子病历(EMR,Electronic Medical Record)是用电子技术保存、管理、传输和重现的数字化的病人的医疗记录,取代手写纸张病历,将医务人员在医疗活动过程中,使用医疗机构管理系统生成的文字、符号、图表、图形、数据、影像等数字化内容,并能实现存储、管理、传输和重现的医疗记录,是病历的一种记录形式。
370 1
|
数据安全/隐私保护
fastadmin是如何设置没有权限的用户不能访问某些页面的?
fastadmin是如何设置没有权限的用户不能访问某些页面的?
849 0
|
11月前
|
数据采集 自然语言处理 UED
文档智能和检索增强生成(RAG)技术
文档智能和检索增强生成(RAG)技术
|
12月前
|
开发工具 git
IDEA更改远程git仓库地址
【9月更文挑战第27天】本文介绍了两种在IntelliJ IDEA中更改远程Git仓库地址的方法:一是通过图形界面,在VCS设置中直接修改;二是通过IDEA内置的命令行工具使用`git`命令进行更改。具体步骤包括从版本控制菜单进入项目设置、修改远程仓库URL,以及使用`git remote set-url`命令更新仓库地址,并验证修改结果。这些方法适用于项目迁移或更换仓库地址的情况。
2133 6
|
编解码 算法 jenkins
【MATLAB 】 小波分解-ARIMA联合时序预测算法,科研创新优选算法
【MATLAB 】 小波分解-ARIMA联合时序预测算法,科研创新优选算法
361 0
|
运维 监控 Linux
"熬夜达人揭秘:Linux系统崩溃前夜,如何用这几行代码救局?监控与排查全攻略!"
【8月更文挑战第19天】作为常需熬夜的系统管理员,面对Linux系统问题时,我总结了一套实用的监控与排查方法。通过使用`top`监控CPU使用率、`free`检查内存状况、`iostat`监测磁盘I/O、及`iftop`观察网络流量,结合`ps`、`pmap`和`strace`等工具深入分析,可有效识别并解决系统瓶颈,减少故障处理时间,保障系统稳定运行。
115 0
|
数据库 Android开发 数据库管理
java.lang.NullPointerException: Attempt to invoke virtual method ‘int android.database.sqlite异常
java.lang.NullPointerException: Attempt to invoke virtual method ‘int android.database.sqlite异常
658 0
|
架构师 Java 关系型数据库
工作流框架--Activiti6.0(一)
工作流框架--Activiti6.0(一)
324 0
|
数据采集 Web App开发 iOS开发
爬取B站评论:Python技术实现详解
爬取B站评论:Python技术实现详解

热门文章

最新文章