新建项目框架详细过程(idea2021.3版本) IoC实例 DI

news2024/10/6 1:03:24

目录

 使用Java Enterprise 一步到位

IOC、IOC容器、Bean、DI

1.==IOC(Inversion of Control)控制反转==

(1)什么是控制反转呢?

(2)Spring和IOC之间的关系是什么呢?

(3)IOC容器的作用以及内部存放的是什么?

(4)当IOC容器中创建好service和dao对象后,程序能正确执行么?

2.==DI(Dependency Injection)依赖注入==​编辑

(1)什么是依赖注入呢?

(2)IOC容器中哪些bean之间要建立依赖关系呢?

3. 核心概念小结

(1)什么IOC/DI思想?

(2)什么是IOC容器?

(3)什么是Bean?

4.分析

(1)Spring是使用容器来管理bean对象的,那么管什么?

(2)如何将被管理的对象告知IOC容器?

(3)被管理的对象交给IOC容器,要想从容器中获取对象,就先得思考如何获取到IOC容器?

(4)IOC容器得到后,如何从容器中获取bean?

(5)使用Spring导入哪些坐标?

3.2 入门代码实现

步骤1:创建Maven项目

步骤2:添加Spring的依赖jar包

步骤3:添加案例中需要的类

步骤4:添加spring配置文件

步骤5:在配置文件中完成bean的配置

步骤6:获取IOC容器

步骤7:从容器中获取对象进行方法调用

步骤8:运行程序

DI入门案例

思路分析

代码实现

步骤1: 去除代码中的new

步骤2:为属性提供setter方法

步骤3:修改配置完成注入

​编辑步骤4:运行程序


1.新建项目

文件→新建→项目→项目名称(自定义)

 2.在新建的项目中添加maven,添加Web支持

选中项目→新建→模块

 3.配置Tomcat和导包

选中模块→运行→编辑配置

 点击“+”→Tamcat服务器→本地

 Tomcat的配置

 发现部署时点击没有Artifacts,

 实际的效果↓

 没有就给他加一个

文件→项目结构

每次创建项目时, IDEA 要使用插件进行创建,这些插件当你创建新的项目时,它每次都会去中央仓库下载,这样 使得创建比较慢。应该创建时,让它找本地仓库中的插件进行创建项目。

在Runner设置

-DarchetypeCatalog=internal 

 后来新建了一个项目test2,加上Tomcat

以上方法太麻烦了,↓

 使用Java Enterprise 一步到位

IOC、IOC容器、Bean、DI

1.==IOC(Inversion of Control)控制反转==

(1)什么是控制反转呢?

  • 使用对象时,由主动new产生对象转换为由==外部==提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。

    • 业务层要用数据层的类对象,以前是自己new

    • 现在自己不new了,交给别人[外部]来创建对象

    • 别人[外部]就反转控制了数据层对象的创建权

    • 这种思想就是控制反转

    • 别人[外部]指定是什么呢?继续往下学

(2)Spring和IOC之间的关系是什么呢?

  • Spring技术对IOC思想进行了实现

  • Spring提供了一个容器,称为==IOC容器==,用来充当IOC思想中的"外部"

  • IOC思想中的别人[外部]指的就是Spring的IOC容器

(3)IOC容器的作用以及内部存放的是什么?

  • IOC容器负责对象的创建、初始化等一系列工作,其中包含了数据层和业务层的类对象

  • 被创建或被管理的对象在IOC容器中统称为==Bean==

  • IOC容器中放的就是一个个的Bean对象

(4)当IOC容器中创建好service和dao对象后,程序能正确执行么?

  • 不行,因为service运行需要依赖dao对象

  • IOC容器中虽然有service和dao对象

  • 但是service对象和dao对象没有任何关系

  • 需要把dao对象交给service,也就是说要绑定service和dao对象之间的关系

像这种在容器中建立对象与对象之间的绑定关系就要用到DI:

2.==DI(Dependency Injection)依赖注入==

(1)什么是依赖注入呢?

  • 在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入

    • 业务层要用数据层的类对象,以前是自己new

    • 现在自己不new了,靠别人[外部其实指的就是IOC容器]来给注入进来

    • 这种思想就是依赖注入

(2)IOC容器中哪些bean之间要建立依赖关系呢?

  • 这个需要程序员根据业务需求提前建立好关系,如业务层需要依赖数据层,service就要和dao建立依赖关系

介绍完Spring的IOC和DI的概念后,我们会发现这两个概念的最终目标就是:==充分解耦==,具体实现靠:

  • 使用IOC容器管理bean(IOC)

  • 在IOC容器内将有依赖关系的bean进行关系绑定(DI)

  • 最终结果为:使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean已经绑定了所有的依赖关系.

3. 核心概念小结

这节比较重要,重点要理解什么是IOC/DI思想什么是IOC容器什么是Bean

(1)什么IOC/DI思想?

  • IOC:控制反转,控制反转的是对象的创建权

  • DI:依赖注入,绑定对象与对象之间的依赖关系

(2)什么是IOC容器?

Spring创建了一个容器用来存放所创建的对象,这个容器就叫IOC容器

(3)什么是Bean?

容器中所存放的一个个对象就叫Bean或Bean对象

4.分析

(1)Spring是使用容器来管理bean对象的,那么管什么?

  • 主要管理项目中所使用到的类对象,比如(Service和Dao)

(2)如何将被管理的对象告知IOC容器?

  • 使用配置文件

(3)被管理的对象交给IOC容器,要想从容器中获取对象,就先得思考如何获取到IOC容器?

  • Spring框架提供相应的接口

(4)IOC容器得到后,如何从容器中获取bean?

  • 调用Spring框架提供对应接口中的方法

(5)使用Spring导入哪些坐标?

  • 用别人的东西,就需要在pom.xml添加对应的依赖

3.2 入门代码实现

需求分析:

将BookServiceImpl和BookDaoImpl交给Spring管理,并从容器中获取对应的bean对象进行方法调用。

1.创建Maven的java项目

2.pom.xml添加Spring的依赖jar包

3.创建BookService,BookServiceImpl,BookDao和BookDaoImpl四个类

4.resources下添加spring配置文件,并完成bean的配置

5.使用Spring提供的接口完成IOC容器的创建

6.从容器中获取对象进行方法调用

步骤1:创建Maven项目

步骤2:添加Spring的依赖jar包

pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

之前已有junit(Java语言的单元测试框架)4.11版本,会与4.12版本冲突,注释掉即可(针对test2)

test3在pom.xml 中添加依赖包

 <!--  添加Spring的依赖jar包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

步骤3:添加案例中需要的类

创建BookDao,BookDaoImpl,BookService和BookServiceImpl四个类

public interface BookDao {
    public void save();
}

public class BookDaoImpl implements BookDao {
    @Override
    public void save() {
        System.out.println("book dao save ...");
    }
}

public interface BookService {
    public void save();
}

public class BookServiceImpl implements BookService {
    private BookDao bookDao = new BookDaoImpl();
    @Override
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}

步骤4:添加spring配置文件

resources下添加spring配置文件applicationContext.xml,并完成bean的配置

步骤5:在配置文件中完成bean的配置

<?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标签标示配置bean
    	id属性标示给bean起名字
    	class属性表示给bean定义类型-->
    <bean id="bookDao" class="com.example.test3.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.example.test3.service.impl.BookServiceImpl"/>


</beans>

==注意事项:bean定义时id属性在同一个上下文中(配置文件)不能重复==

步骤6:获取IOC容器

使用Spring提供的接口完成IOC容器的创建,创建App类,编写main方法

package com.example.test3;

import com.example.test3.dao.BookDao;
import com.example.test3.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.applet.AppletContext;

/**
 * @author 乱码酱
 * @date :2023-06-15 10:22
 * @program: test3
 * @create:
 */
public class App {
    public static void main(String[] args) {
//        获取IoC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

    }
}

步骤7:从容器中获取对象进行方法调用

package com.example.test3;

import com.example.test3.dao.BookDao;
import com.example.test3.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.applet.AppletContext;

/**
 * @author 乱码酱
 * @date :2023-06-15 10:22
 * @program: test3
 * @create:
 */
public class App {
    public static void main(String[] args) {
//        获取IoC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//        获取bean
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();

        System.out.println("===============");

        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();
    }
}

步骤8:运行程序

测试结果为:

Spring的IOC入门案例已经完成,但是在BookServiceImpl的类中依然存在BookDaoImpl对象的new操作,它们之间的耦合度还是比较高,这块该如何解决,就需要用到下面的DI:依赖注入

DI入门案例

对于DI的入门案例,我们依然先分析思路然后再代码实现

思路分析

(1)要想实现依赖注入,必须要基于IOC管理Bean

  • DI的入门案例要依赖于前面IOC的入门案例

(2)Service中使用new形式创建的Dao对象是否保留?

  • 需要删除掉,最终要使用IOC容器中的bean对象

(3)Service中需要的Dao对象如何进入到Service中?

  • 在Service中提供方法,让Spring的IOC容器可以通过该方法传入bean对象

(4)Service与Dao间的关系如何描述?

  • 使用配置文件

代码实现

需求:基于IOC入门案例,在BookServiceImpl类中删除new对象的方式,使用Spring的DI完成Dao层的注入

1.删除业务层中使用new的方式创建的dao对象

2.在业务层提供BookDao的setter方法

3.在配置文件中添加依赖注入的配置

4.运行程序调用方法

步骤1: 去除代码中的new

在BookServiceImpl类中,删除业务层中使用new的方式创建的dao对象

package com.example.test3.service.impl;

import com.example.test3.dao.BookDao;
import com.example.test3.dao.impl.BookDaoImpl;
import com.example.test3.service.BookService;
import org.springframework.stereotype.Service;

/**
 * @author 乱码酱
 * @date :2023-06-14 15:59
 * @program: test2
 * @create:
 */
//@Service
public class BookServiceImpl implements BookService {
    //删除业务层中使用new的方式创建的dao对象
    private BookDao bookDao;
    @Override
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}

步骤2:为属性提供setter方法

在BookServiceImpl类中,为BookDao提供setter方法

package com.example.test3.service.impl;

import com.example.test3.dao.BookDao;
import com.example.test3.dao.impl.BookDaoImpl;
import com.example.test3.service.BookService;
import org.springframework.stereotype.Service;

/**
 * @author 乱码酱
 * @date :2023-06-14 15:59
 * @program: test2
 * @create:
 */
//@Service
public class BookServiceImpl implements BookService {
    //删除业务层中使用new的方式创建的dao对象
    private BookDao bookDao;
    @Override
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
//    提供对应的set方法
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

}

步骤3:修改配置完成注入

在配置文件中添加依赖注入的配置

<?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标签标示配置bean
    	id属性标示给bean起名字
    	class属性表示给bean定义类型-->
    <bean id="bookDao" class="com.example.test3.dao.impl.BookDaoImpl"/>
    <!--配置server与dao的关系-->
    <!--property标签表示配置当前bean的属性
    name属性表示配置哪一个具体的属性
    ref属性表示参照哪一个bean-->
    <bean id="bookService" class="com.example.test3.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
    </bean>


</beans>

==注意:配置中的两个bookDao的含义是不一样的==

  • name="bookDao"中bookDao的作用是让Spring的IOC容器在获取到名称后,将首字母大写,前面加set找对应的setBookDao()方法进行对象注入

  • ref="bookDao"中bookDao的作用是让Spring能在IOC容器中找到id为bookDao的Bean对象给bookService进行注入

  • 综上所述,对应关系如下:

步骤4:运行程序

 运行,测试结果为:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/649090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【半监督图像分割 2023 CVPR】UniMatch

【半监督图像分割 2023 CVPR】UniMatch 论文题目&#xff1a;Revisiting Weak-to-Strong Consistency in Semi-Supervised Semantic Segmentation 中文题目&#xff1a;重新审视半监督语义分割中的强弱一致性 论文链接&#xff1a;https://arxiv.org/abs/2208.09910 论文代码&a…

ES6 JavaSript

爬虫组件分析 目录概述需求&#xff1a; 设计思路实现思路分析1.最常用的ES6特性2.let, const3.class, extends, super4.arrow function5.template string 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&a…

MTK平台的SWT异常的简单总结(3)——常见SWT/ANR类型

&#xff08;1&#xff09;如何查看db文件Log &#xff08;2&#xff09;如何确认线程关系 &#xff08;3&#xff09;常见类型 &#xff08;A&#xff09;等锁 线程状态为"Blocked"&#xff0c;通过关键字"held by"进一步确认哪个线程拿住了锁&#xff…

一.《传奇M》装备栏遍历的突破口

寻找突破口 1.首先根据大多数游戏而言,装备栏中一般记录的是装备的对象或者装备ID,那么当我们穿装备或者脱装备肯定会有相应的值在改变 2.我们就从这里入手,当穿或脱装备的时候,使用CE搜索0然后通过改变或者未改变来筛选结果 3.接下来我们操作试一试这个思路可不可以 4.点击首…

Vue中如何进行图片识别与物体检测

Vue中如何进行图片识别与物体检测 随着人工智能技术的发展&#xff0c;图像识别和物体检测已经成为了很多应用场景的必备功能。在Vue中如何使用百度AI或腾讯AI等云服务实现图片识别和物体检测呢&#xff1f;本文将为您介绍一些基本概念和示例代码&#xff0c;帮助您快速入门。…

强化学习PPO:Proximal Policy Optimization Algorithms解读

PPO算法是一类Policy Gradient强化学习方法&#xff0c;经典的Policy Gradient通过一个参数化决策模型来根据状态确定动作&#xff0c;其参数更新是通过下式进行的&#xff1a; 用于衡量决策模型的优劣目标&#xff0c;决策模型的优化目标为寻找最优决策&#xff0c;使得该决策…

电力辅助服务

电力辅助服务 1、电力辅助服务是什么2、电力辅助服务发展历程3、《电力辅助管理办法》主要修订内容4、电力辅助服务品种5、电力辅助服务市场规模6、国外电力辅助服务市场 1、电力辅助服务是什么 《电力辅助服务管理办法》中定义电力辅助服务是由火电、水电、核电、风电、光伏发…

Elastic 推出 Elastic AI 助手

作者&#xff1a;Mike Nichols Elastic 推出了 Elastic AI Assistant&#xff0c;这是一款由 ESRE 提供支持的开放式、生成式 AI 助手&#xff0c;旨在使网络安全民主化并支持各种技能水平的用户。 最近发布的 Elasticsearch Relevance Engine™ (ESRE™) 提供了用于创建高度相…

Spring Boot进阶(49):SpringBoot之集成WebSocket实现前后端通信 | 超级详细,建议收藏

1. 前言 在上一期&#xff0c;我对WebSocket进行了基础及理论知识普及学习&#xff0c;而这一期&#xff0c;我重点是要带着你们进行实战教学&#xff0c;手把手教学如何在springboot架构基础上集成WebSocket及实现前后端通讯功能。具有很好的学习价值&#xff0c;希望大家在学…

Python Selenium基本用法

Selenium 作为一款 Web 自动化测试框架&#xff0c;提供了诸多操作浏览器的方法&#xff0c;本节对其中的常用方法做详细介绍。 定位节点 Selenium 提供了 8 种定位单个节点的方法&#xff0c;如下所示&#xff1a; 定位节点方法 方法 说明 find_element_by_id() 通过 id 属性…

MacOS 高颜值的 数据库客户端工具 Tableplus 简单逆向分析

0x0 navicat 给公司发律师函了, 所以不能白嫖了.. 后来一直在找替代品, 但均感觉略有不足. dbeaver : java 开发的, 依赖 jdk , 而且BUG较多,也不流畅 mysqlworkbench : 官方出品, 功能强大. 但是用着不带劲 Sequel Ace : 开源免费, 但是只支持mysql,功能简单 最后试了下 Tab…

【手撕MyBatis源码】插件体系

文章目录 概述插件的使用插件代理机制自动分页插件拦截目标分页插件原理 概述 Mybatis作为一个应用广泛的优秀的ORM开源框架&#xff0c;这个框架具有强大的灵活性&#xff0c;在四大组件(Executor、StatementHandler、ParameterHandler、ResultSetHandler)处提供了简单易用的插…

​如何高效开发一个OA办公系统​?

如何才能高效开发一个OA办公系统&#xff1f;这篇教你使用零代码工具从0-1搭建一个OA办公系统&#xff0c;无需代码基础&#xff0c;只要你懂业务&#xff0c;只需3步即可搭建&#xff01; 先来看看效果—— 系统模板>> https://www.jiandaoyun.com/ 整个系统包含物资管…

动态规划经典题型:最小路径和、所有路径

题目1&#xff1a;最小路径和 给定一个包含非负整数的 *m* x *n* 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例&#xff1a; 输入&#xff1a;grid [[1,3,1],[1…

计算机网络之链路层和局域网

六.链路层和局域网 6.1 链路层概述 6.1.1 链路层可能提供的服务 成帧、链路接入、可靠交付、差错检测和纠正 6.1.2 链路层在何处实现 下图是一个典型的主机体系结构&#xff0c;链路层的主体部分是在网络适配器实现的&#xff0c;部分链路层是在运行于主机CPU上的软件实现的…

融云 CTO 岑裕受邀出席亚马逊云科技「出海日」论坛

&#xff08;点击购买《社交泛娱乐出海作战地图》&#xff09; 6 月 9 日&#xff0c;亚马逊云科技主办的“潮向新世界”出海日活动在深圳举行&#xff0c;融云作为领军出海服务企业受邀出席。关注【融云全球互联网通信云】了解更多 在现场展位&#xff0c;融云的一站式全生态…

如何查看电脑是否安装了mysql

可以通过以下几种方式查看电脑是否安装了MySQL: 1. 在系统服务中查找MySQL服务 打开控制面板 → 管理工具 → 服务,在服务列表中查找“MySQL”服务。如果存在MySQL服务并且启动类型为“自动”或“手动”,则表示已安装MySQL。 2. 查找MySQL安装目录 一般MySQL的安装目录为:- Wi…

【Nexus】Linux安装Nexus

目录 一、安装包获取方式1、Nexus3.49版本的安装包2、Nexus3.53版本的安装包 二、下载安装包的两种方式&#xff08;建议使用第一种安装方式&#xff09;1、直接把下载好的安装包上传到服务器中2、通过wget安装Nexus压缩包①、可以使用以下命令进行安装Nexus的最新版本②、也可…

信号与系统小论文

信号与系统小论文 信号调制与解调模拟乘法器AD734信号调制信号解调 DFT和FFT 的运算复杂度比较DFT运算FFT运算复杂度比较 小论文有两个部分组成&#xff0c;第一个是用电路仿真实现信号的调制与解调&#xff0c;第二个是通过python将DFT和FFT运算的次数可视化。 信号调制与解调…

Mysql替换字段中的指定文本

前言 最近有个需求&#xff0c;不同的环境的ip和端口都不一样&#xff0c;所以就要修改表里面字段的值 但是手动修改比较麻烦而且很慢&#xff0c;所以在网上搜了下相关的方法。经过手动实践确实可行&#xff0c;下面分享给大家 准备fake数据 为了方便演示&#xff0c;准备…