【Spring系列篇--关于IOC的详解】

目录

面试经典题目:

[1. 什么是spring?你对Spring的理解?简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。](#1. 什么是spring?你对Spring的理解?简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。)

2.什么是IoC?你对IoC的理解?IoC的重要性?将实例化对象的权利从程序员手上交到spring容器控制

[3.IoC的三种注入方式( 1、set注入 2、构造注入 3、自动装配)](#3.IoC的三种注入方式( 1、set注入 2、构造注入 3、自动装配))

3.1构造方法注入构造函数注入:通过构造函数来注入依赖对象。在类的构造函数中声明依赖对象的参数,并在容器中配置时提供相应的依赖对象。当创建对象实例时,容器会自动将依赖对象传递给构造函数,完成依赖注入。

[4.Spring与web容器的整合 Spring与web容器的整合过程](#4.Spring与web容器的整合 Spring与web容器的整合过程)

5.总结


前言:

今天小编给大家带来一个开源框架的知识学习。希望你们看完我的这篇文章可以将提升你的一个开发的能力!

面试经典题目:

1. 什么是spring?你对Spring的理解?

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

Spring框架是 Java 平台的一个开源的全栈(full-stack)应用程序框架和控制反转容器实现,一般被直接称为 Spring。它由Rod Johnson创建,去搜索了它的资料很难想象Rod Johnson之前是学音乐。该框架的一些核心功能理论上可用于任何 Java 应用,它还为基于Java企业版平台构建的 Web 应用提供了大量的拓展支持。Spring 没有直接实现任何的编程模型,但它已经在 Java 社区中广为流行,基本上完全代替了 企业级JavaBeans(EJB)模型。

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

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

如下图(Spring所包含的功能):

关于IoC,AoP介绍

控制反转(IoC):Spring通过IoC容器管理应用程序中的对象依赖关系。它将对象的创建、组装和管理工作交给了容器,开发人员只需要关注业务逻辑的实现。

面向切面编程(AOP):Spring支持AOP,可以将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高代码的模块化和可重用性。

2.什么是IoC?你对IoC的理解?IoC的重要性?

将实例化对象的权利从程序员手上交到spring容器控制

好处:使得横切逻辑与业务逻辑分离,提高了代码的模块化和可维护性。

例如:完成的需求:给客户添加一个文件上传的接口,实现文件上传的功能, 客户在使用了之后,觉得上传文件的速度太慢了,要求提升该功能的性能,我们使用了IoC就可以方便我们的需求添加,更改了。

3.IoC的三种注入方式( 1、set注入 2、构造注入 3、自动装配)

3.1构造方法注入

构造函数注入:通过构造函数来注入依赖对象。在类的构造函数中声明依赖对象的参数,并在容器中配置时提供相应的依赖对象。当创建对象实例时,容器会自动将依赖对象传递给构造函数,完成依赖注入。

代码演示:

package com.lya.ioc;

/**
 * @author 程序猿-小李哥
 * @site www.xiaolige.com
 * @company 猪八戒有限集团
 * @create 2023-08-15-14:42
 *
 * 用户更改信息的接口
 */
public interface UserService {
    public void update();
}

实现类:

package com.lya.ioc.service.impl;

import com.lya.ioc.UserService;

/**
 * @author 程序猿-小李哥
 * @site www.xiaolige.com
 * @company 猪八戒有限集团
 * @create 2023-08-15-14:44
 */
public class UserServiceImpl1 implements UserService {
    public void update() {
        System.out.println("更改个人信息");

//        System.out.println("上传头像功能");
    }
}

编写控制器(action)进行调用并编写无参和有参构造方法

package web;

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

/**
 * @author 程序猿-小李哥
 * @site www.xiaolige.com
 * @company 猪八戒有限集团
 * @create 2023-08-15-15:19
 */
public class UserAction {
    private UserService userService = new UserServiceImpl1();
    public String update(){
        userService.update();
        return "list";
    }
}

定义Bean:在spring.xml文件中,可以使用XML配置元素来定义应用程序中的Bean对象。通过配置Bean的类路径、构造函数,Spring容器可以根据配置文件中的定义来创建和管理Bean对象。

配置依赖注入:spring.xml文件可以指定Bean之间的依赖关系,通过配置构造函数注入,将依赖的Bean (userService) 注入到目标Bean (userAction) 中,实现依赖注入。这样可以实现对象之间的解耦,提高代码的灵活性和可测试性。

<?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.ycxw.ioc.web.UserAction" id="userAction">
        <constructor-arg name="userService" ref="userService"></constructor-arg>
    </bean>
    <bean class="com.ycxw.ioc.service.impl.UserServiceImpl1" id="userService"></bean>
</beans>

3.2 setter方法注入

通过setter方法来注入依赖对象。在类中定义相应的setter方法,并在容器中配置时使用相应的属性或标签指定依赖对象。当创建对象实例后,容器会调用相应的setter方法,将依赖对象注入到对象中。

示例代码:

  1. 修改了控制器(action)
public class UserAction {
	private UserService userService;
	private String uname;
	private int age;
	private List<String> hobby;

	public void test2() {
		System.out.println(this.uname);
		System.out.println(this.age);
		System.out.println(this.hobby);
	}

	public UserAction(String uname, int age) {
		super();
		this.uname = uname;
		this.age = age;
	}

	public UserAction() {
		super();
	}
  1. 修改了bean注入的方式 (property)

    <?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.ycxw.ioc.web.UserAction" id="userAction">
      <property name="userService" ref="userService"></property>
     <bean class="com.ycxw.ioc.service.impl.UserServiceImpl1" id="userService"></bean>
    
    </beans>

3.3 接口注入(自动分配)

三、这里请注意byType 和 byName 的区别:

  1. byType(按类型自动装配):

在byType模式下,Spring容器会根据属性的类型来查找与之匹配的Bean,并将其自动注入到对应的属性上。

例如,如果一个属性的类型为userService,Spring容器会查找实现了userService接口的Bean,并将其注入到该属性上。

要使用byType模式,目标Bean的属性类型必须与其他Bean的类型匹配,并且在容器中只能有一个匹配的Bean。

  1. byName(按名称自动装配):

在byName模式下,Spring容器会根据属性的名称来查找与之匹配的Bean,并将其自动注入到对应的属性上。

例如,如果一个属性名为myBean,Spring容器会查找名称为myBean的Bean,并将其注入到该属性上。

要使用byName模式,目标Bean的属性名称必须与其他Bean的名称匹配。

4.Spring与web容器的整合

Spring与web容器的整合过程

Why: 建模的过程是十分耗时的

解决问题:

1、建模必不可少

2、建模要保证只执行一次

3、建模后期望在在每一个servlet都能够拿到Spring的上下文对象ClassPathXmlApplicationContext

How:

1、监听器的初始化方法

2、Spring的上下文 要存放在tomacat上下文中

DemoServlet :

package com.lya.ioc.demo;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import com.ycx.web.UserAction;
 
 
 
@WebServlet("/springDemo")
public class DemoServlet extends HttpServlet{
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
		ClassPathXmlApplicationContext context =(ClassPathXmlApplicationContext) req.getServletContext().getAttribute("springContext");
		UserAction userAction = (UserAction) context.getBean("userAction");
		userAction.list();
		
		
		super.service(req, res);
	}
}

配置监听

package com.lya.ioc.listener;
 
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import com.ycx.web.UserAction;
 
public class SpringLoadListener implements ServletContextListener{
 
	@Override
	public void contextInitialized(ServletContextEvent sce) {
System.out.println("初始化......");
		//	拿到Spring的上下文
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
//		将Spring上文保存到Tomcat上下文中
		ServletContext servletContext=sce.getServletContext();
		servletContext.setAttribute("springContext", context);
	
	
	}
	
}

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  <display-name>Archetype Created Web Application</display-name>
 
<listener>
	<listener-class>com.ycx.ioc.listener.SpringLoadListener</listener-class>
</listener>
 
</web-app>

5.总结

1、Spring的作用

它是一个容器框架 用来整合其他的第三方框架

有两大核心组件:IOC和aop

2、IOC的作用

特点:依赖注入、控制反转

控制反转:将创建对象的权利,由程序员手动new对象的权利交给Spring容器

优点:便于维护,拥抱变化

3、依赖注入的方式

set注入

构造注入

自动装配

4、自动装配

byName:根据bean的id在Spring的上下文进行寻找

byType:根据属性接口在Spring上下文找对应的接口实现类

5、Spring与web整合

相关推荐
憨子周36 分钟前
2M的带宽怎么怎么设置tcp滑动窗口以及连接池
java·网络·网络协议·tcp/ip
霖雨2 小时前
使用Visual Studio Code 快速新建Net项目
java·ide·windows·vscode·编辑器
SRY122404192 小时前
javaSE面试题
java·开发语言·面试
Fiercezm3 小时前
JUC学习
java
无尽的大道3 小时前
Java 泛型详解:参数化类型的强大之处
java·开发语言
ZIM学编程3 小时前
Java基础Day-Sixteen
java·开发语言·windows
我不是星海3 小时前
1.集合体系补充(1)
java·数据结构
P.H. Infinity3 小时前
【RabbitMQ】07-业务幂等处理
java·rabbitmq·java-rabbitmq
爱吃土豆的程序员3 小时前
java XMLStreamConstants.CDATA 无法识别 <![CDATA[]]>
xml·java·cdata
2401_857610034 小时前
多维视角下的知识管理:Spring Boot应用
java·spring boot·后端