Spring之ioc容器

news2024/11/16 19:57:26

目录

1.简介

2.为什么学习Spring

3.Spring的核心特性

4.Spring ioc 容器的特点

5.Spring的注入方式

6.web整合容器

1.简介:

Spring简介

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

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

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

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

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

   范围:任何Java应用

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

2.为什么学习Spring:

学习Spring框架有以下几个原因:

  1. 强大的功能:Spring框架是Java开发中最流行的企业级框架之一,它提供了很多强大的功能和特性,比如依赖注入(DI)、面向切面编程(AOP)、事务管理、RESTful Web服务等。通过学习Spring,你可以更高效地开发Java应用,提高开发效率和质量。

  2. 应用广泛:Spring框架在各种规模的企业应用中广泛应用,尤其在Java后端开发中。许多企业都将Spring作为其首选框架,因此学习Spring可以增加你的就业机会和市场竞争力。

  3. 解耦和模块化:Spring框架采用了松散耦合的设计理念,可以将应用程序的不同模块解耦,使得应用更加灵活和可维护。通过学习Spring,你可以学会如何设计和开发具有高内聚、低耦合的模块化应用。

  4. 社区支持:Spring框架有一个庞大的用户社区,你可以在社区中得到丰富的资源、教程和解决方案。如果遇到问题或困惑,可以向社区寻求帮助和指导。

  5. 整合其他框架:Spring框架提供了很多整合其他框架的功能,比如与Hibernate、MyBatis等ORM框架的无缝整合,与Spring MVC、Spring Boot等web框架的集成等。学习Spring可以帮助你更好地理解和利用这些框架。

所以学习Spring框架可以提升你的Java开发技能和就业前景,让你成为一名高效、专业的企业级Java开发者。

3.Spring的核心特性:

Spring框架的核心特性包括:

  1. 控制反转(IoC):Spring通过IoC容器管理对象的依赖关系,将对象的创建、组装和管理交给Spring容器,降低了组件之间的耦合度。

  2. 面向切面编程(AOP):Spring支持AOP,通过动态代理的方式,将横切关注点(如日志、事务等)从业务逻辑中解耦出来,提供了更好的模块化和复用性。

  3. 基于注解的配置:Spring提供了丰富的注解,用于配置和管理Bean、依赖注入、事务等,简化了配置文件的编写。

  4. 数据访问与集成:Spring提供了对各种持久化技术的支持,如JDBC、ORM框架(如Hibernate、MyBatis)、NoSQL数据库等,并提供了统一的事务管理接口。

  5. MVC框架:Spring MVC是基于模型-视图-控制器设计模式的Web框架,提供了灵活的请求处理、视图解析和数据绑定等功能。

  6. 安全性:Spring提供了强大的安全性支持,包括认证(Authentication)和授权(Authorization)等机制,可以灵活地保护应用程序资源。

  7. 缓存管理:Spring支持对各种缓存技术的集成,如Ehcache、Redis等,提供了缓存抽象层,简化了缓存的使用和管理。

  8. 国际化和本地化:Spring提供了对多语言和本地化的支持,可以方便地实现国际化应用程序。

这些都是Spring框架的核心特性,使得Spring成为一个功能强大且灵活的开发框架。

4.Spring ioc 容器的特点:

IoC(Inversion of Control,控制反转)是Spring框架的核心概念之一。IoC容器是Spring框架提供的一个核心模块,负责对象的创建、配置和管理,实现了对象之间的松耦合。

在传统的开发模式中,当一个对象需要依赖其他对象时,该对象需要自行负责创建和管理它所依赖的对象。这种方式会导致大量的依赖关系交织在代码中,增加了代码的复杂性,同时也使得对象的创建和配置过程与核心业务逻辑紧密耦合在一起。

而IoC容器的作用是将这种对象之间的依赖关系的控制权转移到容器中,将对象的创建和配置过程解耦。开发人员只需通过配置文件或注解方式描述对象之间的依赖关系,容器负责根据配置信息进行对象的实例化和依赖注入。这意味着控制权从对象本身转移到了IoC容器,因此称之为"控制反转"。

代码演示:

 

pom.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>text</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>text Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <spring.version>5.0.1.RELEASE</spring.version>
    <javax.servlet.version>4.0.0</javax.servlet.version>
    <junit.version>4.12</junit.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <!-- 2、导入spring依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- 5.1、junit -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
    <!-- 5.2、servlet -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>${javax.servlet.version}</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>text</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

UserService用户更改个人用户的接口

 

UserServiceImpl 实现类

 

 UserServiceImpl1 实现类

 

 UserAction 控制器:

package com.zking.ioc.web;

import com.zking.ioc.service.Impl.UserServiceImpl;
import com.zking.ioc.service.Impl.UserServiceImpl1;
import com.zking.ioc.service.UserService;

/**
 * @author bing人
 * @site
 * @company xy集团
 * @create 2023-08-15 16:18
 *
 * 程序员手动实例化对象的弊端
 * 1.一旦依赖的接口的实现需要大批量改动,迭代,维护成本极高
 * 当接口的实现类不统一,维护成本更高
 */
public class UserAction {
    //如果客户说没有上传头像的功能就修改UserServiceImpl为UserServiceImpl1
    private UserService userService ;

    public UserService getUserService() {
        return userService;
    }

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

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

 GoodsAction控制器:

package com.zking.ioc.web;

import com.zking.ioc.service.Impl.UserServiceImpl;
import com.zking.ioc.service.Impl.UserServiceImpl1;
import com.zking.ioc.service.UserService;

/**
 * @author bing人
 * @site
 * @company xy集团
 * @create 2023-08-15 16:26
 */
public class GoodsAction {
    private UserService userService ;

    public UserService getUserService() {
        return userService;
    }

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

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

 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.zking.ioc.web.UserAction" id="userAction">
        <property name="userService" ref="userService"></property>
    </bean>
    <bean class="com.zking.ioc.web.GoodsAction" id="goodsAction">
        <property name="userService" ref="userService"></property>
    </bean>
    <bean class="com.zking.ioc.service.Impl.UserServiceImpl1" id="userService"></bean>
    <bean class="com.zking.ioc.service.Impl.UserServiceImpl" id="userServiceImpl"></bean>
</beans>

Demo1测试类:

package com.zking.ioc.demo;

import com.zking.ioc.web.GoodsAction;
import com.zking.ioc.web.UserAction;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author bing人
 * @site
 * @company xy集团
 * @create 2023-08-15 16:49
 */
public class Demo1 {
    public static void main(String[] args) {
        //加载spring核心配置文件(建模),获取spring的上下文对象,上下文对象中可以获取任何的javebean对象
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
      //强转
        UserAction userAction= (UserAction) context.getBean("userAction");
        userAction.update();
        GoodsAction goodsAction= (GoodsAction) context.getBean("goodsAction");
        goodsAction.update();
    }
}

输出结果:

 5.Spring的注入方式:

set注入 将GoodsAction中的代码修改为:

package com.CloudJun.ioc.web;
 
import com.CloudJun.ioc.service.UserService;
 
import java.util.List;
 
/**
 * @author bing人
 * @site
 * @company xy集团
 * @create 2023-08-16 16:49
 */
public class GoodsAction {
 
 
    /**
     * 例如:在不同的控制器中进行方法调用
     */
    private UserService userService;
    private String gname;//名称
    private int age;//保质期
    private List<String> peoples;//使用人群
 
 
    public String getGname() {
        return gname;
    }
 
    public void setGname(String gname) {
        this.gname = gname;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public List<String> getPeoples() {
        return peoples;
    }
 
    public void setPeoples(List<String> peoples) {
        this.peoples = peoples;
    }
 
    public UserService getUserService() {
        return userService;
    }
 
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
 
 
    public void pop(){
        System.out.println("名称:"+this.gname);
        System.out.println("保证期:"+this.age);
        System.out.println("使用人群:"+this.peoples);
    }
 
 
    public String update(){
        userService.update();
        return "list";
    }

}

修改spring-context.xml 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       default-autowire="byName"
       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 class="com.CloudJun.ioc.web.UserAction" id="userAction">
         <property name="userService" ref="userServiceImpl"></property>
 
        </bean>
 
        <bean class="com.CloudJun.ioc.web.GoodsAction" id="goodsAction">
            <property name="userService" ref="userServiceImpl2"></property>
            <property name="gname" value="小狗"></property>
            <property name="age" value="2"></property>
            <property name="peoples">
                <list>
                    <value>小红</value>
                    <value>漂亮</value>
                    <value>别个说的</value>
                </list>
            </property>
        </bean>
 
        <bean class="com.CloudJun.ioc.service.impl.UserServiceImpl" id="userService" ></bean>
        <bean class="com.CloudJun.ioc.service.impl.UserServiceImpl2" id="userServiceImpl2"></bean>
</beans>

 输出结果:

构造注入:

将UserAction中的所有代码修改为: 

package com.zking.ioc.web;

import com.zking.ioc.service.Impl.UserServiceImpl;
import com.zking.ioc.service.Impl.UserServiceImpl1;
import com.zking.ioc.service.UserService;

import java.util.List;

/**
 * @author bing人
 * @site
 * @company xy集团
 * @create 2023-08-15 16:18
 *
 * 程序员手动实例化对象的弊端
 * 1.一旦依赖的接口的实现需要大批量改动,迭代,维护成本极高
 * 当接口的实现类不统一,维护成本更高
 */
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 UserService getUserService() {
        return userService;
    }
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public void pop(){
        System.out.println("名字为:"+this.uname);
        System.out.println("年龄为:"+this.age);
        System.out.println("爱好为:"+this.hobby);
    }

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

}

输出结果:

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

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

相关文章

听GPT 讲Alertmanager源代码--notify

api/&#xff1a;这个目录包含了Alertmanager的API实现&#xff0c;包括v1和v2版本的API。 assets/&#xff1a;这个目录包含了静态资源文件&#xff0c;如HTML、JavaScript和CSS文件&#xff0c;它们用于构建Alertmanager的Web UI。 cmd/&#xff1a;这个目录包含了Alertmanag…

企业网三层架构实验

一、实验拓扑 二、实验要求 1、内网IP地址172.16.0.0/16合理分配&#xff1b; 2、SW1/2之间互为备份&#xff1b; 3、VRRP/STP/VLAN/TRUNK均使用&#xff1b; 4、所有PC通过DHCP获取IP地址&#xff1b; 三、实验思路 1、配置ISP的IP地址&#xff1b; 2、配置R1的IP地址&…

800V高压电驱动系统架构分析

需要电驱竞品样件请联&#xff1a;shbinzer &#xff08;拆车邦&#xff09; 过去一年是新能源汽车市场爆发的一年&#xff0c;据中汽协数据&#xff0c;2021年新能源汽车销售352万辆&#xff0c;同比大幅增长157.5%。新能源汽车技术发展迅速&#xff0c;畅销车辆在动力性能…

张驰课堂:揭秘学习6sigma黑带培训重要价值

随着全球经济一体化的加速推进&#xff0c;企业间的竞争日趋激烈&#xff0c;越来越多的企业意识到质量是企业的生命线&#xff0c;而提高质量的关键在于持续改进。在这个过程中&#xff0c;6sigma黑带作为具有专业技能和领导能力的人才&#xff0c;成为企业实现突破性改进、降…

PID输出PWM温度控制(详细介绍PID输出和PWM组合的各种方法)

这篇博客主要介绍PID的输出如何和PWM输出进行绑定,PID控制算法和源代码大家自行查看PID专栏,这里不再赘述。常用链接如下: 位置式PID(S7-200SMART 单自由度、双自由度梯形图源代码)_RXXW_Dor的博客-CSDN博客有关位置型PID和增量型PID的更多详细介绍请参看PID专栏的相关文章…

Wappalyzer - 技术剖析工具的必备浏览器扩展

目录 前言一、Wappalyzer简介1.Wappalyzer的背景和由来2.Wappalyzer的目标和优势 二、Wappalyzer的工作原理1.检测技术栈的方法和策略2.数据库和规则集的更新 三、如何使用Wappalyzer1.安装Wappalyzer浏览器扩展2.在浏览器中使用Wappalyzer进行技术剖析 总结 前言 在当今的数字…

云曦暑期学习第六周——kali

1.熟悉网络配置 一般来说虚拟机有三种网络模式&#xff1a; NAT (网络地址转换模式)Bridged (桥接模式)Host-Only&#xff08;主机模式&#xff09; nat模式&#xff1a; 虚拟系统会通过宿主机的网络来访问外网。而这里的宿主机相当于有两个网卡&#xff0c;一个是真实网卡…

redis--------哨兵模式

1.哨兵模式 试想一下&#xff0c;如果主从模式中&#xff0c;大半夜主节点挂了&#xff0c;运维从床上迷迷糊糊爬起来&#xff0c;打开电脑&#xff0c;手动升级处理&#xff0c;怕不是第二天就要上头条了。 哨兵模式的出现用于解决主从模式中无法自动升级主节点的问题&#xf…

javeee eclipse项目导入idea中

步骤一 复制项目到idea工作空间 步骤二 在idea中导入项目 步骤三 配置classes目录 步骤四 配置lib目录 步骤五 添加tomcat依赖 步骤六 添加artifacts 步骤七 部署到tomcat

软件开发bug问题跟踪与管理

一、Redmine 项目管理和缺陷跟踪工具 官网&#xff1a;https://www.redmine.org/ Redmine 是一个开源的、基于 Web 的项目管理和缺陷跟踪工具。它用日历和甘特图辅助项目及进度可视化显示&#xff0c;同时它又支持多项目管理。Redmine 是一个自由开源软件解决方案&#xff0c;…

【新版】系统架构设计师 - 系统测试与维护

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 系统测试与维护考点摘要软件测试软件测试 - 测试类型软件测试 - 静态测试软件测试 - 动态测试软件测试 - 测试阶段软件测试 - 测试阶段 - 单元测试软件测试 - 测试阶段 - 集成测试软件测试 - 测试…

我的创作纪念日(C++修仙练气期总结)

分享自己最喜欢的一首歌&#xff1a;空想フォレスト—伊東歌詞太郎 机缘 现在想想自己在CSDN创作的原因&#xff0c;一开始其实就是想着拿着博客当做自己的学习笔记&#xff0c;笔记嘛&#xff0c;随便写写&#xff0c;自己看得懂就ok了的态度凸(艹皿艹 )。也是用来作为自己学习…

2023年大数据与区块链国际会议 | EI、Scoups检索

会议简介 Brief Introduction 2023年大数据与区块链国际会议&#xff08;ICBDB 2023&#xff09; 会议时间&#xff1a;2023年11月17 -19日 召开地点&#xff1a;中国西安 大会官网&#xff1a;www.icobdb.org 2023年大数据与区块链国际会议&#xff08;ICBDB 2023&#xff09;…

基于swing的超市管理系统java仓库库存进销存jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于swing的超市管理系统 系统有3权限&#xff1a;管…

Nginx代理转发地址不正确问题

使用ngix前缀去代理转发一个地址&#xff0c;貌似成功了&#xff0c;但是进不到正确的页面&#xff0c;能够访问&#xff0c;但是一直404远处出来nginx会自动拼接地址在后面 后面才知道要将这段代码加上去&#xff0c;去除前缀转发

指针(一)【C语言进阶版】

大家好&#xff0c;我是深鱼~ 【前言】&#xff1a; 指针的主题&#xff0c;在初阶指针章节已经接触过了&#xff0c;我们知道了指针的概念&#xff1a; 1.指针就是个变量&#xff0c;用来存放地址&#xff0c;地址的唯一标识一块内存空间&#xff08;指针变量&#xff09;&a…

8月16日上课内容 第二章 部署LVS-DR群集

本章结构&#xff1a; 数据包流向分析: 数据包流向分析&#xff1a; &#xff08;1&#xff09;客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。 &#xf…

SCConv:用于特征冗余的空间和通道重构卷积

文章目录 摘要1、简介2、方法2.1、SRU用于空间冗余2.2. CRU用于通道冗余2.3、复杂性分析 3、实验3.1、实验设置3.3、基于CIFAR的图像分类3.4、基于ImageNet的图像分类3.5、物体检测 4、结论 摘要 代码链接&#xff1a;https://github.com/cheng-haha/ScConv 论文链接&#xff…

损失函数,基于概率分布度量的损失函数,信息量,信息熵的作用

目录 损失函数中为什么要用Log&#xff1a;概率损失函数-乘法转加法-便于求偏导 信息量&#xff0c;信息熵的作用 信息的作用是消除不确定性&#xff1a;信息量是0&#xff0c;事件确定 回答只是Y,N&#xff0c;因此对数底数为2​编辑 一句话描述的事件发生的概率越低&#…