Spring入门-基本介绍和IOC控制反转(注解方式)

2023-11-12

1.Spring概述

Spring官网
Spring,顾名思义,java软件行业的春天,彻底解放了程序员从原生的开发中,一个轻量级的非侵入式的框架。
特点:控制反转 IoC , 面向切面 Aop

组成

在这里插入图片描述
组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

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

2.IoC基础

IOC,控制反转,是将对象完全交给spring来管理,把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。

2.1 Spring创建一个入门程序

之前的mybatis的父工程SSM添加新的子工程Spring。
之前的pom是

 <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok-maven-plugin</artifactId>
            <version>1.18.12.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

1.引入Spring的maven仓库

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.10.RELEASE</version>
</dependency>

spring-webmvc我引人spring别的相关依赖,我们引入个最大的就行。

2.写一个hello类

package com.liu.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Hello {
    private String name;

    public void show(){
        System.out.println("Hello,"+ name );
    }
}

3.编写Spring核心配置文件beans.xml

<?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就是java对象 ,Spring创建和管理-->
    <bean id="hello" class="com.liu.pojo.Hello">
        <property name="name" value="hello world"/>
    </bean>
</beans>

我们将hello这个类交给spring管理,id代表着唯一标识,class包名
property 代表属性注入,在项目启动得时候就给Hello 类中得name属性赋值hello world
3.测试

@Test
public void test(){
    //解析beans.xml文件 , 生成管理相应的Bean对象
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    //getBean : 参数即为spring配置文件中bean的id .
    Hello hello = context.getBean("hello",Hello.class);
    hello.show();
}

运行结果
在这里插入图片描述

以上可以看出,我们不需要new一个对象,初始化,仅仅是在配置文件交给Spring托管即可,在程序运行过程中getBean得方式即可获得对象。

控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring来创建的
反转 : 程序本身不创建对象 , 而变成被动的接收对象 .

2.2 Spring配置详解

1.alias 设置别名 , 为bean设置别名 , 可以设置多个别名

<!--设置别名:在获取Bean的时候可以使用别名获取-->
<alias name="hello" alias="shuxiansheng"/>

在这里插入图片描述
这样我们通过别名依旧可以取到bean的值

2. Bean的配置
id 是bean的标识符,要唯一,如果没有配置id,name就是默认标识符
如果配置id,又配置了name,那么name是别名
name可以设置多个别名,可以用逗号,分号,空格隔开
如果不配置id和name,可以根据applicationContext.getBean(.class)获取对象;
class是bean的全限定名=包名+类名

3. import

<import resource="{path}/beans.xml"/>

2.3 依赖注入(DI)+ 自动装配

依赖注入
这块我们工作都是注解 配置这块后面遇到再看。

3.使用注解开发

因为之后我们基本上都是SpringBoot开发,放弃了繁琐得配置,都是纯注解得方式,这里我们也用注解得方式进行开发。

3.1 属性注入

1.我们删除之前得bean.xml.新建applicationcontext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    <!--指定注解扫描包-->
    <context:component-scan base-package="com.liu.pojo"/>
    <!--    开启注解支持-->
    <context:annotation-config/>
</beans>

加上要扫描得包和开启注解得配置。

2.bean属性如何注入-Component
我们原来得Hello类在配置文件中属性注入得,现在只需要在类上加Component注解

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class Hello {
    @Value("刘涛")
    private String name;

    public void show(){
        System.out.println("Hello,"+ name );
    }
}

3.测试

  @Test
    public void test(){
        //解析beans.xml文件 , 生成管理相应的Bean对象
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontext.xml");
        //getBean : 参数即为spring配置文件中bean的id .
        Hello hello = context.getBean("hello",Hello.class);
        hello.show();
    }

注意这里getBean是默认类名得小写
在这里插入图片描述
我们也可以像id一样命名。

@Component("test")

这样

  Hello hello = context.getBean("test",Hello.class);

修改着两块得代码结果一样
在这里插入图片描述

3.2 衍生注解

@Component三个衍生注解

@Controller:web层
@Service:service层
@Repository:dao层

自动装配注解@Autowired
@Autowired是按类型自动转配的,不支持id匹配。

//如果允许对象为null,设置required = false,默认为true
@Autowired(required = false)

@Resource(name = “name2”)不能单独使用,只能配合Autowired一起使用。

3.3基于Java类进行配置@Configuration

我们完全脱离配置文件,进行纯注解开发。
我们新建一个MyConfig配置类,放在com.liu.config包下


@Configuration  //代表这是一个配置类
@ComponentScan("com.liu")
public class MyConfig {

    @Bean //通过方法注册一个bean,这里的返回值就Bean的类型,方法名就是bean的id!
    public Hello helo(){
        return new Hello();
    }
}

@Configuration代表这 是一个配置文件
@ComponentScan配置要扫描包得路径,相当于 <context:component-scan base-package=“com.liu.pojo”/>

测试类

 @Test
    public void test(){
        ApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(MyConfig.class);
       //getBean : 参数即为spring配置文件中bean的id .
        Hello hello = applicationContext.getBean("test",Hello.class);
        hello.show();
    }

这样我们没有配置文件,纯注解开发,也可以正常输出。
完成IOC控制反转,所有扫描得包都托管给spring,当然是值加上Component注解得类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring入门-基本介绍和IOC控制反转(注解方式) 的相关文章

  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • Hibernate 挂起或引发延迟初始化,没有会话或会话已关闭

    我正在增强旧的 Spring Hibernate 应用程序 但我陷入困境 我有一种方法可以读取 3000 多行长的文件 每行都有一条记录 必须与数据库中的某些内容进行比较 然后必须将寄存器添加到数据库 多对多表 表和关系是 Branch h
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 非 Spring 托管类中 DI 的编译时编织

    我想为标记为的类配置编译时编织 Configurable注释能够将 spring 依赖项注入到初始化的类中new操作员 我不想使用加载时编织 因为我无权访问应用程序服务器的运行脚本 因此无法修改它 另外 我希望能够在测试中使用此类 我的意思
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐

  • 资产扫描神器ARL增强改造

    拉取项目 首先从GitHub克隆到服务器上 git clone https github com ki9mu ARL plus docker 修改配置文件 因为ARL在配置文件里设置了黑名单 有时候项目为GOV或者EDU之类的时候无法进行扫
  • Java自定义实现字符串比较器-按照数字大小排序

    背景 在日常开发中 经常会遇到一些字符串排序的场景 场景一 字符串中包含的是纯数字 比较时想按照正常的数字大小进行排序 场景二 字符串中既包含数字又包含普通字符 比较时 普通字符想按照默认的字典进行排序 遇到字符串时则按照数字大小进行比较
  • Visual Stdio中使用番茄插件智能提示功能出问题。头文件也没有智能提示,甚至iostream都无法补全

    我在网上没有搜到同类型问题的解决办法 这个问题绝大部分人都不会遇到吧 不过我遇到了 问了大佬 也不知道什么原因 自己在大量乱点后 发现VA中的这个设置能解决问题 vs菜单栏的VASSIST gt Visual Assist Options
  • win7 64位 python3.4&opencv3.0配置安装教程

    一 安装Python 下载Python3 4 2 网址 https www python org downloads 注意 1 之前下载Python3 5后安装numpy出现了安装错误 尝试了各种解决办法 还是不能成功 看到网上有一条评论说
  • 粒子滤波(Particle filter)matlab实现

    粒子滤波是以贝叶斯推理和重要性采样为基本框架的 因此 想要掌握粒子滤波 对于上述两个基本内容必须有一个初步的了解 贝叶斯公式非常perfect 但是在实际问题中 由于变量维数很高 被积函数很难积分 常常会给粒子滤波带来很大的麻烦 为了克服这
  • Python 正则表达式

    最近研究Python爬虫 很多地方用到了正则表达式 但是没好好研究 每次都得现查文档 今天就专门看看Python正则表达式 本文参考了官方文档 re模块 模式 首先正则表达式的语法我就不说了 这玩意倒是不算难 用的时候现查就行了 正则表达式
  • 从0开始阿里云裸机安装java开发环境 Linux + Nginx+ MySQL+ Tomcat(lnmt)

    步骤1 更新阿里云的安装系统yum源 参考 https help aliyun com knowledge detail 5974184 html 参考 http blog csdn net endall article details 1
  • 数据库项目四总结:MySQL数据表的检索

    任务4 1 查询时选择列 1 基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT语句 SELECT语句的基本格式是 SELECT lt 字段列表 gt FROM lt 表1 gt lt 表2 gt WHERE lt 表达式
  • MySQL的多表操作

    文章目录 1 多表关系 2 外键约束 2 1创建外键约束 2 2删除外键约束 3 对表联合查询 3 1交叉连接 3 2内连接 3 3外连接 4 子查询及子查询关键字 4 1 ALL关键字 4 2 ANY和SOME关键字 4 3 IN关键字
  • Python解析XML示例与解释

    使用工具包xml解析 python自带的工具 可以直接使用 使用示例如下 文章目录 简单案例 nodeType对应数字及其含义 简单案例
  • Sensor 结构——前照、背照、堆栈

    优异的工艺和技术可以使得即便不使用更新结构的CMOS 同样拥有更好的量子效率 固有热噪声 增益 满阱电荷 宽容度 灵敏度等关键型指标 在相同技术和工艺下 底大一级的确压死人 全画幅和aps c 人类的进步就是在不断发现问题 解决问题 背照式
  • redis master配置了密码进行主从同步

    1 如果master不设置密码 那么直接在slave服务器配置slaveof即可 配置如下 slaveof ip 端口 slaveof 221 224 85 186 6379 配置好我们看下redis的日志 看是否同步成功 5014 S 2
  • 生产线程池的定义与使用

    定义线程池 Slf4j Component public class PalmThreadPool public static int CORE POOL SIZE 4 private final AtomicInteger atomicI
  • C++ 中的常量,Const 关键字的用法(C++复习向p6)

    Const 常量 常量是固定的 程序执行期间不改变 又叫字面量 常量的类型 整数常量 0x23 浮点常量 1 23 布尔常量 true false 字符常量 n 字符串常量 nihao 定义常量 把字面量写成大写字母形式 是一个好习惯 方法
  • sql语句中分组取每组的最新数据

    今天敲sql的时候遇到了一个问题 业务流程是 检查记录 gt 整改通知 gt 整改回复 gt 检查组复查 如果复查不通过 则 检查组复查 gt 整改通知 gt 整改回复 gt 检查组复查 此时一条检查记录就可能对应多条整改通知去最新数据就用
  • JavaScript 将扁平的数组输出转为树形结构(需要考虑性能)

    扁平数组转为树形结构 做后台管理系统时也是经常用到的功能 面试时也是常常出现的 今天实现一下 引用两篇掘金大佬的文章 感谢大佬 一 什么是好算法 什么是坏算法 判断一个算法的好坏 一般从执行时间和占用空间来看 执行时间越短 占用的内存空间越
  • 刷脸设备引进越来越多的人喜欢靠脸消费

    刷脸支付已经成为今年比较热门的一个话题了 随便刷个新闻 微博或各大网络平台等都不免会看到有关刷脸支付的消息 感觉不了解刷脸支付就好像与这个时代脱离轨道了似的 那么今天就来给大家讲一讲刷脸支付对于消费者和商家各具有优势它比扫码支付更加安全便捷
  • gdb调试时显示数组

    可以用下面的方法来显示数组 p array len 其中p相当于print array就是数组首地址 也可以是数组名 len是想要显示的数组的长度 比如我有一个数组的定义 int a 1 2 3 4 5 那么想要显示的时候就可以写 p a
  • 基于百度PaddleHub实现人像美颜V1.0

    AI美颜核心技术之一就是人脸关键点检测 PaddleHub已经开源了人脸关键点检测模型 face landmark localization 人脸关键点检测是人脸识别和分析领域中的关键一步 它是诸如自动人脸识别 表情分析 三维人脸重建及三维
  • Spring入门-基本介绍和IOC控制反转(注解方式)

    1 Spring概述 Spring官网 Spring 顾名思义 java软件行业的春天 彻底解放了程序员从原生的开发中 一个轻量级的非侵入式的框架 特点 控制反转 IoC 面向切面 Aop 组成 组成 Spring 框架的每个模块 或组件