【Spring5,搞定kafka看这一篇就够了

本文探讨了Spring5中对象初始化和销毁的顺序,强调了初始化资源如数据库、IO和网络的重要性。此外,还提到了Spring对象的销毁过程,包括DisposableBean接口和destroy-method配置。文章介绍了秒杀系统的三个核心要求:高性能、一致性和高可用性,并指出在高并发场景下设计秒杀减库存方案的挑战。虽然内容丰富,但由于篇幅限制,仅展示了部分内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 如果⼀个对象既实现 InitializingBean 同时又提供的 普通的初始化方法,执行顺序?

    答:先执行 InitializingBean,再执行 普通初始化方法。

  2. 注入⼀定发生在初始化操作的前面。

  3. 初始化操作到底是什么?

    资源的初始化:数据库、IO、网络、…

销毁阶段 - DisposableBean、destroy-method


Spring 销毁对象前,会调用对象的销毁方法,完成销毁操作。

Spring 什么时候销毁所创建的对象?ctx.close();

销毁方法提供:程序员根据业务需求,定义销毁方法,完成销毁操作

销毁方法调用:Spring 工厂进行调用。

开发流程与初始化操作一样,提供销毁方法的两种方式:

  1. DisposableBean 接口:

public class Product implements DisposableBean {

    // 程序员根据自己的需求, 定义销毁方法, 完成销毁操作

    @Override

    public void destroy() throws Exception {

        System.out.println("Product.destroy");

    }

} 

  1. 对象中提供一个普通的销毁方法,配置文件种配置 destroy-method

public class Product {

	// 程序员根据自己的需求, 定义销毁方法, 完成销毁操作

    public void myDestory() {

        System.out.println("Product.myDestory");

    }

} 




* * *



**销毁阶段细节分析**:



1.  销毁方法的操作只适用于 `scope="singleton"`,初始化操作都适用。

2.  销毁操作到底是什么?  

    资源的释放:`io.close()`、`connection.close()`、…



[](https://gitee.com/vip204888/java-p7)对象的生命周期总结

----------------------------------------------------------------------------



public class Product implements InitializingBean, DisposableBean {

private String name;



public String getName() {

    return name;

}



public void setName(String name) {

    System.out.println("Product.setName");

    this.name = name;

}



Product() { // 创建

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

}



// 程序员根据需求实现的方法, 完成初始化操作

public void myInit() {

    System.out.println("Product.myInit");

}



// 程序员根据需求实现的方法, 完成初始化操作

@Override

public void afterPropertiesSet() throws Exception {

    System.out.println("Product.afterPropertiesSet");

}



public void myDestory() {

    System.out.println("Product.myDestory");

}



// 程序员根据自己的需求, 定义销毁方法, 完成销毁操作

@Override

public void destroy() throws Exception {

    System.out.println("Product.destroy");

}

}


<bean id="product" class="com.yusael.life.Product" init-method="myInit" destroy-method="myDestory">

	<property name="name" value="yusael"/>

</bean> 

```



![在这里插入图片描述](https://img-blog.csdnimg.cn/20200524010228627.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)



[](https://gitee.com/vip204888/java-p7)配置文件参数化

==========================================================================



**配置文件参数化**:把 Spring 配置文件中需要经常修改的字符串信息,转移到⼀个更小的配置文件中。



1.  Spring 的配置文件中是否存在需要经常修改的字符串?  

    存在:以数据库连接相关的参数…

2.  经常变化字符串,在 Spring 的配置文件中,直接修改不利于项目维护(修改)

3.  转移到⼀个小的配置文件(.properties)利于维护(修改)



优点:利于 Spring 配置文件的维护(修改)



[](https://gitee.com/vip204888/java-p7)配置文件参数的开发步骤

------------------------------------------------------------------------------



*   提供⼀个小的配置文件(.properities)  

    名字:没有要求  

    放置位置:没有要求



```

jdbc.driverClassName = com.mysql.jdbc.Driver

jdbc.url = jdbc:mysql://localhost:3306/spring?useSSL=false

jdbc.username = root

jdbc.password = 1234 

```



*   Spring 的配置文件与小配置文件进行整合:



```

<!--Spring的配置文件与⼩配置文件进行整合-->

<!--resources 下的文件在整个程序编译完后会被放到 classpath 目录下,src.main.java中的文件也是-->

<context:property-placeholder location="classpath:/db.properties"/> 

```



在 Spring 配置文件中通过 `${key}` 获取小配置文件中对应的值:



```

<bean id="conn" class="com.yusael.factorybean.ConnectionFactoryBean">

	<property name="driverClassName" value="${jdbc.driverClassName}"/>

	<property name="url" value="${jdbc.url}"/>

	<property name="username" value="${jdbc.username}"/>

	<property name="password" value="${jdbc.password}"/>

</bean> 

```



[](https://gitee.com/vip204888/java-p7)自定义类型转换器

===========================================================================



[](https://gitee.com/vip204888/java-p7)类型转换器

------------------------------------------------------------------------



作用:Spring 通过 类型转换器 把 配置文件 中 字符串 类型的数据,转换成了对象中成员变量对应类型的数据,进而完成了注入。  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200524232431470.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)



[](https://gitee.com/vip204888/java-p7)自定义类型转换器

---------------------------------------------------------------------------



产生原因:当 Spring 内部没有提供特定类型转换器时,而程序员在应用的过程中还需要使用,那么就需要程序员自己定义类型转换器。



**\[开发步骤\]**:



*   类 implements Converter 接口



```

public class MyDateConverter implements Converter<String, Date> {

    /*

     convert方法作用: String ---> Date

     SimpleDateFormat sdf = new SimpleDateFormat();

     sdf.parset(String) ---> Date



     参数:

     source : 代表的是配置文件中, 日期字符串 <value>2020-10-11</value>

     return : 当把转换好的 Date 作为 convert 方法的返回值后,

             Spring ⾃动的为birthday属性进行注入(赋值)

    */

    @Override

    public Date convert(String source) {

        Date date = null;

        try {

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

            date = sdf.parse(source);

        } catch (ParseException e) {

            e.printStackTrace();

        }

        return date;

    }

} 

```



*   在 Spring 的配置文件中进行配置;  

    先创建 `MyDateConverter` 对象,再注册类型转换器;



```

<!--创建 MyDateConverter 对象-->

<bean id="myDateConverter" class="com.yusael.converter.MyDateConverter"/>

<!--用于注册类型转换器-->

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">

    <property name="converters">

        <set>

            <ref bean="myDateConverter"/>

        </set>

    </property>

</bean>



<bean id="good" class="com.yusael.converter.Good">

    <property name="name" value="zhenyu"/>

    <property name="birthday" value="2012-12-12"/>

</bean> 

```



[](https://gitee.com/vip204888/java-p7)自定义类型转换器细节

-----------------------------------------------------------------------------



*   `MyDateConverter` 中的**日期的格式**,通过 **依赖注入** 的方式,由配置文件完成赋值。



```

public class MyDateConverter implements Converter<String, Date> {

    private String pattern;



    @Override

    public Date convert(String source) {

        Date date = null;

        try {

            SimpleDateFormat sdf = new SimpleDateFormat(pattern);

            date = sdf.parse(source);

        } catch (ParseException e) {

            e.printStackTrace();

        }

        return date;

    }



    public String getPattern() {

        return pattern;

    }



    public void setPattern(String pattern) {

        this.pattern = pattern;

    }



} 

<property name="pattern" value="yyyy-MM-dd"/>



*   `ConversionSeviceFactoryBean` 定义 id属性,值必须是 `conversionService`;



总目录展示

该笔记共八个节点(由浅入深),分为三大模块。

高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。该笔记将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这4个方面重点介绍。

一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,将用一个节点来专门讲解如何设计秒杀减库存方案。

高可用。 虽然介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。笔记的最后,将带你思考可以从哪些环节来设计兜底方案。


篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),觉得有需要的码友们,麻烦各位转发一下(可以帮助更多的人看到哟!)点这里,即可获得免费下载的方式!!

由于内容太多,这里只截取部分的内容。需要这份《高并发秒杀顶级教程》的小伙伴,麻烦各位帮忙点赞分享支持一下(可以帮助更多的人看到哟!)
被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,将用一个节点来专门讲解如何设计秒杀减库存方案。

高可用。 虽然介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。笔记的最后,将带你思考可以从哪些环节来设计兜底方案。


篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),觉得有需要的码友们,麻烦各位转发一下(可以帮助更多的人看到哟!)点这里,即可获得免费下载的方式!!

[外链图片转存中…(img-bzJ2mprc-1628599982452)]

[外链图片转存中…(img-H5qneUlF-1628599982456)]

由于内容太多,这里只截取部分的内容。需要这份《高并发秒杀顶级教程》的小伙伴,麻烦各位帮忙点赞分享支持一下(可以帮助更多的人看到哟!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值