Spring讲解和ioc用途及Web容器的整合

news2024/11/24 1:52:50

目录

一、Spring概述

( 1 ) 背景

( 2 ) 是什么

( 3 ) 核心特性

二、Spring中的ioc

2.1 讲解

2.2 主要功能

2.3 实例演示

三、注入方式

3.1 set注入

3.2 构造注入

3.3 接口注入

四、Web容器整合

4.1 思考

4.2 实操

对我们的收获


一、Spring概述

( 1 ) 背景

Spring框架的背景和诞生可以追溯到Java企业级应用开发(Java EE)的发展过程中。

在传统的Java EE开发中,应用程序的开发和部署往往需要涉及大量的配置文件和繁琐的代码。开发人员需要手动管理对象的生命周期、依赖关系和事务处理等。这种开发模式存在许多痛点,包括开发效率低下、代码冗余、维护困难等。

为了解决这些问题,Rod Johnson于2002年创建了Spring框架。他的目标是简化Java企业级应用程序的开发,使开发人员能够更加专注于解决业务逻辑,而不是被底层的技术细节所束缚。

Spring框架的设计理念基于两个关键概念:IoC(控制反转)和AOP(面向切面编程)。

控制反转(IoC)是一种设计原则,通过将对象的创建、配置和管理交由容器负责,实现了对象之间的松耦合。开发人员只需描述对象之间的依赖关系,容器负责将这些对象进行实例化并通过依赖注入的方式传递依赖关系。这种反转控制的方式提高了代码的可测试性、扩展性和可维护性。

面向切面编程(AOP)则是一种编程范式,用于实现横切关注点的复用和模块化。通过AOP,开发人员可以将与核心业务逻辑无关的功能(如日志记录、事务管理等)以切面的方式进行统一管理,避免了代码的重复。

Spring框架的出现填补了Java EE开发过程中的许多空白,大大简化了企业级应用程序的开发和维护工作。它提供了一套强大而灵活的工具和模块,涵盖了从底层基础设施到应用程序逻辑的方方面面。因此,Spring框架成为了Java开发社区中最受欢迎和广泛应用的开源开发框架之一。

( 2 ) 是什么

  • Spring是一个基于Java平台的应用程序开发框架,它为开发人员提供了一套灵活的工具和库,用于构建和部署高性能的企业级应用程序。
  • Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
  • Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
  •  然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
  • 除此之外,Spring还提供了诸如事务管理、消息传递、调度任务、缓存等功能模块,以满足不同应用场景的需求。
  • Spring框架是一个强大而灵活的Java开发框架,旨在简化企业级应用程序的开发过程,提高开发效率,降低代码的复杂性,并促进代码的重用和可维护性。它的设计思想和功能模块使其成为当今Java开发领域最受欢迎和广泛使用的开发框架之一。
  • 总体而言,Spring框架提供了丰富的功能和模块,帮助开发人员构建可维护、可扩展、高性能的企业级应用程序。它的开放性和灵活性使得它成为Java开发领域中最流行的应用程序开发框架之一。 

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

( 3 ) 核心特性

Spring框架的设计理念是基于IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)的原则。它的目标是简化企业级应用程序的开发过程,使开发人员能够更加专注于业务逻辑的实现,而无需关注底层的基础设施代码。

Spring框架的核心特性包括:

  • 1. IoC容器:Spring的IoC容器将应用程序的组件(如对象、依赖等)的创建、配置和管理工作都交由容器负责。开发人员只需通过配置文件或注解方式告知容器需要创建哪些对象,容器会自动完成对象的实例化和依赖注入。
  • 2. AOP支持:Spring提供了对AOP的全面支持,使开发人员能够更加方便地在应用程序中实现横切关注点的模块化和复用。通过AOP,开发人员可以将一些与核心业务逻辑无关的功能,如日志记录、事务管理等,以切面的方式进行统一管理。
  • 3. 数据访问支持:Spring提供了丰富的数据访问支持,包括对ORM框架(如Hibernate、MyBatis)、JDBC、事务管理等的集成。开发人员可以通过Spring的数据访问模块,更加方便地进行数据库操作。
  • 4. MVC框架:Spring的MVC框架是一种基于模型-视图-控制器(Model-View-Controller)的Web应用程序开发框架。它提供了一个灵活、可扩展的模型视图控制器架构,使开发人员能够更加高效地开发Web应用程序。
  • 5. 安全性支持:Spring提供了一套完整的安全性支持,包括基于角色的访问控制、身份验证、加密等功能。开发人员可以通过Spring的安全模块,更好地保护应用程序的数据和资源。

二、Spring中的ioc

2.1 讲解

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

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

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

2.2 主要功能

IoC容器提供了以下主要功能:

  1. 对象的实例化:IoC容器负责创建应用程序所需要的对象实例。开发人员只需提供对象的配置信息,容器会根据配置信息创建对象,并管理对象的生命周期。
  2. 依赖注入:IoC容器负责将对象之间的依赖关系注入到对象中。开发人员只需声明对象所需要的依赖,容器会根据依赖关系自动注入相关的对象。这样,对象之间的依赖关系通过容器自动管理,减少了对象之间的解耦。
  3. 配置管理:IoC容器通过配置文件或注解的方式管理对象的配置信息。开发人员可以在配置文件中定义对象的属性、依赖关系和生命周期等信息,容器会根据配置信息完成对象的创建和配置过程。
  4. 生命周期管理:IoC容器负责管理对象的生命周期。在对象被创建之前和销毁之后,容器会触发相应的回调方法,进行初始化和清理工作。开发人员可以通过实现特定的接口或添加特定的注解来定义对象的生命周期的行为。

通过使用IoC容器,开发人员可以更加专注于业务逻辑的实现,而不用关心对象的创建和配置过程。这样可以大大简化代码,提高开发效率,同时也使得代码更加松耦合、可维护和可测试。Spring框架的IoC容器是Spring应用程序开发中一个重要的基础设施,为开发人员带来了诸多好处。

2.3 实例演示

控制反转 : 将实例化对象的权力,由开发者控制转交给spring容量来控制 

可以先按照我这个项目结构来创建以下接口和类及xml配置文件。(也可根据自己习惯创建)

     

 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>Spring</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>Spring 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>Spring</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 接口

package com.CloudJun.ioc.service;

/**
 * @author CloudJun
 * @create  2023-08-15 9:14
 */
public interface UserService {

    public String update();

}
UserServiceImpl 实现类
package com.CloudJun.ioc.service.impl;

import com.CloudJun.ioc.service.UserService;

/**
 * @author CloudJun
 * @create  2023-08-15 9:15
 */
public class UserServiceImpl implements UserService {

//    在原有的基础上做迭代 (进行增加/修改)

    public String update(){
        //如果已经修改用户信息方法
        System.out.println("修改个人用户信息");
        return "list";
    }

}

UserServiceImpl2 实现类

package com.CloudJun.ioc.service.impl;

import com.CloudJun.ioc.service.UserService;

/**
 * @author CloudJun
 * @create  2023-08-15 9:15
 */
public class UserServiceImpl2 implements UserService {

//    在原有的基础上做迭代 (进行增加/修改)

    public String update(){
        //如果已经修改用户信息方法
        System.out.println("修改个人用户信息");
        //例如:需要增加修改用户头像的方法
        System.out.println("更改用户头像信息");

        return "list";
    }

}

GoodsAction 控制器

package com.CloudJun.ioc.web;

import com.CloudJun.ioc.service.UserService;
import com.CloudJun.ioc.service.impl.UserServiceImpl;

/**
 * @author CloudJun
 * @create  2023-08-15 11:08
 */
public class GoodsAction {

    public UserService getUserService() {
        return userService;
    }

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

    /**
     * 例如:在不同的控制器中进行方法调用
     */
    private UserService userService;


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

UserAction 控制器

package com.CloudJun.ioc.web;

import com.CloudJun.ioc.service.UserService;
import com.CloudJun.ioc.service.impl.UserServiceImpl;

/**
 * @author CloudJun
 * @create  2023-08-15 1058
 */
public class UserAction {

    /**
     * 手动实例化的弊端
     *  1.如果依赖的接口实现需要大批量改动及迭代时,维护的成本极高
     *  2.当接口的实现类不统一,维护成本更高
     */

    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.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>

        </bean>

        <bean class="com.CloudJun.ioc.service.impl.UserServiceImpl" id="userServiceImpl" ></bean>
        <bean class="com.CloudJun.ioc.service.impl.UserServiceImpl2" id="userServiceImpl2"></bean>
</beans>

demo 测试类

package com.CloudJun.ioc.demo;

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

/**
 * @author CloudJun
 * @create  2023-08-15 11:42
 */
public class demo {

    public static void main(String[] args) {

        //加载spring核心配置文件(建模),获取spring上下文对象及上下文对象中可以获取任何javabean的对象
        ClassPathXmlApplicationContext  context  =  new ClassPathXmlApplicationContext("/spring-context.xml");

        UserAction userAction  = (UserAction) context.getBean("userAction");
        System.out.println("没有增加/修改(迭代)的输出");
        userAction.update();

        GoodsAction goodsAction = (GoodsAction) context.getBean("goodsAction");
        System.out.println("进行了增加/修改(迭代)的输出");
        goodsAction.update();

    }

}

测试结果:

三、注入方式

3.1 set注入

将GoogsAction中的所有代码修改为以下代码:

package com.CloudJun.ioc.web;

import com.CloudJun.ioc.service.UserService;

import java.util.List;

/**
 * @author CloudJun
 * @create  2023-08-15 11:08
 */
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">

<!--    在spring配置文件spring-context.xml中配置,那么该类javabean就交给spring容器管理 -->

        <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>

最后返回到demo测试类里面进行执行,结果为:

3.2 构造注入

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

package com.CloudJun.ioc.web;

import com.CloudJun.ioc.service.UserService;

import java.util.List;

/**
 * @author CloudJun
 * @create  2023-08-15 1058
 */
public class UserAction {

    /**
     * 手动实例化的弊端
     *  1.如果依赖的接口实现需要大批量改动及迭代时,维护的成本极高
     *  2.当接口的实现类不统一,维护成本更高
     */

    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";
     }


}

 再修改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">

<!--    在spring配置文件spring-context.xml中配置,那么该类javabean就交给spring容器管理 -->

        <bean class="com.CloudJun.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>

        <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>

最后返回到demo测试类里面进行执行,结果为:

3.3 接口注入

自动装配: byName  byType

byName:javaBean会根据属性名在spring的上下文中的bean的id进行查找,主要有就会自动装配

修改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">

<!--    在spring配置文件spring-context.xml中配置,那么该类javabean就交给spring容器管理 -->

        <bean class="com.CloudJun.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>

        <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>

测试结果:

注意:如果名称不同或者没有改名称将会有空指针报错(null值报错) 

byType:JavaBean会议根据属性名对应的接口,在spring上下文中进行查找

查找方式:是根据spring上下文中是否有接口实现类进行匹配,只要有就自动配置。

修改spring-context.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       default-autowire="byType"
       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.CloudJun.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>

        <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>

测试结果:

注意:如果没有或者有两个以上的接口实现类将会报错,因为是自动查询如有多个将不知道是哪个。

四、Web容器整合

4.1 思考

  1. 现在是每一个请求都建模一次,非常消耗性能。
  2. 希望只进行一次建模,然后每个请求都要可以获取到spring上下文。
  3. 那就是 监听器 ,将spring上下文放入tomcat上下文中。

4.2 实操

修改spring-context.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       default-autowire="byType"
       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.CloudJun.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>

        <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>

之后创建一个监听器: SpringListener

package com.CloudJun.ioc.listener;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * @author CloudJun
 * @create  2023-08-16 20:21
 */
@WebListener
public class SpringListener implements ServletContextListener {

        //将spring上下文放入tomcat上下文中。

    public void contextInitialized(ServletContextEvent sce) {
        //加载spring核心配置文件(建模),获取spring上下文对象及上下文对象中可以获取任何javabean的对象
        ClassPathXmlApplicationContext context  =  new ClassPathXmlApplicationContext("/spring-context.xml");
        //获取tomcat上下文
        ServletContext servletContext= sce.getServletContext();
        servletContext.setAttribute("springContext",context);

    }



}

之后进行测试,我们创建一个UserServlet进行访问

package com.CloudJun.ioc.web;

import com.CloudJun.ioc.service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author CloudJun
 * @create  2023-08-16 20:28
 */

@WebServlet("/userList")
public class UserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ClassPathXmlApplicationContext context  = (ClassPathXmlApplicationContext) req.getServletContext().getAttribute("springContext");

        UserService userService= (UserService) context.getBean("userService");
        System.out.println(userService);
        userService.update();

    }
}

然后开启服务器(Tomcat) 进行请求测试 

打开浏览器

直接输入请求地址: localhost:8080/Spring_war/userList (Spring_war中间这个是可以自己修改的,需要根据自己的请求地址进行访问)

请求完毕后直接看控制台的测试结果

 

对我们的收获

学习Spring框架后,你将获得以下几方面的收获:

  • 1. 简化开发流程:Spring框架提供了丰富的开发工具和模块,帮助你简化企业级应用程序的开发过程。通过使用Spring的IoC容器和注解,你可以将应用程序的对象的创建和配置工作交给框架处理,从而简化了开发过程,减少了冗余的代码。
  • 2. 提高开发效率:Spring框架提供了很多现成的功能模块,如数据访问、事务管理、安全性支持等,可以减少开发人员手动编写这些功能模块的工作量。你可以通过配置或注解的方式快速集成这些功能,从而提高了开发效率。
  • 3. 松耦合的设计:通过IoC容器和依赖注入,Spring框架实现了对象之间的松耦合。你可以更加专注于业务逻辑的实现,而不用过多关注对象之间的依赖关系。这种松耦合的设计使得应用程序更加灵活、可扩展和易于维护。
  • 4. 更好的可测试性:Spring框架的设计理念使得应用程序的各个组件可以更容易地进行单元测试和集成测试。通过依赖注入,你可以轻松地模拟各个组件的依赖关系,从而更方便地编写测试代码,并保证应用程序的质量。
  • 5. AOP的应用:Spring框架提供了全面的AOP支持,使你能够将与核心业务逻辑无关的功能模块(如事务管理、日志记录、缓存等)以切面的方式进行统一管理。这种模块化的设计能够提高代码的重用性和可维护性。
  • 6. 更好的代码组织和可维护性:通过使用Spring框架,你可以将应用程序的不同层次的代码(如控制层、业务逻辑层、数据访问层)更好地组织起来,实现代码的分层和模块化。这种组织方式使得代码更具可读性、可维护性,方便团队协作开发。

总而言之,学习Spring框架将带给你更高效、灵活和高质量的应用程序开发能力。通过掌握Spring的核心概念和功能,你能够更有效地构建和管理企业级应用程序,并在日常开发中享受到框架带来的便利和效益。

                                              

 

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

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

相关文章

春秋云镜 CVE-2020-17530

春秋云镜 CVE-2020-17530 S2-061 靶标介绍 对CVE-2019-0230的绕过&#xff0c;Struts2官方对CVE-2019-0230的修复方式是加强OGNL表达式沙盒&#xff0c;而CVE-2020-17530绕过了该沙盒。当对标签属性中的原始用户输入进行评估时&#xff0c;强制 OGNL 评估可能会导致远程代码执…

C语言实例_获取文件MD5值

一、MD5介绍 MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种常用的哈希函数算法。将任意长度的数据作为输入&#xff0c;并生成一个唯一的、固定长度&#xff08;通常是128位&#xff09;的哈希值&#xff0c;称为MD5值。MD5算法以其高度可靠性和广泛应用而闻名…

15-生命周期

Vue生命周期 和 生命周期的四个阶段 Vue生命周期总结: 四个阶段,八个钩子 -> 三个常用 created,mounted,beforeDestroy 生命周期的钩子函数 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"…

智能报警系统:利用人工智能保障安全和及时应对危险

引言&#xff1a;随着人工智能的快速发展&#xff0c;智能报警系统成为了一种高效、及时应对危险和保障安全的重要工具。通过分析监控视频中的图像、声音以及其他传感器数据&#xff0c;人工智能可以自动检测和识别火灾、破坏、烟雾、异常温度等情况&#xff0c;并及时触发报警…

STM32单片机SPI通信实战:示例代码详解与应用案例

引言&#xff1a; 单片机SPI&#xff08;串行外设接口&#xff09;通信是一种常用的串行同步通信协议&#xff0c;用于单片机与外设之间的高速数据传输。SPI通信具有简单、高效、可靠等特点&#xff0c;在各种嵌入式系统中被广泛应用。本文将介绍单片机SPI通信的原理、配置和性…

WebRTC | 网络传输协议RTP与RTCP

目录 一、UDP与TCP 1. TCP 2. UDP 二、RTP 1. RTP协议头 &#xff08;1&#xff09;V&#xff08;Version&#xff09;字段 &#xff08;2&#xff09;P&#xff08;Padding&#xff09;字段 &#xff08;3&#xff09;X&#xff08;eXtension&#xff09;字段 &#x…

嵌入式笔试面试刷题(day11)

文章目录 前言一、字节流&#xff0c;数据报&#xff0c;报文二、makefile怎么引入库和模块三、多次free一块内存空间会怎么样四、字符操作函数越界会发生什么五、QT中一个信号可以连接多个槽函数吗六、QT中一个槽函数可以对应多个信号吗总结 前言 本篇文章继续刷题。 一、字…

系统架构设计师---计算机基础知识之存储管理

存储管理的主要任务&#xff1a;提高主存的利用率、扩充主存以及对主存信息实现有效保护。 存储管理的对象&#xff1a;主存储器(简称主存或内存)。 逻辑地址和物理地址&#xff1a;用户编程所用的地址称为逻辑地址(虚地址)&#xff0c;而实际的内存地址 则称为物理地址(实地…

【组合数学】CF1622 D

Problem - 1622D - Codeforces 题意&#xff1a; 思路&#xff1a; 一开始的思路&#xff1a; 事实上&#xff0c;观察样例可知&#xff0c;如果一个小区间被包含在大区间里面&#xff0c;那么我们需要计算的是大区间的贡献 所以只需要找出大区间即可 一开始想的是找出所有…

C语言案例 判断是否为回文数-06.1

题目&#xff1a;随机输入一个5位数&#xff0c;判断它是不是回文数 步骤一&#xff1a;定义程序的目标 编写C程序&#xff0c;随机输入一个5位数&#xff0c;判断它是不是回文数 步骤二&#xff1a;程序设计 原理&#xff1a;即12321是回文数&#xff0c;个位与万位相同&#…

剑指Offer68-II.二叉树的最近公共祖先 C++

1、题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…

前端开发,怎么解决浏览器兼容性问题? - 易智编译EaseEditing

解决浏览器兼容性问题是前端开发中常见的挑战之一。不同的浏览器可能对网页元素的渲染和功能支持有所不同&#xff0c;因此需要采取一些策略来确保您的网页在不同浏览器上都能正常运行和呈现。以下是一些解决浏览器兼容性问题的方法和策略&#xff1a; 使用CSS Reset&#xff…

(三)行为模式:2、命令模式(Command Pattern)(C++示例)

目录 1、命令模式&#xff08;Command Pattern&#xff09;含义 2、命令模式的UML图学习 3、命令模式的应用场景 4、命令模式的优缺点 5、C实现命令模式的实例 1、命令模式&#xff08;Command Pattern&#xff09;含义 命令模式&#xff08;Command&#xff09;&#xff…

土地利用变化碳排放效应的遥感监测、生态系统碳库的遥感估算、收支的遥感模拟、能源消耗碳排放空间格局模拟

以全球变暖为主要特征的气候变化已成为全球性环境问题&#xff0c;对全球可持续发展带来严峻挑战。2015年多国在《巴黎协定》上明确提出缔约方应尽快实现碳达峰和碳中和目标。2019年第49届 IPCC全会明确增加了基于卫星遥感的排放清单校验方法。随着碳中和目标以及全球碳盘点的现…

UI界面设置

文章目录 1. 修改 share.html 内容如下&#xff1a;2. 修改 html 文件格式为 utf-83.保存&#xff0c;运行程序4. 访问页面 1. 修改 share.html 内容如下&#xff1a; <!DOCTYPE html><html> <head><meta charset"utf-8"><title>1v1屏…

创建和使用角色

创建和使用角色 根据下列要求&#xff0c;在 /home/curtis/ansible/roles 中创建名为 apache 的角色&#xff1a; httpd 软件包已安装&#xff0c;设为在系统启动时启用并启动 防火墙已启用并正在运行&#xff0c;并使用允许访问 Web 服务器的规则 模板文件 index.html.j2 已存…

【ROS】服务通信--从理论介绍到模型实现

一、概念介绍 服务通信也是ROS中一种极其常用的通信模式&#xff0c;服务通信是基于请求响应模式的&#xff0c;是一种应答机制。也即: 一个节点A向另一个节点B发送请求&#xff0c;B接收处理请求并产生响应结果返回给A。 一个节点需要向相机节点发送拍照请求&#xff0c;相机…

关于STM32Cube的HAL库使用RTOS设置且给芯片下载的注意事项

学了标准库和RTOS之后&#xff0c;发现HAL库开发比较快&#xff0c;于是尝试使用HAL库开发ROTS程序&#xff0c; 第一次下载程序到芯片发现程序是运行了&#xff0c;但是不能再次下载程序&#xff08;也就是不能检测到ST-link或者DIP等接口&#xff09; 于是根据BOOT0和BOOT1…

璞睿互联教师评价系统 | 助推教师评价改革,促进教学智能化发展!

近年来&#xff0c;随着信息技术的不断发展&#xff0c;教育评价面临了一系列挑战。主要表现在教学评价空间的广泛场景化、教学评价内容的多元化以及教学评价方式的智能化。为了应对这些挑战并满足新时代教育评价改革的需求&#xff0c;璞睿互联积极探索实现教师评价智能化的途…

Fedora38下中文输入法,与切换问题

前言 首先&#xff0c;由于本人先前一直用Ununtu&#xff0c;下意识会安装googlepinyin,但是在Fedpra上其实根本没有必要这样做&#xff0c;他是支持汉语输入&#xff0c;而且做得更好。 一、安装汉语键盘输入 1、点击setting(设置) 2、找到keyboard(键盘)、Input Sourses(点…