Spring1

一、简介:

Spring : 为简化开发而生,但是后期由于各类组件的增多,使得其配置过于繁琐,本身就是一个大杂烩 , 整合现有的框架技术,渐渐的被称为了”配置地狱”。

2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。

2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版。Rod Johnson悉尼大学的博士,然而他的专业不是计算机,而是音乐学。

官网 : http://spring.io/

官方下载地址 : https://repo.spring.io/libs-release-local/org/springframework/spring/

GitHub : https://github.com/spring-projects

总结: Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。

二、组成:七大模块。

1.组成简介:Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。

Spring1

2.七大模块的功能

*
核心容器:核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,是工厂模式的实现。BeanFactory使用控制反转(IOC)将程序的配置和依赖性规范与实际的程序代码分开。
Spring Context:是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如 电子邮件、国际化、校验和调度功能。
Spring AOP:通过配置管理特性,Spring AOP模块直接将面向切面的编程功能集成到了Spring框架中。使其可以很容易地使 Spring 框架管理任何支持 AOP的对象。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。
Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
Spring ORM:Spring框架提供了与ORM的对象关系工具,其中包括Hibernate和iBatis SQL Map。所有这些都遵从Spring的通用事务和DAO异常层次结构。
Spring Web 模块:Web上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring框架支持与Jakarta Struts的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
Spring MVC 框架:MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的,MVC容纳了大量视图技术,包括JSP、Tiles、iText 和 POI等。

3.拓展小知识:

springboot:构建一切+springCloud:协调一切+springCloud Data Flow:连接一切=你的APP(如今比较火的微服务开发架构)

三、IOC理论推导

1.原始web项目开发方法:servlet调业务层,业务层调Dao层,Dao层从数据库取数据

1.1:UserDao接口

package com.xiaoma.dao;

public interface UserDao {
    void getUser();
}

1.2:UserDao接口的实现类

package com.xiaoma.dao;

public class UserDaoImpl implements UserDao{
    @Override
    public void getUser() {
        System.out.println("获取用户数据");
    }
}

1.3:UserService接口

package com.xiaoma.service;

public interface UserService {
    void getUser();
}

1.4:UserService接口的实现类

package com.xiaoma.service;

import com.xiaoma.dao.UserDao;

public class UserServiceImpl implements UserService{
    public UserDao userDao = new UserDaoImpl();

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

1.5:测试:结果输出Dao层的内容:”获取用户数据”

package com.xiaoma.test;

import com.xiaoma.dao.UserDaoImpl;
import com.xiaoma.service.UserService;
import com.xiaoma.service.UserServiceImpl;
import org.junit.Test;

public class MyTest {
    @Test
    public void test1(){
        UserService userService=new UserServiceImpl();
        userService.getUser();
    }
}

1.6:我如果继续增加Dao的实现类,并且要输出其它Dao实现类的内容的话就要更改Service层的内部代码,打比方我增加一个Dao为UserDaoMysqlImpl,我想要输出这个Dao实现类的内容的话就要将service层接口实现类中的new UserDaoImpl();改为new UserDaoMysqlImpl();如果这个新的Dao层和原来Dao层的接口名字不一样的话还要更改Servlet层的代码(这里就是MyTest这个类),如果我在增加一个Dao然后输出这个Dao的内容依旧要重复上面的步骤,这样的话只要增加或者更改了Dao层那么service层还有servlet层都要跟着变化,这样的话程序的耦合度就很高,牵一发而动全身,为了解决这个问题,就出现了ioc机制。IOC的一种实现方式就是通过set方法去实现,既在service层的实现类中预留出一个set接口,在servlet中用到哪个Dao就把哪个set进去就可以了。

1.7:增加的两个Dao实现类

package com.xiaoma.dao;

public class UserDaoMysqlImpl implements UserDao{
    @Override
    public void getUser() {
        System.out.println("Mysql.....");
    }
}
package com.xiaoma.dao;

public class UserDaoSQLServerImpl implements UserDao{
    @Override
    public void getUser() {
        System.out.println("SQLServer.....");
    }
}

1.8:更改后的service层实现类,在该类中增加了set方法

package com.xiaoma.service;

import com.xiaoma.dao.UserDao;

public class UserServiceImpl implements UserService{
    public UserDao userDao;

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

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

1.9:测试,并打印结果

package com.xiaoma.test;

import com.xiaoma.dao.UserDaoImpl;
import com.xiaoma.dao.UserDaoMysqlImpl;
import com.xiaoma.dao.UserDaoSQLServerImpl;
import com.xiaoma.service.UserServiceImpl;
import org.junit.Test;

public class MyTest {
    @Test
    public void test1(){
        UserServiceImpl userService=new UserServiceImpl();
        userService.setUserDao(new UserDaoImpl());
        userService.getUser();

        userService.setUserDao(new UserDaoMysqlImpl());
        userService.getUser();

        userService.setUserDao(new UserDaoSQLServerImpl());
        userService.getUser();
    }
}

Spring1

1.10:通过这中set注入的方式,将原先的程序主动创建对象变为被动的接收对象,用户每提出一个新的需求后我们不用再牵一发动全身的改service,改servlet,只需要再通过set注入就可以获取新的Dao对象,大大降低的程序的耦合性。

总结控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。还有其他方式,比如XML配置,注解的方式以及最新的spring无需配置就可以实现。

Original: https://www.cnblogs.com/XiaoMaGuai/p/16027877.html
Author: XiaoMaGuai
Title: Spring1

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/592501/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java 读写 excel 实战完全解析

    背景 时值毕业季,很多毕业生初入职场。 因此,这边也写了一些新手相关的 Android 技术点。 比如上一篇的 Android 开发你需要了解的那些事 就是列举了一些小点,避免新手…

    Java 2023年5月29日
    093
  • MybatisPlus——全网配置最全的代码生成器

    MybatisPlus代码生成器 这里讲解的是新版 (mybatis-plus 3.5.1+版本),旧版不兼容 官方文档:https://baomidou.com/(建议多看看官方…

    Java 2023年6月14日
    068
  • Springcloud学习笔记45–Java中获取当前服务器的Ip地址

    获取本地的Ip地址: InetAddress.getLocalHost().getHostAddress()在windows下没问题,在linux下是根据主机名在hosts文件对应…

    Java 2023年5月29日
    074
  • JWT- SpringBoot(19)

    在生产环境中,对发在的API增加授权保护是非常必要的。JWT作为一个无状态的授权校捡技术,非常适合于分布式系统架构。服务器端不需要保存用户状态,因此,无须采用Redis等技术来实现…

    Java 2023年6月13日
    070
  • springBoot于tomcat7搭建websocket服务

    最近在项目中需要服务端进行推送服务,于是决定使用webSocket进行双向通讯。刚开始觉得应该没问题,参考网上的博客进行开发配置。我们的开发环境使用的是springBoot、tom…

    Java 2023年5月30日
    078
  • springboot整合JPA

    spring-data-jpa:就是和数据库打交道,进行数据访问的。 一:步骤: 1.新建一个maven项目,新建一个数据库(数据库中可以没有表) 2.导入相关依赖 3.编写app…

    Java 2023年6月9日
    064
  • 建造者模式(创建型)

    建造者模式 介绍 建造者模式注重的是部件构建的过程,意在 通过一步一步地精确构造出一个复杂的对象。 可以将建造者模式理解为,假设我们有一个对象需要建立,这个对象是由多个组件(Com…

    Java 2023年6月15日
    073
  • Java基础之变量、常量、作用域

    变量就是可以变化的量 Java是一种强类型语言,每个变量都必须声明其类型 Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域 注意事项: 每个变量都有类型,类…

    Java 2023年6月8日
    071
  • 栈溢出-ret2libc地址泄露笔记

    作为一名初学者,在碰到很多攻击思路的时候会感觉很妙,比如gadget的构造,这题的sh参数截断。 1、首先分析程序架构和保护措施。 2、使用IDA开始判断程序是否具备最简单的栈溢出…

    Java 2023年6月5日
    076
  • SPRINGBOOT(39)整合(10)MYBAITS

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/qiu-hua/p/16552608.htmlAutho…

    Java 2023年5月30日
    062
  • 转发和重定向

    forward 是服务器内部的重定向,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,而客户端并不知道,因此在客户端浏览器的地址栏中不回显示转向后的地址,还是原来的…

    Java 2023年6月14日
    082
  • java 多线程

    *线程的状态:New、Runnable、Blocked、Waiting、Timed waiting、Terminated new Thread()——> New、 start…

    Java 2023年6月16日
    079
  • Java中List集合去除重复数据的六种方法

    循环list中的所有元素然后删除重复 通过HashSet踢除重复元素 删除ArrayList中重复元素,保持顺序 4.把list里的对象遍历一遍,用list.contains(),…

    Java 2023年5月29日
    054
  • Spring自定义解析的集中方式

    springMVC 、springboot中返回前端JSON 时候,经常需要不同的格式 实现方式有几种 一 、自己实现JSON序列化器 二、 自定义注释 Original: htt…

    Java 2023年5月30日
    069
  • 使用java自带的API实现zip解压缩

    java处理文件时,有时候需要对文件进行zip压缩操作,可以使用java自带的api实现解压缩功能。 1.压缩 1.1 将文件压缩到指定的zip文件 1.2 通过浏览器响应下载文件…

    Java 2023年5月29日
    068
  • MySQL知识点总结(完整版)

    登录和退出MySQL服务器 登录MySQL $ mysql -u root -p12345612 退&#x…

    Java 2023年6月14日
    069
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球