Spring(IOC,DI,事务)属性

news2024/10/6 12:34:29

Spring(IOC,DI,事务)属性

IOC

概念

Inverse Of Controll:控制反转;反转了依赖关系的满足方式,由之前的自己创建依赖对象,变为由工厂推送。(变主动为被动,即反转)解决了具有依赖关系的组件之间的强耦合,使得项目形态更加稳健

什么是IOC:

  • 控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理
  • 使用 IOC 目的:为了耦合度降低
  • 入门案例就是 IOC 实现

IOC 底层原理:xml 解析、工厂模式、反射

项目中强耦合问题

public class UserDAOImpl implements UserDAO{....}
public class UserServiceImpl implements UserService {
    // !!!强耦合了UserDAOImpl!!!,使得UserServiceImpl变得不稳健!!
    private UserDAO userDAO= new UserDAOImpl();
    @Override
    public User queryUser() {
        return userDAO.queryUser();
    }
    ....
}

解决方案

// 不引用任何一个具体的组件(实现类),在需要其他组件的位置预留存取值入口(set/get)
public class UserServiceImpl implements UserService {
    // !!!不再耦合任何DAO实现!!!,消除不稳健因素!!
    private UserDAO userDAO;
    // 为userDAO定义set/get,允许userDAO属性接收spring赋值
    // Getters And Setters
    @Override
    public User queryUser() {
        return userDAO.queryUser();
    }
    ....
}
<!--userDao-->
<bean id="userDao" class="com.qf.hello.spring.dao.impl.UserDaoImpl"/>

<!--userService  ref:引用的其他bean的id-->
<bean id="userService" class="com.qf.hello.spring.service.impl.UserServiceImpl">
    <!-- property:设置属性name:对象的属性名ref:对象的属性值,因为userDao属性的对象类型所以属性ref -->
    <property name="userDao" ref="userDao"/>
</bean>

此时,如果需要更换其他UserDAO实现类,则UserServiceImpl不用任何改动!则此时的UserServiceImpl组件变得更加稳健

IOC 接口

  1. IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂
  2. Spring 提供 IOC 容器实现两种方式:(两个接口)
  • BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用

    • 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
  • ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人 员进行使用

    • 加载配置文件时候就会把在配置文件对象进行创建
      在这里插入图片描述
  1. IOC操作bean管理
    • Bean的管理指的是两个操作:1.Spring创建对象 2.Spring注入属性

    • Bean的常见的管理操作有两种方式:1.基于 xml 配置文件方式实现 2.基于注解方式实现

DI

概念

在Spring创建对象的同时,为其属性赋值,称之为依赖注入。

Set注入

创建对象时,Spring工厂会通过Set方法为对象的属性赋值。
代码演示:
定义目标Bean类型:

public class User {
    private Integer id;
    private String name;

    private String sex;
    private Integer age;
    private Date bornDate;
    private String[] hobbys;
    private Set<String> phones;
    private List<String> names;
    private Map<String,String> countries;
    private Properties files;
    //Getters And Setters
}

基本类型 + 字符串类型 + 日期类型:

<!-- 创建一个user对象,然后设置属性 -->
<bean id="user" class="com.qf.hello.spring.entity.User">
    <property name="id" value="1"/>
    <property name="name" value="魏凯"/>
    <property name="sex" value="男"/>
    <property name="age" value="23"/>
    <property name="bornDate" value="2000/03/05"/><!--注意格式"/"-->
</bean>

容器类型:

<!-- 创建一个user对象,然后设置属性 -->
<!-- 创建一个user对象,然后设置属性 -->
<bean id="user" class="com.qf.hello.spring.entity.User">
    <property name="id" value="1"/>
    <property name="name" value="魏凯"/>
    <property name="sex" value="男"/>
    <property name="age" value="23"/>
    <property name="bornDate" value="1999/10/15"/>
    <property name="hobbys">
        <array>
            <value>写代码</value>
            <value>JAVA中级开发工程师</value>
        </array>
    </property>

    <property name="phones">
        <set>
            <value>15112345678</value>
            <value>15114456668</value>
        </set>
    </property>

    <property name="names">
        <list>
            <value>张三</value>
            <value>赵六</value>
            <value>李四</value>
        </list>
    </property>

    <property name="countries">
        <map>
            <entry key="CN" value="中国"/>
            <entry key="USA" value="中国的某个省"/>
        </map>
    </property>

    <property name="files">
        <props>
            <prop key="driver">com.mysql.jdbc.Driver</prop>
            <prop key="url">jdbc:mysql:///</prop>
        </props>
    </property>

</bean>

自建类型:

<!--次要bean,被作为属性-->
<bean id="address" class="com.qf.hello.spring.entity.Address">
    <property name="province" value="湖北"/>
    <property name="city" value="武汉市"/>
</bean>

<!--主要bean,操作的主体-->
<bean id="user" class="com.qf.hello.spring.entity.User">
    <property name="address" ref="address" /><!--address属性引用addr对象-->
</bean>
<!--次要bean,被作为属性-->
<bean id="userDao" class="com.qf.hello.spring.dao.impl.UserDaoImpl" />

<!--主要bean,操作的主体-->
<bean id="userService" class="com.qf.hello.spring.service.impl.UserServiceImpl">
    <property name="userDao" ref="userDao" />
</bean>

构造注入【了解】

创建对象时,Spring工厂会通过构造方法为对象的属性赋值。

定义目标Bean类型:

public class Student {
    private Integer id;
    private String name;
    private String sex;
    private Integer age;
  
    //Constructors
  	public Student(Integer id , String name , String sex , Integer age){
      	this.id = id;
    	this.name = name;
  	    this.sex = sex;
	    this.age = age;
    }
}

注入:

<!--构造注入-->
<bean id="u3" class="com.qf.zcg.spring.day1.t2.ioc.Student">
    <constructor-arg name="id" value="1234" /> <!-- 除标签名称有变化,其他均和Set注入一致 -->
    <constructor-arg name="name" value="tom" />
    <constructor-arg name="age" value="20" />
    <constructor-arg name="sex" value="male" />
</bean>

自动注入

不用在配置中 指定为哪个属性赋值,及赋什么值
由spring自动根据某个 "原则" ,在工厂中查找一个bean,为属性注入属性值

public class UserServiceImpl implements UserService {
    private UserDAO userDAO;
    //Getters And Setters
    ....
}
<bean id="userDao" class="com.qf.spring.part1.injection.UserDaoImpl" />
<!--UserServiceImpl中的属性基于类型自动注入值 -->
<bean id="userService" class="com.qf.spring.part1.injection.UserServiceImpl" autowire="byType"></bean>
<bean id="userDao" class="com.qf.spring.part1.injection.UserDaoImpl" />
<!--UserServiceImpl中的属性基于类型自动注入值 -->
<bean id="userService" class="com.qf.spring.part1.injection.UserServiceImpl" autowire="byName"></bean>

事务

概念

名称描述
default(默认值)(采用数据库的默认的设置) (建议)
read-uncommited读未提交
read-commited读提交 (Oracle数据库默认的隔离级别)
repeatable-read可重复读 (MySQL数据库默认的隔离级别)
serialized-read序列化读

隔离级别由低到高为:read-uncommited < read-commited < repeatable-read < serialized-read

特性

  • 安全性:级别越高,多事务并发时,越安全。因为共享的数据越来越少,事务间彼此干扰减少。
  • 并发性:级别越高,多事务并发时,并发越差。因为共享的数据越来越少,事务间阻塞情况增多。

并发问题

事务并发时的安全问题

问题描述
脏读一个事务读取到另一个事务还未提交的数据。大于等于 read-commited 可防止
不可重复读一个事务内多次读取一行数据的相同内容,其结果不一致。大于等于 repeatable-read 可防止
幻影读一个事务内多次读取一张表中的相同内容,其结果不一致。serialized-read 可防止

传播行为

propagation 传播行为

当涉及到事务嵌套(Service调用Service)时,可以设置:

  • SUPPORTS = 不存在外部事务,则不开启新事务;存在外部事务,则合并到外部事务中。(适合查询)
  • REQUIRED = 不存在外部事务,则开启新事务;存在外部事务,则合并到外部事务中。 (默认值)(适合增删改)

读写性

readonly 读写性

  • true:只读,可提高查询效率。(适合查询)
  • false:可读可写。 (默认值)(适合增删改)

事务超时

timeout 事务超时时间

当前事务所需操作的数据被其他事务占用,则等待。

  • 100:自定义等待时间100(秒)。
  • -1:由数据库指定等待时间,默认值。(建议)

事务回滚

rollback-for 回滚属性

  • 如果事务中抛出 RuntimeException,则自动回滚
  • 如果事务中抛出 CheckException(非运行时异常 Exception),不会自动回滚,而是默认提交事务
  • 处理方案 : 将CheckException转换成RuntimException上抛,或 设置 rollback-for="Exception"

编织

将事务管理的Advice 切入需要事务的业务方法中

<aop:config>
	<aop:pointcut expression="execution(* com.qf.spring.service.UserServiceImpl.*(..))" id="pc"/>
    <!-- 组织切面 -->
    <aop:advisor advice-ref="txManager" pointcut-ref="pc"/>
</aop:config>

基于xml的步骤

<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">
    
    <!--1. 配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!--2. 配置 事务的通知-->
    <tx:advice id="txadvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="transferMoney" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

    <!--3.织入切面-->
    <aop:config>
        <!--配置切点-->
        <aop:pointcut id="txpoint" expression="execution(* com.qf.service.impl.AccountServiceImpl.*(..))"/>
        <!--配置切面-->
        <aop:advisor advice-ref="txadvice" pointcut-ref="txpoint"></aop:advisor>
    </aop:config>
    
</beans>    

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

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

相关文章

1_5 optical_flow

采用特征点法做VO存在耗时较大的问题&#xff0c;一般耗时情况&#xff1a;如下 (1) 在图像中提取特征点并计算特征描述&#xff0c; 非常耗时 ~10ms ORB&#xff0c;shift耗时更多&#xff1b; (2) 在不同图像中寻找特征匹配&#xff0c; 非常耗时 …

day43|动态规划5-不同0-1背包的问题形态

关键点&#xff1a; 找到前后两种状态的依赖关系 经典0-1背包&#xff1a; 给定一个背包&#xff0c;问装满该背包的最大价值。分割等和子集&#xff1a; 给定一个背包&#xff0c;能不能装满该背包&#xff08;将重量抽象成价值&#xff09;最后一块石头重量&#xff1a; 给一…

如何快速图片压缩指定大小?图片压缩到200k以内的方法

图片压缩到200k以内的介绍 在现代社交媒体和网页设计中&#xff0c;高质量的图片是必不可少的。但是&#xff0c;大型图像文件可能会导致页面加载时间过长&#xff0c;从而影响用户体验。这时就需要使用图片压缩技术来将图片文件大小减小到合理的范围内。其中&#xff0c;将图…

稳健地对时间序列光学卫星图像进行配准教程

一、引言 几何误差会导致连续卫星图像采集之间的错位&#xff0c;进而影响土地监测和变化检测分析。在这篇博客文章中&#xff0c;我们研究了如何稳健地对时间序列光学卫星图像进行配准&#xff0c;以减少这种错位的影响。 在本篇博客的末尾&#xff0c;给出用Python配准大区域…

【TES710D-EXT】基于复旦微的FMQL10S400全国产化ARM核心模块之扩展板

板卡概述 TES710D-EXT是专门针对我司TES710D&#xff08;基于复旦微FMQL10S400的全国产化ARM核心板&#xff09;的测试扩展板。 FMQL10S400是复旦微电子研制的全可编程融合芯片&#xff0c;在单芯片内集成了具有丰富特点的四核处理器&#xff08;PS&#xff09;和可编程逻辑&am…

B/S架构与C/S架构的区别

B/S与C/S区别&#xff1a; 1、c/s架构主要应用于局域网内&#xff0c;而b/s架构主要应用于广域网中&#xff1b; 2、c/s架构一般面向相对固定的用户群&#xff0c;对信息安全的控制能力很强&#xff0c;而b/s架构对安全的控制能力相对弱&#xff1b; 3、B/S架构维护升级比较简单…

考研算法复试刷题第20天:Dijkstra求最短路 【有向图的最短路径问题】

Dijkstra求最短路 我们先来说说这道算法的过程&#xff1a; 和上道题不同的是我们这次是求一个有向图到最终节点的最短距离&#xff0c;所以其策略也有所不同。我们先手动模拟一下过程吧假如有4个点&#xff0c;有他们之间有五条边&#xff0c;那么我们如何来求其1到4的最短路…

【Daily Share】觉得浏览器low?手写一个浏览器扩展程序,让自己的浏览器变得与众不同!!!!

浏览器扩展 概念 扩展为浏览器添加了特性与功能。它通过我们所熟悉的 Web 技术-HTML&#xff0c;CSS 还有 JavaScript 来创建。扩展可以利用与 JavaScript 相同的网页 API&#xff0c;但是扩展也可以访问它自己专有的 JavaScript API。这意味着&#xff0c;和在网页里编码相比…

音视频基础知识

视频基础知识 分辨率 分辨率又称为解析度&#xff0c;分辨率越高&#xff0c;像素越多&#xff0c;图像越清晰。 视频分辨率&#xff1a;又称为图像分辨率&#xff0c;由视频的宽高组成&#xff0c;表示形式宽x高&#xff0c;常见的视频分辨率有480P、720P、1080P、2K(2048x…

动态规划-书籍复印

动态规划-书籍复印 1 描述2 样例2.1 样例 1:2.2 样例 2: 3 解题方法3.1 算法解题思路3.2 算法代码实现 该题是lintcode上的算法题&#xff0c;该题的解题思路是依据九章侯老师提供的解题思路去处理的&#xff1a; https://www.lintcode.com/problem/437/description 1 描述 给…

ACL2023 | 黑盒大模型如何微调?清华Decoder Tuning方法提升大模型few-shot场景效果

一、概述 title&#xff1a;Decoder Tuning: Efficient Language Understanding as Decoding 论文地址&#xff1a;https://arxiv.org/abs/2212.08408 代码&#xff1a;GitHub - thunlp/DecT 二、Motivation 现在有很多模型只提供API&#xff0c;没法直接训练&#xff0c;…

关键字 package、import的使用

一、package 关键字的使用 为了更好的实现项目中类型的管理&#xff0c;提供了包的概念使用package声明类或接口所属的包&#xff0c;声明在源文件的首行包 术语标识符&#xff0c;遵循标识符的命名规则、规范&#xff08;xxxyyyzzz&#xff09;、“见名知意”每 “ . ”一次&…

自动化测试selenium环境搭建

自动化测试工具selenium搭建 1. 自动化和selenium基本概念 1) 什么是自动化?为什么要做自动化&#xff1f; 自动化测试能够代替一部分的手工测试&#xff0c;自动化测试能够提高测试的效率。随着项目功能的增加&#xff0c;版本越来越多&#xff0c;版本的回归测试的压力也…

DEI脉冲发生器维修DEI脉冲电源维修PVX-4130

DEI电源维修型号包括:PVX-4130,PVX-4140,PVX-4150,PVX-4120,PVX-5500等型号均可维修。 美国DEI脉冲发生器维修PULSE Generator高压电源维修 DEI脉冲发生器产生高压波形至3500V。 针对高阻抗进行了优化电容性负载&#xff0c;很适合驱动静电引气格栅和偏转板飞行时间质谱仪中粒…

FP独立站不同支付方式的注意事项是什么?

今天&#xff0c;给FP独立站的老板们介绍2个独立站支付方式&#xff0c;以及这些不同的支付方式分别有什么注意事项。 一、PayPal支付 大部分建站平台都支持PayPal支付通道。如果是做美国市场的独立站卖家&#xff0c;PayPal每笔固定收取0.3美金不同比例的手续费&#xff0c;不…

IOS复杂震动AHAP文件编辑指南

简介 目前部分游戏会在播放一些特定的音乐音效时&#xff0c;令设备产生贴合音效的复杂震动&#xff0c;给玩家一个更好的游戏体验。这种复杂震动就是通过苹果的CoreHaptics库实现的。 下面是关于CoreHaptics的官方文档 ​​​​​​​Core Haptics | Apple Developer Docum…

DISC行为模型

DISC行为模型 这是一种研究人行为倾向性的理论&#xff0c;由哈佛大学教授、临床心理学家威廉马斯顿博士提出。它可以用来预测一个人的行为倾向性&#xff0c;让使用者更好地了解自己和影响他人&#xff01; 模型介绍 马斯顿博士发现&#xff0c;行事风格类似的人会展现出类似…

充电桩检测设备厂家TK4860C交流充电桩检定装置

TK4860系列是专门针对现有交流充电桩现场检测过程中接线复杂、负载笨重、现场检测效率低等问题而研制的一系列高效检测仪器&#xff0c;旨在更好的开展充电桩的强制检定工作。 充电桩检测设备是一款在交流充电桩充电过程中实时检测充电电量的标准仪器&#xff0c;仪器以新能源…

Pandora:一个让你呼吸顺畅的ChatGPT

什么是chatgpt ChatGPT是一种基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;的聊天机器人。GPT是一种基于神经网络的自然语言处理模型&#xff0c;它使用大规模的文本数据进行预训练&#xff0c;然后可以用于各种自然语言处理任务&#xff0c;如文本生成…

神州数码DCN路由器之间GREIPsec 配置

拓扑: 说明: R1: g 0/0:192.168.1.1/24 g 0/1:10.1.1.1/24 tunnel 1:172.16.1.1/24 R2: g 0/0:192.168.2.1/24 g 0/1:10.1.1.2/24 tunnel 1:172.16.1.2/24 配置思路: <