【Spring】深入理解控制反转-IOC

news/2024/10/3 19:44:35/

目录

一、Spring_ioc_01项目

1. jdbc.properties

2. 高耦合

3. 中耦合

4. 低耦合

二、Spring_ioc_02项目

1. xxx.properties(键值对存储)

2. 解耦的方式创建对象

3. 调用getBean()方法并传入xxx.properties对应键获取其相应的值

三、Spring_ioc_03项目

spring%E4%B8%A4%E5%A4%A7%E6%80%9D%E6%83%B3%EF%BC%9A-toc" style="margin-left:120px;">1. spring两大思想:

1.1 IOC控制反转 、DI依赖注入

1.2 AOP面向切面编程

spring%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA-toc" style="margin-left:120px;">2. spring环境搭建

4. SpringIOC的理解

四、Spring_ioc04

1. SpringDI(依赖注入)

2. DI实现方式

2.1 set注入  

2.2 构造注入

2.3 注解注入

3. DI数据类型

4. DI使用步骤

五、Spring_ioc_05_bean

1. SpringIOC容器对Bean管理

2. bean作用域

3. bean生命周期

六、Spring_ioc_06_ann

spring%E7%9A%84%E9%85%8D%E7%BD%AE-toc" style="margin-left:120px;">1. spring的配置

spring2.5%E5%90%8E%3Dxml%2Bannotation-toc" style="margin-left:120px;">2. spring2.5后=xml+annotation

3. 注解

3.1 注入类

3.2 注入基本数据

3.3 其他注解

javaConfig-toc" style="margin-left:80px;">七、Spring_ioc_07_javaConfig

1. 3.0配置类语法:

八、模块Module:项目同级显示


        在软件开发中,控制层(Controller)、业务逻辑层(Service)、数据访问层(DAO)三层架构是一种广泛采用的设计模式。

        

一、Spring_ioc_01项目

1. jdbc.properties

2. 高耦合

3. 中耦合

4. 低耦合

二、Spring_ioc_02项目

1. xxx.properties(键值对存储)

2. 解耦的方式创建对象

new Properties()创建了一个Properties对象。Properties类继承自Hashtable<Object,Object>,用于处理键值对形式的属性文件(如.properties文件),其中键和值都是字符串类型。

Test01.class.getClassLoader()获取了当前类(Test01)的类加载器,然后调用getResourceAsStream方法加载位于类路径(classpath)下的xxx.properties文件。之后,通过properties.load(inputStream)将文件内容加载到Properties对象中。

properties.getProperty(key)方法,根据传入的key(字符串)从Properties对象中获取对应的值(即类名)。

newInstance()方法创建这个类的一个新实例(new 对象)。

3. 调用getBean()方法并传入xxx.properties对应键获取其相应的值

三、Spring_ioc_03项目

spring%E4%B8%A4%E5%A4%A7%E6%80%9D%E6%83%B3%EF%BC%9A" style="margin-left:0px;text-align:justify;">1. spring两大思想
1.1 IOC控制反转 、DI依赖注入

                1)IOC容器:

                        springIOC搭建spring容器管理程序中的各个组件(class类)让程序可以实现高内聚,低耦合的编程。

                2)SpringIOC(控制反转):解耦

                3)硬编码实现解耦:

                        (1)不要直接new对象,通过反射创建

                        (2)将需要创建的对象独立保存在资源文件中,动态加载

1.2 AOP面向切面编程
spring%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA" style="margin-left:0px;text-align:justify;">2. spring环境搭建

        2.1.坐标 pom.xml

        2.2.配置文件 beans.xml

​​​​​​​

3. springIOC

        3.1.找到需要以解耦方式获取实例对象的类

        3.2.将需要spring管理的类注入spring容器(beans.xml

                <bean id="唯一标识" class="类"></bean>

                3.3.向spring容器中索取java实例(解耦)

                (1)相对路径加载spring核心配置文件,获取spring容器对象

                (2)获取对象

4. SpringIOC的理解

        ● IOC名词解释,作用是解耦,使用IOC容器管理项目组件之间的耦合关系

        ● IOC( Inversion of Control,中文释义:控制反转  ) 是Spring框架的核心思想之一,主要用于解耦。IOC是指将创建对象的控制权转移给Spring框架进行管理。由Spring框架根据配置文件或注解等方式,创建bean对象并管理各个bean对象之间的依赖关系。使对象之间形成松散耦合的关系,实现解耦;

        ○ 控制 :指的是对象创建(实例化、管理)的权力

        ○ 反转 :控制权交给外部环境(Spring框架、IoC容器)

        关键字

                BeanFactory(父)

                ApplicationContext(子)

                ClassPathXmlApplicationContext:通过加载主配置文件的相对路径,获取spring容器

                FileSystemXmlApplicationContext:通过加载主配置文件的绝对路径,获取spring容器

                AnnotationConfigApplicationContext:加载配置类,获取spring容器

四、Spring_ioc04

1. SpringDI(依赖注入)

        作用:将springioc容器所创建的各个组件,使用DI的语法进行关联,耦合(胶水)

2. DI实现方式
2.1 set注入  

                语法:<property name value ref(引用)>

  JavaBean(注入对象)

     (1)set方法

     (2)set配置(applicationContext.xml)

   基本数据类型与String:

     (1)set方法

     (2)set设置

  复杂数据类型

     (1)set方法

     (2)set设置

2.2 构造注入

        语法:<constructor-arg name type index value ref>

 基本类型与String

     (1)构造方法   (无参构造方法不能忘

     (2)构造配置

JavaBean

     (1)构造方法

     (2)构造配置

2.3 注解注入

3. DI数据类型

(1)基本类型与String

(2)JavaBean

(3)复杂类型,list set array map properties(构造注入不支持

4. DI使用步骤

    1.思考,什么方式,什么数据类型

    2.给属性提供set(构造)方法

    3.编写配置文件

五、Spring_ioc_05_bean

1. SpringIOC容器对Bean管理

  1)bean实例化

(1)通过构造方法(默认)

(2)通过工厂方法

(3)通过静态工厂方法

2. bean作用域

含义:spring对于创建javaBean实例的方式

语法:<bean scope="属性值"></bean>

属性值:

     singleton=====>单例(默认)

     prototype=====>多例

     request=======>一个请求创建一个

     session=======>一个会话创建一个

3. bean生命周期

  1)实例化 ===> 构造方法、工厂

  2)属性赋值(DI) ===> set、构造

  3)初始化

       (1)接口   InitializingBean ===> afterPropertiesSet()方法

       (2)属性   init-method=""

  4)操作使用

  5)销毁了

       容器关闭执行销毁(classPathXmlApplicationContext.close())

       (1)接口   DisposableBean ===> destroy()方法

       (2)属性   destory-method=""

六、Spring_ioc_06_ann

spring%E7%9A%84%E9%85%8D%E7%BD%AE" style="margin-left:0px;text-align:justify;">1. spring的配置
  1. spring2.5前==xml
  2. spring2.5后==xml+annotation
  3. spring3.0后==annotation+JavaConfig配置类

spring2.5%E5%90%8E%3Dxml%2Bannotation" style="margin-left:0px;text-align:justify;">2. spring2.5后=xml+annotation

目的优化一下代码:

    <bean id="" class="" init-method="" destroy-method="" scope="" autowire="">

           <property></property>

           <constructor-arg></constructor-arg>

      </bean>

3. 注解
3.1 注入类

     (1)替换:<bean id="" class=""></bean>

     (2)位置:类

     (3)语法: @Component

           eg:Class User{}

               <bean id="user" class="com.apesource.包.User"></bean>

||等价于||

                @Component

                Class User{}

           @Component(value="注入容器中的id,如果省略id为类名且首字母小写,value属性名称可以省略")

     (4)配置:

         <context:component-scan base-package=""></context:component-scan>功能一致

     (5)含义:扫描所有被@Component注解所修饰的类,注入容器

     (6)@Repository=====>注入数据访问层

          @Service========>注入业务层

          @Controller=====>注入控制层

          以上三个注解与@Component功能语法一致

3.2 注入基本数据

     (1)@Value

           含义:注入基本数据

           替换:<property></property>

           修饰:成员变量或对应的set方法

           语法:@Value("数据内容")

           @Value("${动态获取}")===>el表达式

             <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>

     (2)@Autowired

          语法:

                @Autowired(required = "true-默认、false、是否必须进行装配")

                @Autowired(required = true)===>找不到对应类型会报错

                @Autowired(required = false)===>找不到不进行装配,且不会报错

          修饰:成员变量或对应的构造方法

          含义:按照通过set方法进行“类型装配”,set方法可以省略

          注意

                默认是按照类型装配且同set方法。

            若容器中有一个类型可以与之匹配则装配成功,若没有一个类型可以匹配则报错。(NoSuchBeanDefinitionException)

               若容器中有多个类型可以与之匹配,则自动切换为按照名称装配,若名称没有对应,则报错(NoUniqueBeanDefinitionException)

3.3 其他注解

     (1)@Primary

          含义:首选项,当类型冲突的情况下,此注解修饰的类被列为首选(备胎扶正)

          修饰:类

          注意:不能单独使用,必须与@Component....联合使用

      (2)@Qualifier(value="名称(类第一个字母小写)")

          含义:按照名称装配

          修饰:成员变量

          注意:不能单独使用,必须与@Autowired联合使用

      (3)@Resource(name="名称(类第一个字母小写)")

          含义:按照名称装配

          修饰:成员变量

          注意:单独使用

      (4)@Scope

          含义:配置类的作用域

          修饰:类

          注意:不能单独使用,必须与@Component....联合使用

                @Scope("prototype")

                @Scope("singleton")

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

                @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)

      (5)@PostConstruct:初始化,修饰方法

          替换:init-method

      (6)@PreDestroy:销毁,修饰方法

          替换:destory-method

javaConfig" style="margin-left:0px;text-align:justify;">七、Spring_ioc_07_javaConfig

1. 3.0配置类语法:

  spring中的新注解

    (1)@Configuration

      作用:指定当前类是一个配置类

      细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。

    (2)@ComponentScan

      作用:用于通过注解指定spring在创建容器时要扫描的包

      属性:value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。

      替换:

    (3)@PropertySource

        作用:用于指定properties文件的位置

        属性:value:指定文件的名称和路径。

        配合@Value使用

        替换:

     (4)@Bean

         作用:用于把当前方法的返回值作为bean对象存入spring的容器中

         属性:name:用于指定bean的id。当不写时,默认值是当前方法的名称

    (5)@Import

         作用:用于导入其他的配置类

         属性:value:用于指定其他配置类的字节码。

         例子:@Import(SystemSpringConfig.class)

八、模块Module:项目同级显示

parent:父项目

Grouid:与项目中java路径一致


http://www.ppmy.cn/news/1533600.html

相关文章

taro RN 左右滑动切换页面

引入 react-native-pager-view 组件 import React, { Component } from react import Taro from tarojs/taro import { View, PagerView, Button } from tarojs/components import PagerView from react-native-pager-view;export default class MyComponent extends Taro.C…

Linux下send函数和recv函数

1. 基本介绍 send 函数 send 函数用于向一个已连接的套接字发送数据。它的典型使用场景是在TCP通信中&#xff0c;客户端和服务器之间交换数据。 函数声明&#xff1a; ssize_t send(int sockfd, const void *buf, size_t len, int flags); 参数解释&#xff1a; sockfd&a…

【Java SE 题库】移除元素(暴力解法)--力扣

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 题目 2. 解法(快慢“指针”) 3. 源码 4. 小结 1. 题目 给你一个数组 nums 和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素。元素的顺…

网络协议一般分为几类?如何划分

网络协议是计算机网络中用于通信的规则和标准&#xff0c;确保不同设备之间能够有效地传输数据。网络协议可以根据不同的标准和功能进行分类&#xff0c;主要分为以下几类&#xff1a; 一、按功能划分 应用层协议 应用层协议负责特定应用程序之间的通信&#xff0c;它们定义了…

(22)activeMQ部署

activeMQ集群部署: 前言:从ActiveMQ 5.9开始,ActiveMQ的集群实现方式取消了传统的Master-Slave方式, 增加了基于ZooKeeper + LevelDB的Master-Slave实现方式,其他两种方式目录共享和数据库共享依然存在。 25.213.39.177 25.213.39.97 25.213.39.86 主机 集群端…

通过python-api使用openai的gpt

目前&#xff0c;OpenAI 提供的 GPT 模型可以通过其提供的 API 进行访问。以下是如何通过 Python 使用 OpenAI GPT API 的详细步骤&#xff1a; 1. 安装 OpenAI Python 库 首先&#xff0c;你需要安装 OpenAI 的 Python 库。可以通过 pip 安装&#xff1a; pip install open…

开发微信小程序 案例01-本地生活首页页面

1---home.wxml 区域 &#xff08;页面整体的标签&#xff09; <!-- 轮播图区域 --> <swiper indicator-dots circular autoplay> <swiper-item wx:for"{{SwiperArr}}" wx:key"id"> <image src"{{item.image}}"></ima…

HTML【知识改变命运】03font 字体标签

题目&#xff1a;在页面上显示"北京"两个字&#xff0c;字体为微软雅黑&#xff0c;颜色为红色&#xff0c;大小为40xp&#xff1b; font标签可以修饰字体的大小&#xff0c;颜色&#xff0c;和字体 属性&#xff1a;color颜色&#xff0c;face字体&#xff0c;size大…