《Spring实战》读书笔记-第2章 装配Bean,2024年最新圆我大厂梦

}

}

以上使用的是自动装配构造器,还能用在属性Setter方法上

@Autowired

public void setCompactDisc(CompactDisc compactDisc){

this.compactDisc = compactDisc;

}

如果没有匹配的bean,那么在应用上下文创建时,Spring会抛出一个异常。为了避免异常的出现,你可以将@Autowired的required属性设置为false:

@Autowired(required=false)

public CDPlayer(CompactDisc compactDisc){

this.compactDisc = compactDisc;

}

如果有多个bean都能满足依赖关系的话,Spring将会抛出一个异常。

另:@Autowired可以用@Inject代替

现在,我们已经在CDPlayer的构造器中添加了@Autowired注解,Spring将把一个可分配给CompactDisc类型的bean自动注入进来,为了验证,我们进行测试

package com.springinaction;

import static org.junit.Assert.*;

import org.junit.Test;

import org.junit.Rule;

import org.junit.contrib.java.lang.system.SystemOutRule;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes=CDPlayerConfig.class)

public class CDPlayerTest {

@Rule

public final SystemOutRule log = new SystemOutRule().enableLog();

@Autowired

private CompactDisc sgtPeppers;

@Autowired

private CDPlayer cdPlayer;

@Test

public void cdShouldNotBeNull(){

assertNotNull(sgtPeppers);

}

@Test

public void play(){

cdPlayer.play();

assertEquals(

"Playing Sgt. Pepper’s Lonely Hearts Club Band " +

“by The Beatles\n”,

log.getLog()

);

}

}

测试成功img

2.3 通过Java代码装配bean


当自动化的方案行不通的时候,就必须采用显示装配的方式。显示装配有两种可选方案:JavaConfig和XML。其中JavaConfig是更好的方案,因为它更为强大、类型安全并且对重构友好。

继续上面的示例代码,首先创建配置类

package com.springinaction;

import org.springframework.context.annotation.*;

@Configuration

public class CDPlayerConfig {

}

@Configuration注解表明这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。

我们移除之前的@ComponentScan,使用显示配置

@Bean

public CompactDisc sgtPeppers(){

return new SgtPeppers();

}

@Bean注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean。方法体中包含了最终产生bean实例的逻辑。

默认情况下,bean的ID与带有@Bean注解的方法名一样。在本例中,bean的名字将会是sgtPeppers。也可以重命名

@Bean(name=“lonelyHeartsClubBand”)

public CompactDisc sgtPeppers(){

return new SgtPeppers();

}

下面我们将CD注入到CDPlayer中

@Bean

public CDPlayer cdPlayer(CompactDisc compactDisc){

return new CDPlayer(compactDisc);

}

需要注意的有两点:

  1. 构造器中不能用new创建的对象(这个对象的类是已经在Spring中被声明的),因为Spring会拦截所有对已声明对象的调用,并确保直接返回该方法所创建的bean。这是由于Spring所创建的bean都是单例的。

  2. compactDisc会在Spring中寻找已经实现CompactDisc的bean。

2.4 通过XML装配bean


先来看最简单的SpringXML配置

<?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

http://www.springframework.org/schema/context">

借助Spring Tool Suite创建XML配置文件创建和管理Spring XML配置文件的一种简便方式是使用Spring Tool Suite(https://spring.io/tools/sts)。

我们来简单声明一个bean

下面我们来看一些特征

  1. 不再需要直接负责创建SgtPeppers的实例,而在基于JavaConfig的配置中需要。当Spring发现这个元素时,它将会调用SgtPeppers的默认构造器来创建bean。

  2. 这个bean中,我们将bean的类型以字符串的形式设置了class属性中。没有类型检查。

XML声明DI时,会有很多种可选的配置方案和风格。具体到构造器注入,有两种基本的配置方案可供选择:

  • <constructor-arg>元素

  • 使用Spring3.0所引入的c-命名空间

先来看一下他们各组如何注入bean引用

构造器注入bean引用

当Spring遇到这个<bean>元素时,它会创建一个CDPlayer实例。<constructor-arg>元素会告知Spring要将一个ID为compactDisc的bean引用传递到CDPlayer的构造器中。

作为替代方案,也可以使用Spring的c-命名空间。以下是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:c=“http://www.springframework.org/schema/c”

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

在c-命名空间和模式声明之后,我们就可以使用它来声明构造器参数了,如下所示:

c的属性的说明如下:

img

spring的c标签的构造器属性

属性名以“c:”开头,也就是命名空间的前缀。接下来就是要装配的构造器参数名,在此之后是“-ref”,这是一个命名的约定,它会告诉Spring,正在装配的是一个bean的引用,这个bean的名字是compactDisc,而不是字面量“compactDisc”。

还可以将其中引用参数的名称替换成位置信息:

其中“0”代表参数的索引。

下面我们看一下如何将字面量如何装配到对象中去。

我们先新建一个CompactDisc的实现:

package com.springinaction;

import java.util.List;

public class BlankDisc implements CompactDisc {

private String title;

private String artist;

public BlankDisc(String title, String artist){

this.title = title;

this.artist = artist;

}

@Override

public void play() {

System.out.println("Playing " + title + " by " + artist);

}

}

这个实现类中,cd名称和艺术家是可以从构造器注入的。比SgtPeppers的硬编码要灵活。现在我们将已有的SgtPeppers替换为这个类:

还可以替换为c标签写法:

也可以用索引:

通常<constructor-arg>和c-命名空间的功能是相同的,但一种情况是<constructor-arg>能实现,但c-却做不到。

现在我们将BlankDisc加入多磁道的属性,并在构造器中能注入。

package com.springinaction;

import java.util.List;

public class BlankDisc implements CompactDisc {

private String title;

private String artist;

private List tracks;

public BlankDisc(String title, String artist, List tracks ){

this.title = title;

this.artist = artist;

this.tracks = tracks;

}

@Override

public void play() {

System.out.println("Playing " + title + " by " + artist);

for (String track : tracks){

System.out.println("-Track: " + track);

}

}

}

最简单的方式是将列表设置为null

更好的解决方法是提供一个磁道名称的列表。

方案一:

Sgt. Pepper’s Lonely Hearts Club Band

With a Little Help from My Friends

Lucy in the Sky with Diamonds

Getting Better

Fixing a Hole

方案二:

假如构造器的参数还有List,那就使用元素代替。

如果构造器的参数类型是Set,可以把替换为

除了使用构造器注入,我们还可以使用属性的Setter方法进行注入。

假设注入的CDPlayer如下所示

package com.springinaction;

public class CDPlayer implements MediaPlayer {

private CompactDisc compactDisc;

public void setCompactDisc(CompactDisc compactDisc){

this.compactDisc = compactDisc;

}

@Override

public void play() {

compactDisc.play();

}

}

Spring的XML注入如下:

如果运行测试的话,它应该就能通过了。

还有用p标签的方式替代,需要先声明:

<?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:p=“http://www.springframework.org/schema/p”

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!

我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:

Dubbo面试专题

JVM面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Java并发面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Kafka面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MongDB面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MyBatis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MySQL面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Netty面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

RabbitMQ面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Redis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Spring Cloud面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

SpringBoot面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

zookeeper面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

常见面试算法题汇总专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

计算机网络基础专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

设计模式专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

转存中…(img-5ngRbERm-1712785148465)]

MyBatis面试专题

[外链图片转存中…(img-rjBTUGww-1712785148466)]

MySQL面试专题

[外链图片转存中…(img-9KfTN5ch-1712785148466)]

Netty面试专题

[外链图片转存中…(img-0Tv8ZoIe-1712785148466)]

RabbitMQ面试专题

[外链图片转存中…(img-rQgtXfEh-1712785148467)]

Redis面试专题

[外链图片转存中…(img-QBArljeX-1712785148467)]

Spring Cloud面试专题

[外链图片转存中…(img-AzlBoFXf-1712785148467)]

SpringBoot面试专题

[外链图片转存中…(img-N9yFhGuZ-1712785148467)]

zookeeper面试专题

[外链图片转存中…(img-No7Dt7hS-1712785148468)]

常见面试算法题汇总专题

[外链图片转存中…(img-SvVxogMV-1712785148468)]

计算机网络基础专题

[外链图片转存中…(img-msYxNNZX-1712785148468)]

设计模式专题

[外链图片转存中…(img-iqETFWMw-1712785148469)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-Tf219qKb-1712785148469)]

  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注册 elasticsearchRestTemplate Bean 的方法可以通过使用 spring-boot-starter-data-elasticsearch 提供的 ElasticsearchRestTemplateAutoConfiguration 类来完成。以下是一个示例: ```java import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientProperties; import org.springframework.boot.autoconfigure.elasticsearch.RestClientBuilderCustomizer; import org.springframework.boot.autoconfigure.elasticsearch.RestClientProperties; import org.springframework.boot.autoconfigure.elasticsearch.RestClientPropertiesBuilderCustomizer; import org.springframework.boot.autoconfigure.elasticsearch.RestHighLevelClientBuilderFactory; import org.springframework.boot.autoconfigure.elasticsearch.RestHighLevelClientFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; @Configuration public class ElasticsearchConfig { @Bean public ElasticsearchRestTemplate elasticsearchRestTemplate( RestHighLevelClientFactory clientFactory, RestHighLevelClientBuilderFactory clientBuilderFactory) { return new ElasticsearchRestTemplate(clientFactory, clientBuilderFactory); } @Bean public RestClientBuilderCustomizer restClientBuilderCustomizer(RestClientProperties properties) { return (builder) -> { // 自定义 RestClientBuilder 的配置 // 可以根据需要进行配置,例如设置连接超时时间、认证等 builder.setRequestConfigCallback((requestConfigBuilder) -> { requestConfigBuilder.setConnectTimeout(properties.getConnectionTimeout()); // 其他自定义配置... return requestConfigBuilder; }); }; } @Bean public RestClientPropertiesBuilderCustomizer restClientPropertiesBuilderCustomizer( ElasticsearchRestClientProperties properties) { return (builder) -> { // 自定义 RestClientProperties 的配置 // 可以根据需要进行配置,例如设置连接池大小、连接保持活动时间等 builder.setMaxRetryTimeout(properties.getMaxRetryTimeout()); // 其他自定义配置... }; } } ``` 在上述示例中,我们通过定义一个 `ElasticsearchRestTemplate` 的 bean 来注册 `elasticsearchRestTemplate`。同时,我们也可以通过自定义 `RestClientBuilderCustomizer` 和 `RestClientPropertiesBuilderCustomizer` 来对 RestClient 进行一些自定义配置。 你可以根据实际需求在 `restClientBuilderCustomizer` 和 `restClientPropertiesBuilderCustomizer` 方法中添加适当的配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值