SSM中Spring中对IOC的认识(第八课)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: SSM中Spring中对IOC的认识(第八课)

Spring第八课:带你了解一下IOC的底层原理 然后写出一个小的例子中的Demo

第一部分Spring框架的设计理念了解一下:


当你了解一个框架时,重要的是不仅要知道它做了什么,而且要知道它遵循什么原则。以下是 Spring Framework 的指导原则:


提供每个级别的选择。Spring 允许您尽可能晚地推迟设计决策。例如,您可以通过配置切换持久性提供程序,而无需更改代码。许多其他基础设施问题以及与第三方 API 的集成也是如此。


容纳不同的观点。Spring 拥抱灵活性,并且不会对事情应该如何做固执己见。它以不同的视角支持广泛的应用需求。


保持强大的向后兼容性。Spring 的演变经过精心管理,在版本之间几乎没有发生重大变化。Spring 支持精心挑选的一系列 JDK 版本和第三方库,以方便维护依赖于 Spring 的应用程序和库。


关心 API 设计。Spring 团队投入大量精力和时间来制作直观且可跨多个版本和多年使用的 API。


为代码质量设定高标准。Spring 框架非常强调有意义的、最新的和准确的 javadoc。它是极少数可以声称代码结构清晰且包之间没有循环依赖关系的项目之一。

第二部分理解 Spring IOC的概念是什么

IOC不是一种技术而是一种设计思想,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 在传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建; 何为控制反转? 传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象; 因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

第三部分案例分析

方案一:传通的开发方式

package Com.ko.dao;
public interface UserDao {
     void  getUser();
}
package Com.ko.dao;
public class UserDaoImpl implements UserDao {
    @Override
    public void getUser() {
        System.out.println("默认获取用户的数据信息");
    }
}
package Com.ko.dao;
public class UserDaoMysqlImpl  implements UserDao{
    @Override
    public void getUser() {
        System.out.println("MySql获取数据库的数据");
    }
}
package Com.ko.service;
public interface UserService {
    void  getUser();
}
package Com.ko.service;
import Com.ko.dao.UserDao;
import Com.ko.dao.UserDaoImpl;
import Com.ko.dao.UserDaoMysqlImpl;
public class UserServiceImpl implements  UserService{
        private UserDao userDao =new UserDaoImpl();
    @Override
    public void getUser() {
        userDao.getUser();
    }
}

上面是传通的方式 利用了 new 关键字  你会发现你要常常的去改源码 不符合设计模式的理论

方案二: 做下操作改造一下:

package Com.ko.service;
import Com.ko.dao.UserDao;
import Com.ko.dao.UserDaoImpl;
import Com.ko.dao.UserDaoMysqlImpl;
public class UserServiceImpl implements  UserService{
//    private UserDao userDao;
    /**
     * 控制反转
     * @param userDao
     */
//在原有的基础上加了一个Set方法
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
        private UserDao userDao =new UserDaoImpl();
    @Override
    public void getUser() {
        userDao.getUser();
    }
}
import Com.ko.dao.UserDaoImpl;
import Com.ko.dao.UserDaoMysqlImpl;
import Com.ko.service.UserService;
import Com.ko.service.UserServiceImpl;
import sun.rmi.transport.proxy.RMISocketInfo;
public class MyTest {
    public static void main(String[] args) {
        //用户实际调用业务层 dao层不需要接触
       UserService userService=new UserServiceImpl();
        (( UserServiceImpl) userService).setUserDao(new UserDaoMysqlImpl());
        userService.getUser();
    }
}

运行结果

 

第四部分IOC能做什么

1.IOC控制反转

IoC(Inversion of Control,控制反转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。而Spring提供了IOC容器来帮我们生成所需要的对象。也就是说在我们原先的对象中有用到其他对象的地方Spring会帮我们来注入。不用我们再去考虑这些问题。


2.DI(依赖注入)

spring提供了三种方式来依赖注入,有构造方法注入,setter方法注入以及接口注入。使用构造方法注入需要注意的一点就是要避免循环依赖。所谓的循环依赖指的就是在A对象的构造方法中Spring要注入B,而在B对象中Spring要注入A。这个时候会形成一个闭环因为Spring不知道该先注入哪一个接着会抛出异常。而Spring建议的处理方式是说如果遇到这种情况的话就改用Setter方式注入。 而spring就是通过反射来实现注入的。 理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”。 谁依赖谁:应用程序依赖于IoC容器; 为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源; 谁注入谁:IoC容器注入应用程序某个对象,应用程序依赖的对象; 注入了什么:注入某个对象所需要的外部资源(包括对象、资源、常量数据)

SpringIOC的第一个Demo本案例基于Maven项目开发

在Maven项目父工程中导入必要的依赖:

下面是导入Spring框架要的架包 之前是用架包的方式 现在统一用maven的依赖 一个原则 约定大于配置

官网的地址:https://mvnrepository.com/search?q=spring

 下面是依赖的是junit架包:

官网的介绍

 下面是依赖的是jdbc架包:

标题

上面maven坐标的官网地址:

Maven仓库中要的所有maven坐标https://mvnrepository.com/search?q=jdbc

配置文件:建议各位去官网中找 不要去复制 博客的博主的 毕竟学习是自己的事情 ,下面是步骤

官方的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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="..." class="...">  
        <!-- collaborators and configuration for this bean go here -->
    </bean>
    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
    </bean>
    <!-- more bean definitions go here -->
</beans>
package Com.lop.pojo;
public class Hello {
    private  String str;
//get set tostring 有参 无参
}

 Hellow hellow =new Hello()

   bean=对象 new Helo()

   id=变量名

   class=new 的对象

   property 相当于属性设置了值

该id属性是标识单个 bean 定义的字符串。

该class属性定义 bean 的类型并使用完全限定的类名。

<bean id="hello" class="Com.lop.pojo.Hello">
        <property name="str" value="spring"></property>
    </bean>
import Com.lop.pojo.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
    public static void main(String[] args) {
        //获取Spring的上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        //我们的对象现在都在Spring中管理了 我们要使用 直接取出又可以
        Hello hello = (Hello) context.getBean("hello");
        System.out.println(hello.toString());
    }
}

标题

Hello{str='spring'}  //str=spring咋来的?

初始Spring源码类的过程的大致过程:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

public class ClassPathXmlApplicationContext extends AbstractXmlApplicationContext {}


public abstract class AbstractXmlApplicationContext extends AbstractRefreshableConfigApplicationContext {}


public abstract class AbstractRefreshableConfigApplicationContext extends AbstractRefreshableApplicationContext implements BeanNameAware, InitializingBean {}


public abstract class AbstractRefreshableApplicationContext extends AbstractApplicationContext {}


public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {

public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable {}


public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {}

推荐两个官网:

https://mvnrepository.com/search?q=j

Core Technologies

下一课官网


https://blog.csdn.net/qq_56248592/article/details/126881753

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
ssm(Spring+Spring mvc+mybatis)——updateDept.jsp
ssm(Spring+Spring mvc+mybatis)——updateDept.jsp
11 0
|
3天前
ssm(Spring+Spring mvc+mybatis)——showDept.jsp
ssm(Spring+Spring mvc+mybatis)——showDept.jsp
10 0
|
3天前
|
XML Java 数据格式
Spring框架入门:IoC与DI
【5月更文挑战第15天】本文介绍了Spring框架的核心特性——IoC(控制反转)和DI(依赖注入)。IoC通过将对象的创建和依赖关系管理交给容器,实现解耦。DI作为IoC的实现方式,允许外部注入依赖对象。文章讨论了过度依赖容器、配置复杂度等常见问题,并提出通过合理划分配置、使用注解简化管理等解决策略。同时,提醒开发者注意过度依赖注入和循环依赖,建议适度使用构造器注入和避免循环引用。通过代码示例展示了注解实现DI和配置类的使用。掌握IoC和DI能提升应用的灵活性和可维护性,实践中的反思和优化至关重要。
17 4
|
3天前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
22 0
|
3天前
|
XML Java 程序员
Spring特性之二——IOC控制反转
Spring特性之二——IOC控制反转
16 4
|
3天前
|
安全 Java 开发者
在Spring框架中,IoC和AOP是如何实现的?
【4月更文挑战第30天】在Spring框架中,IoC和AOP是如何实现的?
24 0
|
3天前
|
XML Java 程序员
什么是Spring的IoC容器?
【4月更文挑战第30天】什么是Spring的IoC容器?
20 0
|
3天前
|
Java Spring 容器
【Spring系列笔记】IOC与DI
IoC 和 DI 是面向对象编程中的两个相关概念,它们主要用于解决程序中的依赖管理和解耦问题。 控制反转是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入和依赖查找。
34 2
|
3天前
|
Java 测试技术 数据库连接
Spring中ioc的优点
总之,Spring中的IoC提供了一种更加灵活、可维护、可测试和可扩展的方式来管理组件之间的依赖关系,从而提高了应用程序的质量和可维护性。这使得开发人员能够更专注于业务逻辑而不是底层的技术细节。
32 1
|
3天前
|
Java 应用服务中间件 Spring