Spring的简介ioc容器及注入方式

news2024/11/19 1:19:16

一.Spring的简介

1.Spring的特性

Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。

   Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。

   然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

   目的:解决企业应用开发的复杂性

   功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能

   范围:任何Java应用

   简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

2.Spring模块

在Java开发中,通常将Spring框架分为以下七个主要模块:

  1. Spring核心容器(Spring Core Container):这是Spring框架的核心部分,提供了IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)的功能,用于管理和组织应用程序的组件和对象。

  2. Spring应用上下文(Spring Application Context):该模块建立在核心容器之上,提供了一种高级方式来访问配置文件和管理Bean的生命周期,同时支持国际化、事件传播等特性。

  3. Spring AOP(Spring Aspect-Oriented Programming):该模块实现了面向切面编程(AOP),用于将横切关注点(例如日志、事务、安全)与应用程序的业务逻辑分离开来,并以声明式的方式将它们作为可重用的模块应用到系统中。

  4. Spring JDBC(Spring Java Database Connectivity):该模块封装了JDBC(Java数据库连接)代码,提供了简化数据库访问的方式,并且支持声明式的事务管理。

  5. Spring事务管理(Spring Transaction Management):该模块为应用提供了一种管理事务的手段,支持编程式事务管理和声明式事务管理,并且可以与各种事务管理技术(如JTA、JDBC等)进行集成。

  6. Spring Web MVC(Spring Model-View-Controller):该模块是Spring框架的Web应用程序开发部分,提供了一种MVC(Model-View-Controller)的模式来组织和管理Web应用程序的代码,支持请求处理、视图解析、数据绑定等功能。

  7. Spring测试(Spring Testing):该模块提供了用于测试Spring应用程序的功能和工具,包括单元测试、集成测试、模拟对象等。

这些模块一起构成了Spring框架的基础,并且可以根据具体需求进行灵活的组合和使用。

 3.spring的常用注解

在Spring框架中,有许多常用的注解,以下是其中一些常见的注解:

1. @Component:将一个类标记为Spring的组件,并将其纳入到Spring容器中进行管理。这是一个通用的注解,可以用于任何类。

2. @Controller:标记一个类为Spring MVC的控制器,用于处理Web请求和响应。

3. @Service:标记一个类为服务层组件,通常用于封装业务逻辑,被注入到其他层进行调用。

4. @Repository:标记一个类为数据访问层组件,通常用于操作数据库或其他持久化操作。

5. @Autowired:用于自动装配Spring容器中的Bean,可以在类的属性、构造方法或者方法上使用。

6. @Value:用于从属性文件或者环境变量中读取配置值,并注入到类的属性中。

7. @RequestMapping:用于映射HTTP请求的URL路径到控制器的处理方法,并指定请求的HTTP方法。

8. @ResponseBody:将控制器方法的返回值直接作为HTTP响应的内容,而不是跳转到视图。

9. @PathVariable:用于获取URL路径中的参数值,并将其注入到控制器方法的参数中。

10. @RequestParam:用于获取请求中的参数值,并将其注入到控制器方法的参数中。

11. @SessionAttribute:用于将模型中的属性存储到HTTP会话中,以便在多个请求之间共享。

12. @Transactional:用于标记一个方法或者类需要进行事务管理。

这些注解只是Spring框架中的一部分,还有很多其他功能强大的注解可供使用。根据具体情况和需求,你可以使用适合的注解来简化开发、提高效率。

 二.ioc容器的特点

1.ioc的介绍

IOC(Inversion of Control,控制反转)是一种软件设计的原则,用于实现松耦合和可维护性的应用程序。在IOC容器中,控制权从应用程序代码转移到容器中,由容器负责实例化、管理和协调应用程序中的对象。

以下是IOC容器的一些特点:

  1. 控制反转:IOC容器通过控制反转的方式,将对象的控制权从应用程序代码转移到容器中。应用程序不需要手动创建对象,而是由容器创建和管理对象的生命周期。

  2. 依赖注入:IOC容器通过依赖注入的方式,自动解决对象之间的依赖关系。应用程序只需要声明依赖关系,容器会负责自动注入所需的依赖。

  3. 松耦合:IOC容器通过解耦对象之间的依赖关系,实现了松耦合。对象只需要关注自身的功能,而不需要关心如何获取依赖的对象。这样可以提高代码的可维护性和可测试性。

  4. 配置集中管理:IOC容器通常将对象的配置信息集中存储在配置文件或注解中,而不是分散在应用程序的各个地方。这样可以提高配置的可维护性和可重用性。

  5. 生命周期管理:IOC容器负责管理对象的生命周期,例如对象的创建、初始化、销毁等。容器可以根据配置和需要来管理对象的生命周期,确保对象的正确创建和销毁过程。

  6. AOP支持:很多IOC容器提供对面向切面编程(AOP)的支持。通过AOP,可以将与核心业务逻辑无关的横切关注点(如日志、事务、安全等)从应用程序中剥离出来,实现代码的模块化和复用。

总之,IOC容器通过控制反转和依赖注入等机制,实现了对象的解耦和集中管理,提高了代码的可维护性和可测试性,同时也为AOP等功能提供了支持。许多流行的框架和技术,如Spring框架,就是基于IOC容器来构建和管理应用程序的。

 2.代码演示

当使用IOC容器时,我们可以通过配置文件或注解来定义对象之间的依赖关系

 1.先定义一个接口

package com.YU.ioc.service;

/**
 * @author YU
 * @create 2023-08-14 18:15
 *
 * 更改用户信息的接口
 */
public interface UserService {
    public void update();
}

2.然后创建两个实现类实现上面的接口

package com.YU.ioc.service.impl;

import com.YU.ioc.service.UserService;

/**
 * @author YU
 * @create 2023-08-14 18:17
 */
public class UserServiceImpl1 implements UserService {

    public void update() {
        System.out.println("更改用户个人信息");
    }
}

public class UserServiceImpl2 implements UserService {
    public void update() {
        System.out.println("用户注销");
    }
}

3.现在,我们可以使用Spring的IOC容器来管理对象的生命周期和依赖注入。首先,我们需要创建一个配置文件(如spring-context.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">
<!-- 凡是spring配置文件spring-context.xml中配置,那么该类JavaBean就交给了spring容器管理-->
    <bean class="com.YU.ioc.web.UserAction" id = "userAction">
        <property name="userService" ref="userService"></property>
    </bean>
    <bean class="com.YU.ioc.web.BookAction" id = "bookAction">
        <property name="userService" ref="userServiceImpl1"></property>
    </bean>
    <bean class="com.YU.ioc.service.impl.UserServiceImpl2" id = "userService"></bean>
    <bean class="com.YU.ioc.service.impl.UserServiceImpl1" id = "userServiceImpl1"></bean>
</beans>

4.最后,我们就可以通过Spring的ioc容器获取Service接口了

三.Spring的注入方式

1.set注入

1.1 准备好Action层,定义好属性,提供get,set方法

package com.YU.ioc.web;

import com.YU.ioc.service.UserService;
import com.YU.ioc.service.impl.UserServiceImpl1;

import java.util.List;

/**
 * @author YU
 * @create 2023-08-14 18:29
 */
public class BookAction {
    private UserService userService;
    private String bname;//书名
    private int date;//发行日期
    private List<String> people;//适用人群

    public String getBname() {
        return bname;
    }

    public void setBname(String bname) {
        this.bname = bname;
    }

    public int getDate() {
        return date;
    }

    public void setDate(int date) {
        this.date = date;
    }

    public List<String> getPeople() {
        return people;
    }

    public void setPeople(List<String> people) {
        this.people = people;
    }

    public void pros() {
        System.out.println(this.bname);
        System.out.println(this.date);
        System.out.println(this.people);
    }

    public UserService getUserService() {
        return userService;
    }

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public String update() {
        userService.update();
        return "list";
    }
}

2.配置好Xml文件

<bean class="com.YU.ioc.web.BookAction" id = "bookAction">
        <property name="userService" ref="userServiceImpl1"></property>
        <property name="bname" value="亚马逊漂流记"></property>
        <property name="date" value = "12"></property>
        <property name="people" >
            <list>
                <value>儿童</value>
                <value>青少年</value>
            </list>
        </property>
    </bean>

3.编写方法,显示是否注入成功

4.测试

package com.YU.ioc.demo;

import com.YU.ioc.web.BookAction;
import com.YU.ioc.web.UserAction;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author YU
 * @create 2023-08-14 19:16
 */
public class Demo1 {
    public static void main(String[] args) {
        //处理用户请求时,获取spring上下文对象
        ClassPathXmlApplicationContext context = new                     ClassPathXmlApplicationContext("spring-context.xml");
        BookAction bookAction = (BookAction) context.getBean("bookAction");
        bookAction.pros();
    }
}

5.打印结果

显示注入成功 

2.构造方法注入

1.准备好Action层,与set注入的不同的是,用的是构造方法注入

package com.YU.ioc.web;

import com.YU.ioc.service.UserService;

import java.util.List;

/**
 * @author YU
 * @create 2023-08-14 18:35
 */
public class UserAction {
    private UserService userService;
    private String uname;
    private int age;
    private List<String> hobby;

    public UserAction() {

    }
    public UserAction(String uname, int age, List<String> hobby) {
        this.uname = uname;
        this.age = age;
        this.hobby = hobby;
    }
    public void pros(){
        System.out.println(this.uname);
        System.out.println(this.age);
        System.out.println(this.hobby);
    }
    public UserService getUserService() {
        return userService;
    }

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public String update(){
        userService.update();
        return "list";
    }
}

 2.配置XML文件

<bean class="com.YU.ioc.web.UserAction" id = "userAction">
        <property name="userService" ref="userService"></property>
        <constructor-arg name="uname" value="小刘"></constructor-arg>
        <constructor-arg name="age" value = "18"></constructor-arg>
        <constructor-arg name="hobby" >
            <list>
                <value>打球</value>
                <value>读书</value>
            </list>
        </constructor-arg>
    </bean>

区别在于用到是construct-arg 

3.编写测试方法,判断是否注入成功

 4.测试

package com.YU.ioc.demo;

import com.YU.ioc.web.BookAction;
import com.YU.ioc.web.UserAction;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author YU
 * @create 2023-08-14 19:16
 */
public class Demo1 {
    public static void main(String[] args) {
        //处理用户请求时,获取spring上下文对象
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
        UserAction userAction = (UserAction) context.getBean("userAction");
        userAction.pros();
    }
}

5.测试结果

 显示注入成功

 3.总结

  • 构造方法注入强调依赖的必需性和不变性,适用于一次性注入全部依赖的情况。
  • Setter方法注入提供了更大的灵活性,允许在对象创建后动态地注入依赖,适用于需要可选依赖或在运行时修改依赖的情况。
  • 在实践中,可以根据具体需求选择适合的注入方式,甚至可以将构造方法注入和Setter方法注入结合起来使用,以达到更好的灵活性和控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/886461.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shell编程——弱数据类型的脚本语言快速入门指南

目录 Linux Shell 数据类型 变量类型 运算符 算术运算符 赋值运算符 拼接运算符 比较运算符 关系运算符 控制结构 顺序结构 条件分支结构 if 条件语句 case 分支语句 循环结构 for 循环 while 循环 until 循环 break 语句 continue语句 函数 函数定义 …

Matplotlib绘图知识小结--Python数据分析学习

一、Pyplot子库绘制2D图表 1、Matplotlib Pyplot Pyplot 是 Matplotlib 的子库&#xff0c;提供了和 MATLAB 类似的绘图 API。 Pyplot 是常用的绘图模块&#xff0c;能很方便让用户绘制 2D 图表。 Pyplot 包含一系列绘图函数的相关函数&#xff0c;每个函数会对当前的图像进行…

线上问题排查: jmap mat 工具排查生产环境占用内存过大问题

一. 背景 线上任务内存占用居高不下, 机器load较高. 排查问题原因. 二. 操作 2.1. 工具文件下载清单. mat 工具 linux版本. ( dump文件太大了有20多G, 只能在服务器上解析. 所以下载linux版本. ) 下载地址: https://eclipse.dev/mat/downloads.php 下载高版本的jdk , 目前…

Spark第二课RDD的详解

1.前言 RDD JAVA中的IO 1.小知识点穿插 1. 装饰者设计模式 装饰者设计模式:本身功能不变,扩展功能. 举例&#xff1a; 数据流的读取 一层一层的包装&#xff0c;进而将功能进行进一步的扩展 2.sleep和wait的区别 本质区别是字体不一样,sleep斜体,wait正常 斜体是静态方法…

数学 容斥原理

全都是mn-1&#xff0c;下图都写成m-n-1了&#xff0c;没有脑子o(╥﹏╥)o 题目链接&#xff1a;214. Devu和鲜花 - AcWing题库 #include <bits/stdc.h> #define ll long long using namespace std; const int mod 1e97; ll A[25]; ll Pow(ll a, ll k){ll ans 1;while…

538页21万字数字政府智慧政务大数据云平台项目建设方案WORD

导读&#xff1a;原文《538页21万字数字政府智慧政务大数据云平台项目建设方案WORD》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 根据业务的不同属性&#xff0c…

爱校对:公文材料的新时代伙伴

在这个数字化、智能化日益增强的新时代&#xff0c;公文材料处理方式也在发生着巨大的变化。传统的人工校对方式逐渐被智能化的工具所替代&#xff0c;而在这其中&#xff0c;爱校对正以其卓越的性能和便捷的使用体验&#xff0c;崭露头角&#xff0c;成为公文材料处理的新时代…

利用高级定时器产生PWM

这个图中阐述了利用高级定时器产生PWM的原理&#xff0c;其中 ARR是自动重装载寄存器(TIMx_ARR)的值 CNT是定时器计数器当前的值 CCRx是捕获/比较寄存器 x(TIMx_CCRx)的值 每经过一次定时器时钟周期就会1&#xff0c;通过设置定时器的输出模式&#xff0c;可以实现&#xff0c…

编译工具:CMake(四)|安装目标文件、普通文件、脚本、目录

编译工具&#xff1a;CMake&#xff08;四&#xff09;|安装目标文件、普通文件、脚本、目录 如何安装目标文件的安装普通文件的安装&#xff1a;非目标文件的可执行程序安装(比如脚本之类)目录的安装 如何安装 安装的需要有两种&#xff0c;一种是从代码编译后直接 make inst…

【C++11保姆级教程】新的函数声明(trailing return type)、右值引用(rvalue references)

文章目录 前言一、新的函数声明&#xff08;trailing return type&#xff09;1.1新的函数声明&#xff08;trailing return type&#xff09;概念1.2新的函数声明的使用 二、右值引用&#xff08;rvalue references&#xff09;2.1右值引用&#xff08;rvalue references&…

[机器学习]特征工程:特征降维

特征降维 1、简介 特征降维是指通过减少特征空间中的维度&#xff0c;将高维数据映射到一个低维子空间的过程。 在机器学习和数据分析中&#xff0c;特征降维可以帮助减少数据的复杂性、降低计算成本、提高模型性能和可解释性&#xff0c;以及解决维度灾难等问题。特征降维通…

机器学习知识点总结:什么是EM(最大期望值算法)

什么是EM(最大期望值算法) 在现实生活中&#xff0c;苹果百分百是苹果&#xff0c;梨百分白是梨。 生活中还有很多事物是概率分布&#xff0c;比如有多少人结了婚&#xff0c;又有多少人有工作&#xff0c; 如果我们想要调查人群中吸大麻者的比例呢&#xff1f;敏感问题很难得…

实战项目:基于主从Reactor模型实现高并发服务器

项目完整代码仿mudou库one thread one loop式并发服务器实现: 仿muduo库One Thread One Loop式主从Reactor模型实现⾼并发服务器&#xff1a;通过模拟实现的⾼并发服务器组件&#xff0c;可以简洁快速的完成⼀个⾼性能的服务器搭建。并且&#xff0c;通过组件内提供的不同应⽤层…

更新arm的linux编译工具链

虑到目前arm的gcc 5.5的工具链对C17语法支持不足&#xff0c;需要升级下工具链。 以下是详细步骤。使用官方提供的工具链 ARM官方的工具链网站&#xff1a; https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads bare-metal这个版本就是没有操作系统(裸机环…

如何利用Simulation模拟零件受到的冲击力

线性静力载荷作用过程是恒定的&#xff0c;不随时间变化&#xff1b;单冲击力载荷作用的时间很短&#xff0c;高速高能量&#xff1b;今天给大家分享的是Simulation怎么模拟零件受到冲击力。 DEMO案例介绍&#xff1a;板材规格250X120X10&#xff0c;在板材的中心Φ5的区域受冲…

时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 MATLAB实现基…

【T3】畅捷通T3凭证预览/打印摘要和凭证中看到的摘要不一样。

【问题描述】 畅捷通T3软件中&#xff0c; 凭证打印预览以及打印出来的效果和直接在凭证界面看到的该凭证摘要不一致。 【解决方法】 执行下述清除凭证摘要特殊字符和空格的语句后&#xff0c;重新预览打印。 update GL_accvouch set cdigestREPLACE(cdigest,CHAR(9),) whe…

找pr剪辑素材就上这6个网站,免费可商用。

视频剪辑没素材&#xff0c;就上这几个网站找&#xff0c;免费、付费、商用素材全都有&#xff0c;最重要的是高清、4K无水印&#xff0c;赶紧马住了。 潮点视频 https://shipin520.com/?from_code2510 潮点视频是一个提供优质高清、无水印的视频素材网站&#xff0c;站内有大…

javaScript:数组方法(增删/提取类/截取/操作方法等)

目录 一.数组的增删方法 1.push()数组末尾添加元素 解释 代码 运行截图 2.unshift()向数组的头部添加数组 解释 代码 运行截图 3.pop()数组的尾部删除一个元素 解释 代码 运行截图 4.shift()数组的头部删除一个元素 解释 代码 运行截图 5. splice()任意位…

2003-2022年高铁站开通时间

2003-2022年高铁站开通时间 1、时间区间&#xff1a;2003-2022年 2、指标如下&#xff1a;高铁站名称、开通时间、所在省份、所在城市、所属线路名称、以及相关备注 指标说明&#xff1a;Hsrwsnm[高铁站名称]-高铁站名称 Optm[开通时间]-高铁站开通的时间 Prvn[所在省份]-高…