• Spring IOC核心功能快速入门


    前言

    IOC:控制反转,是一种理论,概念,思想。把对象的创建,赋值,管理工作交给代码之外的容器实现,也就是对象的创建是由其他的外部资源完成。

    控制反转

    • 控制:创建对象,对象的属性赋值,对象之间的关系管理。

    • 反转:把原来的开发人员管理,创建对象的权限转移给代码之外的容器实现。由容器代替开发人员管理对象,创建对象。

    • 正转:由开发人员在代码中实现,使用new构造方法创建对象,开发人员主动管理对象。

    • 容器:一个服务器软件,一个框架(spring)

    Spring 容器是 Spring 框架的核心。容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁。Spring 容器使用依赖注入(DI)来管理组成一个应用程序的组件,这些对象被称为 Spring Beans。

    通过阅读配置元数据提供的指令,容器知道对哪些对象进行实例化,配置和组装。配置元数据可以通过 XML,Java 注释或 Java 代码来表示。 Spring IoC 容器利用 Java 的 POJO 类和配置元数据来生成完全配置和可执行的系统或应用程序。

    IOC 容器具有依赖注入功能的容器,它可以创建对象,IOC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实例,控制权由程序员控制,而"控制反转"是指new实例工作不由程序员来做而是交给Spring容器来做。在Spring中BeanFactory是IOC容器的实际代表者。

    • Java中创建对象的方式:

    • 构造方法

    • 反射

    • 克隆

    • 序列化

    • ioc创建对象

    • 动态代理

    使用IoC的目的:减少对代码的改动,也能实现不同功能。实现解耦合。

    IoC容器:

    IOC的技术实现 :

    • DI 是ioc的技术实现。

    • DI(Dependency Injection):依赖注入, 只需要在程序中提供要使用的对象名称就可以, 至于对象如何在容器中创建,赋值,查找都由容器内部实现。

    • spring是使用的di实现了ioc的功能, spring底层创建对象,使用的是反射机制。

    • spring是一个容器,管理对象,给属性赋值, 底层是反射创建对象。

    • spring-conetxt 和 spring-webmvc 是spring中的两个模块

    • spring-context:是ioc功能的,创建对象的。

    • spring-webmvc做web开发使用的, 是servlet的升级。

    • spring-webmvc中也会用到spring-context中创建对象的功能的。

    Spring的第一个程序:

    第一步:创建一个Maven工程

    导入Spring和junit依赖到pom.xml中:

    1. <!--junit单元测试依赖-->
    2. <dependency>
    3. <groupId>junit</groupId>
    4. <artifactId>junit</artifactId>
    5. <version>4.11</version>
    6. <scope>test</scope>
    7. </dependency>
    8. <!--Spring依赖-->
    9. <dependency>
    10. <groupId>org.springframework</groupId>
    11. <artifactId>spring-context</artifactId>
    12. <version>5.3.9</version>
    13. </dependency>

    第二步:创建一个接口

    创建一个接口类,在通常业务中,我们通常使用接口来声明方法,通过接口实现类来完成方法,业务逻辑的具体实现!

    1. package org.example;
    2. public interface SomeService {
    3. void doSome();
    4. }

    第三步:创建接口实现类

    1. 实现接口中声明的方法:
    2. package org.example.imp;
    3. import org.example.SomeService;
    4. public class SomeServiceImpl implements SomeService {
    5. //空参构造器:spring默认调用:
    6. public SomeServiceImpl() {
    7. System.out.println("spring调用了SomeServiceImpl的空参构造器!");
    8. }
    9. @Override
    10. public void doSome() {
    11. System.out.println("执行了SomeServiceImp的doSome方法!");
    12. }
    13. }

    第四步:在resource资源文件目录下创建application.xml文件

    1. 把创建好的实现类交给Spring容器进行管理:
    2. "1.0" encoding="UTF-8"?>
    3. <beans xmlns="http://www.springframework.org/schema/beans"
    4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans
    6. http://www.springframework.org/schema/beans/spring-beans.xsd">
    7. <bean id="someService" class="org.example.imp.SomeServiceImpl" />
    8. <bean id="someService1" class="org.example.imp.SomeServiceImpl" />
    9. <bean id="mydate" class="java.util.Date"/>
    10. beans>

    第五步:创建测试类

    1. package org.example;
    2. import org.junit.Test;
    3. import org.springframework.context.ApplicationContext;
    4. import org.springframework.context.support.ClassPathXmlApplicationContext;
    5. import java.util.Date;
    6. public class MyTest {
    7. /*
    8. spring默认创建对象的时间:在创建spring的容器时,会创建配置文件中所有的对象。
    9. spring创建对象:默认调用的是无参构造方法
    10. */
    11. @Test
    12. public void test01(){
    13. //使用spring容器创建对象:
    14. //1.指定spring配置文件名称
    15. String config = "application.xml";
    16. //2.创建表示spring容器的对象,ApplicationContext
    17. //ApplicationContext就是表示spring容器,通过容器对象获取对象
    18. ApplicationContext ac = new ClassPathXmlApplicationContext(config);
    19. //从容其中获取某个对象,调用对象方法
    20. //getBean("配置文件中bean的id值")
    21. SomeService service = (SomeService) ac.getBean("someService");
    22. //使用spring创建好的对象,调用方法:
    23. service.doSome();
    24. }
    25. /**
    26. * 获取spring容器中Java对象信息
    27. */
    28. @Test
    29. public void test02(){
    30. String config = "application.xml";
    31. ApplicationContext ac = new ClassPathXmlApplicationContext(config);
    32. //使用spring提供的方法,获取容器中定义的对象数量
    33. int num = ac.getBeanDefinitionCount();
    34. System.out.println("容器中所含对象数量:" + num);
    35. //容器中每个定义对象的名称
    36. String[] names = ac.getBeanDefinitionNames();
    37. //增强for循环:
    38. for (String name : names){
    39. System.out.println(name);
    40. }
    41. }
    42. /**
    43. * 获取一个非自定义类的对象
    44. */
    45. @Test
    46. public void test03(){
    47. String config = "application.xml";
    48. ApplicationContext ac = new ClassPathXmlApplicationContext(config);
    49. //使用getBean();获取对象
    50. Date md = (Date) ac.getBean("mydate");
    51. System.out.println("系统时间:" + md);
    52. }
    53. }

    基于XML文件的DI依赖注入:

    Spring框架的核心功能之一就是通过依赖注入的方式来管理Bean之间的依赖关系。在spring的XML配置文件中,给java对象的属性赋值。DI注入:创建对象,给属性赋值。

    setter设值注入:

    当容器调用一个无参的构造函数或一个无参的静态 factory 方法来初始化你的 bean 后,通过容器在你的 bean 上调用设值函数,基于设值函数的 DI 就完成了。

    第一步:创建一个实体类

    1. package org.example.ba01;
    2. public class Student {
    3. String name;
    4. int age;
    5. public Student() {
    6. }
    7. public Student(String name, int age) {
    8. this.name = name;
    9. this.age = age;
    10. }
    11. @Override
    12. public String toString() {
    13. return "Student{" +
    14. "name='" + name + '\'' +
    15. ", age=" + age +
    16. '}';
    17. }
    18. public void setName(String name) {
    19. this.name = name;
    20. }
    21. public void setAge(int age) {
    22. this.age = age;
    23. }
    24. }

    第二步:在resource目录下编写application.xml文件

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. <!--声明student对象-->
    6. <!--
    7. 注入:赋值
    8. di:给属性赋值
    9. 简单类型:spring规定在Java的基本数据类型和String都是简单类型。
    10. 1.set注入(设置注入):spring调用类的set方法,你可以在set方法中完成属性赋值
    11. 1)简单类型注入
    12. <bean id="XXX" class="YYY">
    13. <property name="属性名字" value="此属性的值" />
    14. 一个property只能给一个属性赋值
    15. <property ... >
    16. </bean>
    17. 2) 引用类型的注入:spring调用类的set方法
    18. <bean id="XXX" class="YYY">
    19. <property name="属性名称" ref="bean的id(对象名称)"/>
    20. </bean>
    21. -->
    22. <bean id="mystudent" class="org.example.ba01.Student">
    23. <property name="name" value="TOM"/>
    24. <property name="age" va
  • 相关阅读:
    数据包的奇妙旅程:揭秘网络传输的7个关键步骤
    完全背包问题 —— 贪心优化 DP 范围
    leetcode/含有所有字符的最短字符串
    【开源】渔具租赁系统 JAVA+Vue.js+SpringBoot+MySQL
    lesson2(补充)关于const成员函数
    Linux下安装Foldseek并从蛋白质的PDB结构中获取 3Di Token 和 3Di Embedding
    maven-metadata.xml
    Unity Meta Quest 一体机开发(六):HandGrabInteractor 和 HandGrabInteractable 知识点
    全面解析缓存应用经典问题
    创建Django项目_first_Django
  • 原文地址:https://blog.csdn.net/Java_zhujia/article/details/127862338