IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 第二章IOC控制反转(使用spring容器) -> 正文阅读

[Java知识库]第二章IOC控制反转(使用spring容器)

??????? 控制反转( IoC Inversion of Control ),是一个概念,是一种思想。指将传统上由程序代
码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对 象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的创建,属性赋值, 依赖的管理。
??????? IoC 是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式是依赖 注入。应用广泛。
??????? 依赖: classA 类中含有 classB 的实例,在 classA 中调用 classB 的方法完成功能,即 classA classB 有依赖。
?????? Ioc 的实现:
? 依赖注入: DI(Dependency Injection) ,程序代码不做定位查询,这些工作由容器自行完成。
?????? 依赖注入 DI 是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建 被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。
?????? Spring 的依赖注入对调用者与被调用者几乎没有任何要求,完全支持对象之间依赖关系
的管理。
?????? Spring 框架使用依赖注入( DI )实现 IoC
?????? Spring 容器是一个超级大工厂,负责创建、管理所有的 Java 对象,这些 Java 对象被称 Bean Spring 容器管理着容器中 Bean 之间的依赖关系, Spring 使用“依赖注入”的方式 来管理 Bean 之间的依赖关系。使用 IoC 实现对象之间的解耦和。
2.1 开发工具准备
开发工具: idea2017 以上
依赖管理: maven3 以上
jdk:1.8 以上
需要设置 maven 本机仓库:

?

2.2 Spring 的第一个程序

项目结构展示

?

2.2.1 创建 maven 项目

?

2.2.2 引入 maven 依赖 pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
<!--本项目的坐标-->
  <groupId>com.it</groupId>
  <artifactId>ch1-Hello-Spring</artifactId>
  <version>1.0-SNAPSHOT</version>
<!--生成站点时用到的东西可以不用,也可以删掉-->
  <name>ch1-Hello-Spring</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>
<!--指定jdk的版本-->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
<!-- 单元测试的依赖  -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
<!--Spring依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
  </dependencies>
<!--自动生成的生命周期的插件-->
  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

?2.2.3 定义接口与实体类

1.接口

package com.it.service;

public interface SomeService {
    void doSome();
}

2.实体类

package com.it.service.Impl;

import com.it.service.SomeService;

public class SomeServiceImpl implements SomeService {
    public SomeServiceImpl() {
        System.out.println("SomeServiceImpl的无参构造方法");
    }

    @Override
    public void doSome() {
            System.out.println("执行了SomeServiceImpl的doSome()方法");
    }
}
2.2.4创建 Spring 配置文件
?????? 在 src/main/resources/ 目录现创建一个 xml 文件,文件名可以随意,但 Spring 建议的名 称为 applicationContext.xml
????? spring 配置中需要加入约束文件才能正常使用,约束文件是 xsd 扩展名。
<?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,告诉spring要创建某个类的对象
id:对象的自定义名称,唯一值,spring通过这个名称找到对象
class:类的全限定名称,不能是接口,因为spring是反射机制创建的对象,必须使用类。
类似于完成SomeService someService=new SomeService();
spring是把创建好的对象放在map中,spring框架有一个map存放对象的。
springMap.put("id的值",对象);
springMap.put("someService",new SomeService());

一个bean标签声明一个java的对象
-->
    <bean id="someService" class="com.it.service.Impl.SomeServiceImpl"/>
    <bean id="someService1" class="com.it.service.Impl.SomeServiceImpl"/>

<!-- spring创建一个非自定义类的对象-->
    <bean id="myDate" class="java.util.Date"/>

</beans>
<!--
spring配置文件
1.beans:是根标签。
spring是把java对象转换为bean.
-->
<bean /> :用于定义一个实例对象。一个实例对应一个 bean 元素。
id :该属性是 Bean 实例的唯一标识,程序通过 id 属性访问 Bean Bean Bean 间的依
赖关系也是通过 id 属性关联的。
class :指定该 Bean 所属的类,注意这里只能是类,不能是接口。
2.2.5定义测试类
package com.it;

import static org.junit.Assert.assertTrue;

import com.it.service.Impl.SomeServiceImpl;
import com.it.service.SomeService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.Date;

/**
 * Unit test for simple App.
 */
public class AppTest 
{


@Test
    public void test1(){
    SomeService service = new SomeServiceImpl();
    service.doSome();
}


//在创建spring容器时,会创建配置文件中所有的对象。
@Test
    public void test2(){
    //指定spring文件的的名称
     String config="beans.xml";
     //创建表示的spring容器对象
    ApplicationContext applicationContext=new ClassPathXmlApplicationContext(config);
    //从容器中获取某个对象
    SomeService someService = (SomeService) applicationContext.getBean("someService");
    //使用spring创建好的对象
    someService.doSome();
}



@Test
    public void test3(){
    String config="beans.xml";
    ApplicationContext applicationContext=new ClassPathXmlApplicationContext(config);
    //获取容器中定义对象的数量
    int nums = applicationContext.getBeanDefinitionCount();
    System.out.println("在容器中定义的对象的数量:"+nums);
//    容器中每个定义对象的名字
    String[] names = applicationContext.getBeanDefinitionNames();
    for (String stu:names){
        System.out.println(stu);
    }
}



@Test
    public  void test4(){
    String config="beans.xml";
    ApplicationContext applicationContext=new ClassPathXmlApplicationContext(config);
    Date myDate = (Date) applicationContext.getBean("myDate");
    System.out.println("时间:"+myDate);
}



}
1.test1()结果,没有使用spring容器

?2.test2()结果,使用spring容器。在创建spring容器时,会创建配置文件中所有的对象,创建这些对象时会再次调用无参构造方法。

3.test3()结果,使用spring容器。在创建spring容器时,会创建配置文件中所有的对象,创建这些对象时会再次调用无参构造方法。

?4.使用 spring 创建非自定义类对象 的测试结果

?2.2.7 容器接口和实现类

?????? ApplicationContext 用于加载 Spring 的配置文件,在程序中充当“容器”的角色。其实现
类有两个。

A、配置文件在类路径下

?????? 若 Spring 配置文件存放在项目的类路径下,则使用 ClassPathXmlApplicationContext 实现
类进行加载。

BApplicationContext 容器中对象的装配时机 ?

??????? ApplicationContext 容器,会在容器对象初始化时,将其中的所有对象一次性全部装配好。
以后代码中若要使用到这些对象,只需从内存中直接获取即可。执行效率较高。但占用内存。
C 、 使用 spring 容器创建的 java 对象

?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-08 18:52:54  更:2022-06-08 18:54:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 11:29:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码