Spring的IOC和DI入门

1、相关概念

1.1、Spring来源

官网:Spring | Home

Spring是一个分层的Java SE/EE应用一站式的轻量级开源框架。Spring核心是IOCAOP
Spring主要优点包括:

  • 方便解耦,简化开发,通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码造成的程序耦合度高。
  • AOP编程的支持,通过Spring提供的AOP功能,方便进行面向切面编程。
  • 声明式事务的支持,在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
  • 方便程序的测试,可以用非容器依赖的编程方式进行几乎所有的测试工作。
  • 方便集成各种优秀框架,Spring提供了对各种优秀框架的直接支持

2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。

2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版。

Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器(框架)。 

1.2、Spring系统架构 

Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式 .

2、Spring的IOC和DI入门
DI:依赖注入,一个BookService类的功能需要依赖另外一个BookDao类配合,同时需要附上一个具体的对象,则成这种关系是依赖注入;
IOC:控制反转,以前依赖的对象自己直接new,现在不需要new,框架会自动注入对象,创建对象的权利转移给了框架;  
Spring框架负责所有对象的创建、管理和依赖注入;所有的对象存储的容器叫做IOC容器;
3、 使用 spring 完成 IOC 的配置和 DI 依赖注入
3.1、创建项目,导入springjar包,按照如图创建接口及其实现类

 

dao包 

1.接口BookDao

public interface BookDao {
    public void insert();
}

2.实现类BookDaoImpl

public class BookDaoImpl implements BookDao {

    @Override
    public void insert() {
        System.out.println("BookDaoImpl......insert");
    }
}

service包

1.接口BookService

public interface BookService {
    void save();
}

2.实现类BookServiceImpl

public class BookServiceImpl implements BookService {
    private String name;
    private BookDao bookDao;

    public void setName(String name) {
        this.name = name;
    }

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    @Override
    public void save() {
        System.out.println("BookServiceImpl......save+name");
        bookDao.insert();
    }
}

BookServiceImpl需要给bookDao属性设置setter方法,框架才能自动注入  

servlet包

servlet中进行测试

1.首先获取IOC的容器;

2.从容器中获取bookService对象;

3.执行方法:servlet执行---service执行,由于spring完成了依赖注入------dao包执行

public class BookServlet {
    BookService bookService;
    @Test
    public void add() {
        System.out.println("BookServlet...add");
        //1.获得IOC容器
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
        //2.根据名字从容器中获取对象
        bookService= (BookService) context.getBean("bookService");
        bookService.save();
    }
}

3.2、创建spring的核心配置文件

bean标签:把对应class的对象创建到IOC容器中,如果当前对象有依赖的其他对象,那么可以通过property对依赖的对象使用ref引用容器中已经注册过的对象。

把所有对象创建到spring的IOC容器中,并起上名字;id:表示给对象起名字 class:类的全类名
spring的依赖注入:
property表示BookServiceImpl的属性,常规属性使用value赋值,类型属性使用ref引用   
<?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 id="bookDao" class="com.zhan.dao.impl.BookDaoImpl"></bean>
    <bean id="bookService" class="com.zhan.service.impl.BookServiceImpl">
        <property name="name" value="张三"/>
        <property name="bookDao" ref="bookDao"/>
    </bean>
</beans>

 控制台日志信息

4.bean作用范围scope配置

singleton:单列,框架会唯一创建该对象,后续获取的都是同一个,在配置文件加载的时候创建了

prototype:非单例/多例,框架在每次获取的时候创建一个新的,在获得的时候创建。多线程

单例 

<bean id="bookService" class="com.zhan.service.impl.BookServiceImpl" scope="singleton">
        <property name="bookDao" ref="bookDao"/>
    </bean>

多例 

<bean id="bookService" class="com.zhan.service.impl.BookServiceImpl" scope="prototype">
        <property name="bookDao" ref="bookDao"/>
    </bean>

 

 5.静态工厂实例化

 

factory:工厂对象;工厂类就是制造对象的,一般没有功能;

class:工厂类的全类名

factory-method:具体工厂类中创建对象的方法名

配置

<bean id="bookService3" class="com.zhan.factory.BookServiceFactory"></bean>

测试

public class Test02 {
    @Test
    public void test02(){
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
        BookServiceFactory factory = (BookServiceFactory) context.getBean("bookService3");
        System.out.println(factory);
    }
}

 日志信息

 

配置工厂

    <!--配置工厂,但是获得的工厂的商品 -->
    <bean id="bookService3" class="com.zhan.factory.BookServiceFactory" factory-method="getBean"></bean>

静态工厂创建对象

public class BookServiceFactory {
    public static BookService getBean(){
        return new BookServiceImpl();
    }
}

 测试类

public class Test02 {
    @Test
    public void test02(){
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
        BookService factory = (BookService) context.getBean("bookService3");
        System.out.println(factory);
    }
}

日志信息 

 

6.setter注入 

配置中使用property标签的ref属性注入引用类型对象

对于基本数据类型(包括String),指定属性值使用"value"属性,而对于引用类型使用"ref"属性。

<bean id="bookService" class="com.zhan.service.impl.BookServiceImpl" scope="singleton">
        <property name="bookDao" ref="bookDao"/>
    </bean>

在BookServiceImpl中定义引用类型属性,提供可访问的setter方法 

public class BookServiceImpl implements BookService {
    BookDao bookDao;

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

7.构造器注入

使用constructor-arg标签进行依赖注入,name属性要与实现类中提供的形参类型和个数一致,否则将会报错。

<bean id="bookService1" class="com.zhan.service.impl.BookServiceImpl" scope="singleton">
        <constructor-arg name="name" value="张三"/>
        <constructor-arg name="bookDao" ref="bookDao"/>
    </bean>

 在BookServiceImpl中定义引用类型属性,提供有参的构造方法

public class BookServiceImpl implements BookService {
    String name;
    BookDao bookDao;

    public BookServiceImpl(String name, BookDao bookDao) {
        System.out.println("有参");
        this.name = name;
        this.bookDao = bookDao;
    }
}

8.集合注入

使用相应标签(list、set、array、map...)对属性值进行注入

    <bean id="bookService2" class="com.zhan.service.impl.BookServiceVip">
        <property name="list">
            <list>
                <value>张三</value>
                <value>张四</value>
                <value>张五</value>
            </list>
        </property>
        <property name="set">
            <set>
                <value>南阳</value>
                <value>信阳</value>
                <value>濮阳</value>
                <value>安阳</value>
                <value>开封</value>
                <value>郑州</value>
            </set>
        </property>
        <property name="map">
            <map>
                <entry key="name" value="张三"/>
                <entry key="age" value="20"/>
                <entry key="sex" value="男"/>
            </map>
        </property>
    </bean>

 在BookServiceVipl中定义引用类型属性,提供可访问的setter方法

public class BookServiceVip implements BookService {
    List<String> list;
    Set<String> set;
    Map<String,String> map;

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    @Override
    public String toString() {
        return "BookServiceVip{" +
                "list=" + list +
                ", set=" + set +
                ", map=" + map +
                '}';
    }
}

9.注解 

1.创建项目导入jar包

 

2.创建接口和实体类

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
	   http://www.springframework.org/schema/context/spring-context.xsd">
    
    <!--让系统去扫描注解-->
    <context:component-scan base-package="com.zhan"/>
</beans>

自动注入

优先按照类型注入,如果有多个对象,按照名字进行注入

@Override注解告诉你下面这个方法是从父类/接口继承过来的,需要你重写一次,这样就可以方便你阅读,也不怕会忘记。是伪代码,表示重写(当然不写也可以);

@Componet:自动扫描

@Autowired:自动注入属性

@Qualifier:指定名字进行注入

BookDaoImpl类使用注解 @Componet

@Component("bookDao")
public class BookDaoImpl implements BookDao {
    @Override
    public void insert() {
        System.out.println("BookDaoImpl......insert");
    }
}

 BookServiceImpl类使用注解 @Componet ;@Autowired

@Component("bookService")
public class BookServiceImpl implements BookService {
    //自动注入优先按照类型注入,如果有多个对象,按照名字进行注入
    @Autowired
    BookDao bookDao;

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    @Override
    public void save() {
        System.out.println("BookServiceImpl......save");
        bookDao.insert();
    }
}

测试类

public class Test01 {
    BookService bookService;
    @Test
    public void test01(){
        ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("spring.xml");
        //按照类型获得对象,前提类型有唯一的对象
        bookService = context.getBean(BookService.class);
        this.bookService.save();
    }
}

打印日志 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式事务问题

分布式事务问题 1、什么是分布式事务 一次课程发布操作需要向数据库、redis、elasticsearch、MinIO写四份数据&#xff0c;这里存在分布式事务问题。 什么是分布式事务&#xff1f; 首先理解什么是本地事务&#xff1f; 平常我们在程序中通过spring去控制事务是利用数据库…

【C++】一维数组练习案例 - 五只小猪称体重

目录 1、缘起 2、案例描述 3、代码 4、总结 1、缘起 最近在黑马程序员 UP 主那里学习 C 编程语言&#xff0c;学习到了【第44节】一维数组练习案例 - 五只小猪称体重 知识点。找出五只小猪中最重的小猪&#xff0c;这不就是基本算法中的 "求最大值算法" 嘛。 为…

ChatGPT相关核心算法

ChatGPT 的卓越表现得益于其背后多项核心算法的支持和配合。本文将分别介绍作为其实现基础的 Transformer 模型、激发出其所蕴含知识的Prompt/Instruction Tuning 算法、其涌现出的思维链能力、以及确保其与人类意图对齐的基于人类反馈的强化学习算法。 1.基于Transformer的预…

STM32F4_时钟系统精讲

目录 1. 什么是系统时钟 2. 时钟树 2.1 LSI 2.2 LSE 2.3 HSI 2.4 HSE 2.5 PLLCLK 2.6 SYSCLK 2.7 HCLK 2.8 PCLK1 2.9 PCLK2 2.10 RTC/AWU 3 SysTick定时器 3.1 为什么会有Systick定时器&#xff1f; 3.2 SysTick定时器的作用 3.3 SysTick定时器的寄存器 4.…

DAMA-CDGA/CDGP数据治理认证考试地点一般有哪些?

据目前数据统计&#xff0c;进行过DAMA-CDGA/CDGP数据治理认证考试的地区主要是一线城市及直辖市&#xff0c;主要有&#xff1a;北京、上海、广州、深圳、西安、杭州、成都、重庆、武汉、厦门、太原、甘肃、长沙等。&#xff08;*当所在城市报名人数达到25人以上方可增加考场开…

C++基本语法

C 程序可以定义为对象的集合&#xff0c;这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象&#xff0c;方法、即时变量。 对象 - 对象具有状态和行为。例如&#xff1a;一只狗的状态 - 颜色、名称、品种&#xff0c;行为 - 摇动、叫唤、吃。对象是类…

SpringBoot2基础入门 --- 了解自动配置原理

一、SpringBoot特点 1.1、依赖管理 父项目做依赖管理 依赖管理 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version> </parent>…

固定资产AFAB进行折旧选择页面的各个选项分别是什么意思?

固定资产AFAB进行折旧选择页面的“记账运行原因”的4个选项&#xff0c;及下面的各个选项分别是什么意思&#xff1f; 一、“记账运行原因”的4个选项&#xff1a; 1&#xff0c;计划内记账运行&#xff08;Planned posting run&#xff09;&#xff1a;上期折旧成功运行&…

测试---

1.加载测试专用属性 1.在启动测试环境时可以通过properties参数设置测试环境专用的属性 SpringBootTest(properties {"test.valuekllda"}) public class PropertiesTest {Value("${test.value}")private String msg; ​Testpublic void testPro(){System…

初识MQ——springCloud

目录 同步通讯 同步调用存在的问题 优点 异步通讯 优势 缺点 MQ常见框架 同步通讯 同步调用存在的问题 1、耦合度高 2、性能下降 3、资源浪费 4、级联失败 优点 时效性强 &#xff0c;可以立即得到结果 异步通讯 异步调用常见实现就是事件驱动模式 优势 1、解除耦合 2、…

【关于Linux中----多线程(一)】

文章目录认识线程创建线程线程优点和缺点创建一批线程终止线程线程的等待问题认识线程 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行&a…

高通开发系列 - linux kernel内核升级msm-4.9升级至msm-4.19(1)

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 报错和警告问题中断警告的解决方案Unknown SOC ID问题解决方法msm-vidc panic错误系统时钟功能RPM功能调试共享内存smem调试之前移植过…

SpringCloud Alibaba Nacos

文章目录第一章 SpringCloud Alibaba1.1概述1.2 主要功能1.3 组件第二章 SpringCloud Alibaba Nacos服务注册与配置中心2.1 Nacos简介2.2 安装Nacos2.3 Nacos作为服务注册中心一、服务提供者二、服务消费者三、服务注册中心对比2.4 Nacos作为服务配置中心一、Nacos基础配置项目…

【C++笔试强训】第六天

选择题 1. 解析&#xff1a;十进制转换为八进制就是不断的除8&#xff0c;取余数。十进制转换成其他进制的数就是除以进制&#xff0c;取余。 解析&#xff1a;注意printf的转换&#xff0c;%%只会打印一个%&#xff0c;所以选A。 解析&#xff1a;由于()的原因p先和*结合&…

某面试官分享经验:看求职者第一眼,开口说第一句话,面试结果就差不多定了,准确率高达90%以上...

我们以前分享过许多经验&#xff0c;但大多是站在打工人的视角上&#xff0c;今天给大家带来一个面试官的经验&#xff1a;1. 看求职者第一眼&#xff0c;开口说第一句话&#xff0c;面试结果就差不多定了&#xff0c;准确率高达90%以上。2. 绝不考八股文&#xff0c;如果问技术…

docker安装MongoBD(超详细)

一、安装docker 推荐文章&#xff1a;https://blog.csdn.net/Sumuxi9797926/article/details/127313307?spm1001.2014.3001.5502 二、创建主机挂载配置目录 data目录存放mongodb数据库文件&#xff0c;删除重启容器不会丢失 mkdir -p /docker/mongodb/data && cd …

马云回国,首谈ChatGPT

马云今天回国了&#xff0c;这是一个备受关注的消息。 作为中国最具代表性的企业家之一&#xff0c;马云在过去的二十多年里&#xff0c;带领阿里巴巴从一个小小的创业公司&#xff0c;发展成为全球最大的电商平台之一&#xff0c;同时也推动了中国互联网行业的发展。 他的回…

Redis高可用之持久化

目录 一、高可用 什么是高可用 二、Redis持久化 持久化功能 RDB持久化 触发条件 bgsave执行流程 AOF持久化 执行流程 命令追加 文件写入和文件同步 文件重写 文件重写流程 三、RDB和AOF的优缺点 RDB持久化的优缺点 优点 缺点 AOF持久化优缺点 四、Redis性能管…

修改Hive运⾏⽇志的存放位置

默认情况下&#xff0c;Hive的运⾏⽇志存放在/tmp/root/hive.log ⽬录下&#xff08;root是当前⽤户登录 ⽤户名&#xff09;。修改hive的⽇志存放到/export/servers/hive/logs⽬录下。1. cd /export/server/hive/conf/,找到下面的文件修改/export/server/hive/conf/hive-log4j…

STM32——毕设远程室内灯光控制系统

运程室内灯光控制系统一、功能设计二、硬件选择三、按键说明四、产品主界面展示一、功能设计 本毕设以STM32 F103C8T6为主控核心板智能灯光控制系统,开发的简单易行的智能灯光控制系统,由智能手机通过蓝牙或无线与单片机系统的蓝牙或无线模块进行通信控制单片机板子上的led进行…