Spring见解 1.2 IOC

2.3.Spring的IOC解决程序耦合

2.3.1.创建工程

在这里插入图片描述

2.3.1.1.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.by</groupId><artifactId>Spring_IOC_Xml</artifactId><version>1.0-SNAPSHOT</version><properties><!-- 项目源码及编译输出的编码 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><!-- 项目编译JDK版本 --><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!-- Spring常用依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.8.RELEASE</version></dependency></dependencies>
</project>

注意:Jar包彼此存在依赖,只需引入最外层Jar即可由Maven自动将相关依赖Jar引入到项目中。

Spring常用功能的Jar包依赖关系
在这里插入图片描述

​ 核心容器由 beans、core、context 和 expression(Spring Expression Language,SpEL)4个模块组成。

  • spring-beans和spring-core模块是Spring框架的核心模块,包含了控制反转(Inversion of Control,IOC)和依赖注入(Dependency Injection,DI)。BeanFactory使用控制反转对应用程序的配置和依赖性规范与实际的应用程序代码进行了分离。BeanFactory属于延时加载,也就是说在实例化容器对象后并不会自动实例化Bean,只有当Bean被使用时,BeanFactory才会对该 Bean 进行实例化与依赖关系的装配。
  • spring-context模块构架于核心模块之上,扩展了BeanFactory,为它添加了Bean生命周期控制、框架事件体系及资源加载透明化等功能。此外,该模块还提供了许多企业级支持,如邮件访问、远程访问、任务调度等,ApplicationContext 是该模块的核心接口,它的超类是 BeanFactory。与BeanFactory不同,ApplicationContext实例化后会自动对所有的单实例Bean进行实例化与依赖关系的装配,使之处于待用状态。
  • spring-expression 模块是统一表达式语言(EL)的扩展模块,可以查询、管理运行中的对象,同时也可以方便地调用对象方法,以及操作数组、集合等。它的语法类似于传统EL,但提供了额外的功能,最出色的要数函数调用和简单字符串的模板函数。EL的特性是基于Spring产品的需求而设计的,可以非常方便地同Spring IoC进行交互。
2.3.1.2.dao
/*** 持久层实现类*/
public class UserDaoImpl implements UserDao {@Overridepublic void addUser(){System.out.println("insert into tb_user......");}
}
2.3.1.3.service
/*** 业务层实现类*/
public class UserServiceImpl implements UserService {//此处有依赖关系private UserDao userDao = new UserDaoImpl();public void addUser(){userDao.addUser();}
}

2.3.2.IOC

2.3.2.1.applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--1、注意:要导入schema约束-->
<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"><!--2、把对象交给spring来创建id:给对象在容器中提供一个唯一标识。用于获取对象	class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean><bean id="userService" class="com.by.service.UserServiceImpl"></bean>
</beans>

注意:命名无限制,约定俗成命名有:spring-context.xml、applicationContext.xml、beans.xml

2.3.2.2.测试
/*** 模拟表现层*/
public class Client {public static void main(String[] args) {//1.使用ApplicationContext接口,就是在获取spring容器ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//2.根据bean的id获取对象UserDao userDao = (UserDao) ac.getBean("userDao");System.out.println(userDao);UserService userService = (UserService) ac.getBean("userService");System.out.println(userService);userService.addUser();}
}
  • 问题:service层仍然耦合

2.3.3.DI

概述:DI(Dependency Injection)依赖注入,在Spring创建对象的同时,为其属性赋值,称之为依赖注入。

2.3.3.1.构造函数注入

顾名思义,就是使用类中的构造函数,给成员变量赋值。注意,赋值的操作不是我们自己做的,而是通过配置的方式,让spring框架来为我们注入。具体代码如下:

/*** 业务层实现类*/
public class UserServiceImpl implements UserService {private UserDao userDao;private String name;private Integer age;public UserServiceImpl(UserDao userDao, String name, Integer age) {this.userDao = userDao;this.name = name;this.age = age;}public void addUser(){System.out.println(name+","+age);userDao.addUser();}
}
<?xml version="1.0" encoding="UTF-8"?>
<!--1、注意:要导入schema约束-->
<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"><!--2、把对象交给spring来创建--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean><bean id="userService" class="com.by.service.UserServiceImpl"><!--要求:类中需要提供一个对应参数列表的构造函数。标签:constructor-arg==给谁赋值:==index:指定参数在构造函数参数列表的索引位置name:指定参数在构造函数中的名称==赋什么值:==value:它能赋的值是基本数据类型和String类型ref:它能赋的值是其他bean类型,也就是说,必须得是在配置文件中配置过的bean--><constructor-arg name="userDao" ref="userDao"></constructor-arg><constructor-arg name="name" value="张三"></constructor-arg><constructor-arg name="age" value="18"></constructor-arg></bean>
</beans>
2.3.3.2.set方法注入

顾名思义,就是在类中提供需要注入成员的set方法。具体代码如下:

/*** 业务层实现类*/
public class UserServiceImpl implements UserService {private UserDao userDao;private String name;private Integer age;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void setName(String name) {this.name = name;}public void setAge(Integer age) {this.age = age;}public void addUser(){System.out.println(name+","+age);userDao.addUser();}
}
<?xml version="1.0" encoding="UTF-8"?>
<!--1、注意:要导入schema约束-->
<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"><!--2、把对象交给spring来创建--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean><bean id="userService" class="com.by.service.UserServiceImpl"><!--要求:property标签:constructor-arg==给谁赋值:==name:找的是类中set方法后面的部分==赋什么值:==value:它能赋的值是基本数据类型和String类型ref:它能赋的值是其他bean类型,也就是说,必须得是在配置文件中配置过的bean--><property name="userDao" ref="userDao"></property><property name="name" value="张三"></property><property name="age" value="18"></property></bean>
</beans>
2.3.3.3.自动注入

不用在配置中 指定为哪个属性赋值,由spring自动根据某个 “原则” ,在工厂中查找一个bean并为属性注入值。具体代码如下:

/*** 业务层实现类*/
public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void addUser(){userDao.addUser();}
}
<?xml version="1.0" encoding="UTF-8"?>
<!--1、注意:要导入schema约束-->
<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"><!--2、把对象交给spring来创建--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean><!--autowire="byType":按照类型自动注入值--><bean id="userService" class="com.by.service.UserServiceImpl" autowire="byType"></bean>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<!--1、注意:要导入schema约束-->
<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"><!--2、把对象交给spring来创建--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean><!--autowire="byType":按照类型自动注入值--><bean id="userService" class="com.by.service.UserServiceImpl" autowire="byName"></bean>
</beans>
2.3.3.4.注入集合类型的属性

顾名思义,就是给类中的集合成员传值,它用的也是set方法注入的方式,只不过变量的数据类型都是集合。我们这里介绍注入数组,List,Set,Map。具体代码如下:

/*** 业务层实现类*/
public class UserServiceImpl implements UserService {private UserDao userDao;private String[] myStrs;private List<String> myList;private Set<String> mySet;private Map<String,String> myMap;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void setMyStrs(String[] myStrs) {this.myStrs = myStrs;}public void setMyList(List<String> myList) {this.myList = myList;}public void setMySet(Set<String> mySet) {this.mySet = mySet;}public void setMyMap(Map<String, String> myMap) {this.myMap = myMap;}public void addUser(){System.out.println(Arrays.toString(myStrs));System.out.println(myList);System.out.println(mySet);System.out.println(myMap);userDao.addUser();}
}
<?xml version="1.0" encoding="UTF-8"?>
<!--1、注意:要导入schema约束-->
<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"><!--2、把对象交给spring来创建--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean><bean id="userService" class="com.by.service.UserServiceImpl"><!--要求:property标签:constructor-arg==给谁赋值:==name:找的是类中set方法后面的部分==赋什么值:==value:它能赋的值是基本数据类型和String类型ref:它能赋的值是其他bean类型,也就是说,必须得是在配置文件中配置过的bean--><property name="userDao" ref="userDao"></property><!-- 给mySet集合注入数据 --><property name="mySet"><set><value>AAA</value><value>BBB</value><value>CCC</value></set></property><!-- 注入array数组数据 --><property name="myArray"><array><value>AAA</value><value>BBB</value><value>CCC</value></array></property><!-- 注入list集合数据 --><property name="myList"><list><value>AAA</value><value>BBB</value><value>CCC</value></list></property><!-- 注入Map数据 --><property name="myMap"><map><entry key="testA" value="aaa"></entry><entry key="testB" value="bbb"></entry></map></property></bean>
</beans>

2.4.Spring中的工厂类

2.4.1.ApplicationContext

  • ApplicationContext的实现类,如下图:

    • ClassPathXmlApplicationContext:加载类路径下 Spring 的配置文件
    • FileSystemXmlApplicationContext:加载本地磁盘下 Spring 的配置文件

2.4.2.BeanFactory

  • spring中工厂的类结构图

  • 区别:

    • ApplicationContext:只要一读取配置文件,默认情况下就会创建对象。

      /*** 业务层实现类*/
      public class UserServiceImpl implements UserService {private UserDao userDao;public UserServiceImpl() {System.out.println("UserServiceImpl对象创建了...");}public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void addUser(){userDao.addUser();}
      }
      
      /*** 模拟表现层*/
      public class Client {public static void main(String[] args) {new ClassPathXmlApplicationContext("applicationContext.xml");System.out.println("Spring IOC容器创建好了");}
      }
      
    
    
  • BeanFactory:是在 getBean 的时候才会创建对象。

    /*** 业务层实现类*/
    public class UserServiceImpl implements UserService {private UserDao userDao;public UserServiceImpl() {System.out.println("UserServiceImpl对象创建了...");}public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void addUser(){userDao.addUser();}
    }
    
    /**
    * 模拟表现层
    */
    public class Client {public static void main(String[] args) {new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));System.out.println("Spring IOC容器创建好了");}
    }
    

2.5.bean的作用范围

2.5.1.概述

  • 在Spring中,bean作用域用于确定bean实例应该从哪种类型的Spring容器中返回给调用者。

2.5.2.五种作用域

  • 目前Spring Bean的作用域或者说范围主要有五种:

    作用域说明
    singleton默认值,Bean以单例方式存在spring IoC容器
    prototype每次从容器中调用Bean时都返回一个新的实例,相当于执行newInstance()
    requestWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中
    sessionWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中
    applicationWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 ServletContext 域中
  • 可以通过 <bean> 标签的scope 属性控制bean的作用范围,其配置方式如下所示:

    <bean id="..." class="..." scope="singleton"/>
    
  • 需要根据场景决定对象的单例、多例模式

    单例:Service、DAO、SqlSessionFactory(或者是所有的工厂)

    多例:Connection、SqlSession

2.6.bean的生命周期

2.6.1.单例bean

  • 案例

    <bean id="userService" class="com.by.service.UserServiceImpl"scope="singleton" init-method="init" destroy-method="destroy">
    
    /*** 业务层实现类*/
    public class UserServiceImpl implements UserService {private UserDao userDao;public UserServiceImpl() {System.out.println("调用构造方法创建bean...");}public void setUserDao(UserDao userDao) {System.out.println("调用set方法注入值...");this.userDao = userDao;}public void init(){System.out.println("调用init方法初始化bean...");}public void destroy(){System.out.println("调用destroy方法销毁bean...");}public void addUser(){userDao.addUser();}
    }
    
    /*** 模拟表现层*/
    public class Client {public static void main(String[] args) {ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//关闭容器ac.close();}
    }
    
  • 生命周期:

    [容器启动]—>构造方法(实例化)—>set方法(注入)—>init方法(初始化)—>[容器关闭]—>destroy方法(销毁)

2.6.2.多例bean

  • 案例

    <bean id="userService" class="com.by.service.UserServiceImpl"scope="prototype" init-method="init" destroy-method="destroy">
    
    /*** 业务层实现类*/
    public class UserServiceImpl implements UserService {private UserDao userDao;public UserServiceImpl() {System.out.println("调用构造方法创建bean...");}public void setUserDao(UserDao userDao) {System.out.println("调用set方法注入值...");this.userDao = userDao;}public void init(){System.out.println("调用init方法初始化bean...");}public void destroy(){System.out.println("调用destroy方法销毁bean...");}public void addUser(){userDao.addUser();}
    }
    
    /*** 模拟表现层*/
    public class Client {public static void main(String[] args) {ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//使用对象ac.getBean("userService");}
    }
    
  • 生命周期:

    [使用对象]---->构造方法(实例化)—>set方法(注入)—>init方法(初始化)—>[JVM垃圾回收]—>destroy方法(销毁)

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

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

相关文章

网络安全的概念、类型和重要性

什么是网络安全&#xff1f; 网络安全是指用于防止网络攻击或减轻其影响的任何技术、措施或做法。网络安全旨在保护个人和组织的系统、应用程序、计算设备、敏感数据和金融资产&#xff0c;使其免受简单而不堪其绕的计算机病毒、复杂而代价高昂的勒索软件攻击&#xff0c;以及…

Jvm垃圾收集器系列之ZGC的小知识(个人见解仅供参考)

学习内容&#xff1a; 问&#xff1a;什么是STW&#xff1f; 答&#xff1a;STW是StopTheWorld的缩写&#xff0c;指的是在Java的垃圾回收过程中&#xff0c;暂停所有的业务线程&#xff0c;导致业务系统暂停。问&#xff1a;ZGC的设计目标是什么&#xff1f; 答&#xff1a;Z…

Spring 七种事务传播性介绍

作者&#xff1a;vivo 互联网服务器团队 - Zhou Shaobin 本文主要介绍了Spring事务传播性的相关知识。 Spring中定义了7种事务传播性&#xff1a; PROPAGATION_REQUIRED PROPAGATION_SUPPORTS PROPAGATION_MANDATORY PROPAGATION_REQUIRES_NEW PROPAGATION_NOT_SUPPORTED…

八、QLayout 用户基本资料修改(Qt5 GUI系列)

目录 一、设计需求 二、实现代码 三、代码解析 四、总结 一、设计需求 在很多应用程序中会有用户注册或用户编辑信息等界面。本文就设计一个用户信息编辑界面。要求包含用户名、姓名、性别、部门、年龄、头像、个人说明等信息。 二、实现代码 #ifndef DIALOG_H #define D…

springboot中引入AOP切面编程

在Spring Boot 3.0中引入AOP的过程如下所示&#xff1a; 1、首先&#xff0c;确保已经添加了相关依赖。可以通过Maven或Gradle来管理项目的依赖。对于使用Maven构建的项目&#xff0c;需要将以下依赖添加到pom.xml文件中 <dependency><groupId>org.springframewo…

BERT(从理论到实践): Bidirectional Encoder Representations from Transformers【3】

这是本系列文章中的第3弹,请确保你已经读过并了解之前文章所讲的内容,因为对于已经解释过的概念或API,本文不会再赘述。 本文要利用BERT实现一个“垃圾邮件分类”的任务,这也是NLP中一个很常见的任务:Text Classification。我们的实验环境仍然是Python3+Tensorflow/Keras…

Kafka高级应用:如何配置处理MQ百万级消息队列?

在大数据时代&#xff0c;Apache Kafka作为一款高性能的分布式消息队列系统&#xff0c;广泛应用于处理大规模数据流。本文将深入探讨在Kafka环境中处理百万级消息队列的高级应用技巧。 本文&#xff0c;已收录于&#xff0c;我的技术网站 ddkk.com&#xff0c;有大厂完整面经…

2023年度全球重大关基安全事件 TOP 10 | FreeBuf 年度盘点

2023年&#xff0c;针对关键信息基础设施的网络攻击已经演变成为了一个全球性的问题&#xff0c;无论是中、美、俄等国际大国&#xff0c;还是诸多小国/地区&#xff0c;无论是经济发达还是落后&#xff0c;都无法保证绝对免疫关键基础设施的攻击。为了保障国家安全和社会稳定&…

Nestjs 微服务实战 - 动态微服务创建链接

所有的微服务都需要做服务治理 服务治理包括(配置中心、服务发现、注册服务等等),常见的包括 Java 的 Nacos,这里不关注与服务治理,只说明,如何用 nest 网关,并且在网关层动态实现微服务注入 nestjs 官网的案例明显是偏向于手动注册微服务的,例如: /** Model */ @M…

力扣-42.接雨水

题目&#xff1a; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组[0,1,0,2…

Windows PowerShell的安全目标——安全警报

Windows PowerShell的安全目标——安全警报 1. 保证Shell安全 ​ 自从2006年年底PowerShell发布以来&#xff0c;微软在安全和脚本方面并没有取得很好的名声。毕竟那个时候&#xff0c;**VBScript和Windows Script Host(WSH)**是两个最流行的病毒和恶意软件的载体&#xff0c…

springBoot集成RabbitMQ实现(直连模式\路由模式\广播模式\主题模式)的消息发送和接收

该项目介绍了springboot如何集成rabbitMQ消息中间件,实现(直连模式\路由模式\广播模式\主题模式)的消息发送和接收 pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId

Linux_CentOS_7.9_MySQL_5.7配置数据库服务开机自启动之简易记录

前言&#xff1a; 作为运维保障&#xff0c;都无法准确预估硬件宕机的突发阶段&#xff0c;其生产数据实时在产出&#xff0c;那作为dba数据库服务的其重要性、必要性就突显而出。这里拿虚拟机试验做个配置记录&#xff0c;便于大家学习参考。 # 如出现服务器重启后登入报错无…

redisson滑动时间窗应用场景

概述 前10分钟内累计3次验证失败后&#xff0c;增加图形验证码验证条件&#xff0c;前10分钟内累计6次验证失败后&#xff0c;系统自动锁定该账号15分钟&#xff0c;15分钟后自动解锁&#xff1b;方案 基于redisson&#xff08;zset&#xff09;滑动时间窗记录最近10分钟内该…

彻底理解前端安全面试题(4)—— 中间人攻击,详解 http 和https 的中间人攻击实例,建议收藏(含源码)

前言 前端关于网络安全问题看似高深莫测&#xff0c;其实来来回回就那么点东西&#xff0c;我总结一下就是 3 1 4&#xff0c;3个用字母描述的【分别是 XSS、CSRF、CORS】 一个中间人攻击。当然 CORS 同源策略是为了防止攻击的安全策略&#xff0c;其他的都是网络攻击。除…

华硕 - 笔记本 Fn 键如何切换/重置恢复?

华硕笔记本的Fn键是用来进行功能切换的&#xff0c;可以在按下Fn键的同时按下其他特定的功能键实现相应的功能。要将Fn键切换回来&#xff0c;可以尝试以下几种方法 FnEsc&#xff1a;有些华硕笔记本上配备了一个特殊的快捷组合键&#xff0c;即FnEsc。按下这两个键后&#xff…

docker-compose Install spug 3

前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中心、监控、报警等一系列功能。 创建一键安装spug 脚本 自动化脚本兼容(ubuntu,RedHat系列及复刻系列,…

<HarmonyOS主题课>三方库

【习题】三方库 目录 判断题 单选题 多选题 判断题 1.三方组件是开发者在系统能力的基础上进行了一层具体功能的封装&#xff0c;对其能力进行拓展的工具 。正确 正确(True) 错误(False) 2.可以通过ohpm uninstall 指令下载指定的三方库错误 正确(True) 错误(False) …

spug发布问题汇总记录

问题导览 1. [vite]: Rollup failed to resolve import "element-plus" from "src/main.js". 项目框架简介 vue3viteelement-plus 解决方案 - 1. 配置淘宝镜像源&#xff1a;npm config set registry https://registry.npm.taobao.org/ - 2. npm inst…

SpringBoot从配置文件中获取属性的方法

方式一&#xff1a;Value 基本类型属性注入&#xff0c;直接在字段上添加Value("${xxx.xxx}")即可&#xff0e;注意这里用的是$&#xff0c;而不是#&#xff0c;Value注入的属性&#xff0c;一般其他属性没有关联关系。 配置文件 user:name: Manaphyage: 19sex: m…