“深入了解Spring框架:IOC、注入方式和与Web容器的整合“

简介: “深入了解Spring框架:IOC、注入方式和与Web容器的整合“

Spring是一个轻量级的开源Java框架,用于构建企业级应用程序。它提供了一种全面的编程和配置模型,用于开发灵活、可扩展的应用程序。Spring框架的核心特性包括依赖注入(DI)、面向切面编程(AOP)、控制反转(IOC)等。

2. Spring的IOC(控制反转)

IOC是Spring框架的核心概念之一,也是Spring框架的基石。IOC的基本思想是将对象的创建、组装和管理交给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">
    <bean class="com.yuan.web.UserAction" id="userAction" >
        <property name="userService" ref="userService"></property>
    </bean>
    <bean class="com.yuan.web.GoodsAction" id="goodsAction" >
        <property name="userService" ref="userService2"></property>
    </bean>
    <bean class="com.yuan.service.impl.UserServiceimpl1" id="userService"></bean>
    <bean class="com.yuan.service.impl.UserServiceimpl2" id="userService2"></bean>
</beans>
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
  • UserService
package com.yuan.service;
/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-08-15 14:10
 */
public interface UserService {
    public void update();
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
  • UserAction
package com.yuan.web;
import com.yuan.service.UserService;
/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-08-15 14:15
 */
public class UserAction {
    private UserService userService;
    public String update(){
        userService.update();
        return "list";
    }
    public UserService getUserService() {
        return userService;
    }
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17
• 18
• 19
• 20
• 21
• 22
• 23
• 24
• 25
• 26
• 27
  • GoodsAction
package com.yuan.web;
import com.yuan.service.UserService;
/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-08-15 14:15
 */
public class UserAction {
    private UserService userService;
    public String update(){
        userService.update();
        return "list";
    }
    public UserService getUserService() {
        return userService;
    }
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17
• 18
• 19
• 20
• 21
• 22
• 23
• 24
• 25
• 26
• 27
  • 测试类
package com.yuan.text;
import com.yuan.web.GoodsAction;
import com.yuan.web.UserAction;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-08-15 14:27
 */
public class demo1 {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
        UserAction userAction = (UserAction) context.getBean("userAction");
             userAction.update();
        GoodsAction goodsAction = (GoodsAction) context.getBean("goodsAction");
            goodsAction.update();
    }
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17
• 18
• 19
• 20
• 21
• 22
• 23
• 24
  • 运行结果

3. Spring的注入方式

Spring框架提供了多种注入方式,以满足不同场景下的需求。下面介绍三种常用的注入方式:

3.1 第一种:构造函数注入

构造函数注入是通过调用目标对象的构造函数来完成依赖注入。在Spring配置文件中,通过标签指定构造函数的参数值或引用。

  • 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">
    <bean class="com.yuan.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="pros">
            <list>
                <value>维多利亚狗</value>
                <value>土狗</value>
            </list>
        </constructor-arg>
    </bean>
    <bean class="com.yuan.web.GoodsAction" id="goodsAction" >
        <property name="userService" ref="userService2"></property>
        <property name="gname" value="电脑"></property>
        <property name="age" value="10"></property>
        <property name="pors">
            <list>
                <value>程序员</value>
                <value>社会人</value>
            </list>
        </property>
    </bean>
    <bean class="com.yuan.service.impl.UserServiceimpl1" id="userService"></bean>
    <bean class="com.yuan.service.impl.UserServiceimpl2" id="userService2"></bean>
</beans>
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17
• 18
• 19
• 20
• 21
• 22
• 23
• 24
• 25
• 26
• 27
• 28
• 29
• 30
• 31
  • 运行结果

3.2 第二种:Setter方法注入

Setter方法注入是通过调用目标对象的Setter方法来完成依赖注入。在Spring配置文件中,通过标签指定属性的值或引用。

  • 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">
    <bean class="com.yuan.web.UserAction" id="userAction" >
        <property name="userService" ref="userService"></property>
    </bean>
    <bean class="com.yuan.web.GoodsAction" id="goodsAction" >
        <property name="userService" ref="userService2"></property>
        <property name="gname" value="电脑"></property>
        <property name="age" value="10"></property>
        <property name="pors">
            <list>
                <value>程序员</value>
                <value>社会人</value>
            </list>
        </property>
    </bean>
    <bean class="com.yuan.service.impl.UserServiceimpl1" id="userService"></bean>
    <bean class="com.yuan.service.impl.UserServiceimpl2" id="userService2"></bean>
</beans>
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17
• 18
• 19
• 20
• 21
• 22
  • 运行结果

3.3 第三种:注解注入

注解注入是通过在目标对象的属性、构造函数或Setter方法上添加注解来完成依赖注入。常用的注解包括@Autowired、@Resource等。

按名称注入(byname):

使用@Autowired注解时,如果存在多个同类型的Bean对象,Spring会根据依赖对象的名称来进行注入。

在注入时,Spring会查找与依赖对象名称相同的Bean对象,并将其注入到目标对象中。

如果找不到与依赖对象名称相同的Bean对象,Spring会抛出异常。

按类型注入(byType):

使用@Autowired注解时,如果存在多个同类型的Bean对象,Spring会根据依赖对象的类型来进行注入。

在注入时,Spring会查找与依赖对象类型相同的Bean对象,并将其注入到目标对象中。

如果找不到与依赖对象类型相同的Bean对象,Spring会抛出异常。

4. Spring与Web容器的整合

Spring框架与Web容器的整合是为了更好地支持Web应用程序的开发。Spring提供了多种方式与Web容器进行整合,常见的方式包括:

  • 4.1 使用Spring MVC框架:Spring MVC是Spring框架的一部分,用于开发基于MVC模式的Web应用程序。通过配置Spring MVC,可以将请求映射到相应的控制器,并实现灵活的请求处理和视图渲染。
  • 4.2 使用Spring Boot:Spring Boot是Spring框架的扩展,用于简化Spring应用程序的开发和部署。Spring Boot提供了内嵌的Web容器,可以直接运行Spring应用程序,无需额外配置。
  • 4.3 使用Spring和其他Web容器的集成:Spring框架可以与其他常见的Web容器(如Tomcat、Jetty等)进行集成,通过配置文件或注解来实现。

配置监听器

package com.yuan.listeer;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-08-15 16:40
 */
@WebListener("")
public class SpringLoadListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce) {
        //将spring上下文放入Tomcat上下文
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
        //获取Tomcat上下文
        ServletContext servletContext = sce.getServletContext();
        servletContext.setAttribute("springContext",context);
    }
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17
• 18
• 19
• 20
• 21
• 22
• 23
• 24
• 25
• 26
• 27
• 28
• 29
• 30
• 31

配置Servlet

package com.yuan.servlet;
import com.yuan.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 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-08-15 16:49
 */@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 {
        //获取spring上下文对象
        ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) req.getServletContext().getAttribute("springContext");
        UserService userService = (UserService) context.getBean("userService");
        userService.update();
        System.out.println(userService);
    }
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17
• 18
• 19
• 20
• 21
• 22
• 23
• 24
• 25
• 26
• 27
• 28
• 29
• 30
• 31
• 32
• 33
• 34
• 35
  • 运行结果

总结:

本篇博客介绍了Spring框架的基本概念和核心特性,重点讲解了IOC、注入方式和与Web容器的整合。通过深入了解Spring框架,开发人员可以更好地利用Spring提供的功能和特性,提高应用程序的开发效率和质量。


相关文章
|
10天前
|
消息中间件 人工智能 Kubernetes
解密开源Serverless容器框架:事件驱动篇
Knative是一款基于Kubernetes的开源Serverless框架,提供了云原生、跨平台的Serverless编排标准。作为Serverless中必不可少的事件驱动能力,Knative Eventing提供了云原生的事件驱动能力。
|
4月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
1月前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
1月前
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
51 0
|
3月前
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
155 3
|
2月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
80 0
|
2月前
|
Java 应用服务中间件 Apache
浅谈Tomcat和其他WEB容器的区别
Tomcat是一款轻量级的免费开源Web应用服务器,常用于中小型系统及并发访问量适中的场景,尤其适合开发和调试JSP程序。它不仅能处理HTML页面,还充当Servlet和JSP容器。相比之下,物理服务器是指具备处理器、硬盘等硬件设施的服务器,如云服务器,其设计目标是在处理能力、稳定性和安全性等方面提供高标准服务。简言之,Tomcat专注于运行Java应用,而物理服务器则提供基础计算资源。
|
4月前
|
XML Java 数据格式
Spring5入门到实战------8、IOC容器-Bean管理注解方式
这篇文章详细介绍了Spring5框架中使用注解进行Bean管理的方法,包括创建Bean的注解、自动装配和属性注入的注解,以及如何用配置类替代XML配置文件实现完全注解开发。
Spring5入门到实战------8、IOC容器-Bean管理注解方式
|
4月前
|
Kubernetes 安全 JavaScript
Docker 与 Podman:探索用于现代 Web 开发的容器技术
在软件开发中,Docker 和 Podman 作为主流容器化技术,各具特色。本文深入对比两者优缺点,探讨其实用场景与部署Web应用的最佳实践。Docker 凭借成熟生态和跨平台能力引领潮流;Podman 以无守护进程架构提升安全与效率。通过具体示例展示如何构建和运行Node.js与Angular应用,帮助读者理解核心命令与配置要点。无论是在开发环境还是生产部署,选择合适的工具能显著增强应用的安全性和稳定性。
368 0
|
17天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
157 77