Spring实战-装配Bean

本文详细介绍了Spring框架中的自动装配和组件扫描机制。通过创建接口和其实现类,展示了@ComponentScan注解在扫描组件时的作用,以及如何通过XML配置文件进行组件扫描。此外,还探讨了@Autowired注解在构造器和setter方法上的使用,以及如何通过JavaConfig配置类和XML配置文件创建和注入bean。文章最后提到了不同方式装配bean的特点和注意事项。
摘要由CSDN通过智能技术生成

自动化装配bean

1.创建CompactDisc接口

package soundsystem;
public interface CompacDisc {
    void play();
}

2.创建CompactDisc接口的实现类SgtPeppers
@Component:注解表明该类会作为组件类

package soundsystem;
import org.springframework.stereotype.Component;
@Component
public class SgtPeppers implements CompactDisc{
    private String title ="Sgt.Pepper's Lonely Hearts Club Band";
    private String artist="The Beatles";
    @Override
    public void play() {
        System.out.println("Playing "+ title +" by "+artist);
    }
}

3.创建配置类CDPlayerConfig ,开启组件扫描
@Configuration:表明这个类是一个配置类
@ComponentScan:注解能够在Spring中启用组件扫描,默认会扫描预配置类相同的包以及这个包下的所有子包

package soundsystem;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class CDPlayerConfig {
}

4.创建测试方法

 @Test
    public void test01(){
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(CDPlayerConfig.class);
        SgtPeppers bean = app.getBean(SgtPeppers.class);
        bean.play();
    }

5.运行结果
在这里插入图片描述
spring会自动发现应用上下文中所创建的bean
也可以更换第三个步骤改为xml文件扫描
3.2在resources文件目录下创建spring01.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: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 https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="soundsystem"/>
</beans>

4.2创建测试方法

 @Test
    public void test02(){
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("spring01.xml");
        SgtPeppers bean = app.getBean(SgtPeppers.class);
        bean.play();
    }

5.2运行结果
在这里插入图片描述

为组件扫描的bean命名

@Component注解中的value值用来给bean命名
在这里插入图片描述

设置组件扫描的基础包

@ComponentScan注解中有一个basePackages属性用来指定要进行扫描的组件的位置(包路径),可以观察到类型String[]所以可以包含多个路径
在这里插入图片描述
@ComponentScan注解中有一个basePackageClasses属性,属性所设置的数组中包含的类将会作为组件扫描的基础包
在这里插入图片描述

通过为bean添加注解实现自动装配

在这里插入图片描述

CDPlayer类,在构造器上添加了@Autowired注解,表明spirng在创建CDPlayerbean的时候会通过这个构造器来进行实例化并且会传入一个可设置CompactDisc类型的bean
创建测试方法:

@Test
    public void test03(){
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(CDPlayerConfig.class);
        CDPlayer bean = app.getBean(CDPlayer.class);
        bean.play();
    }

运行结果:
在这里插入图片描述
@Autowired注解还能在属性的Set方法上如果CDPlayer有一个setCompactDisc()方法,那么可以采用以下形式进行装配,
在这里插入图片描述

创建测试方法:

 @Test
    public void test04(){
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(CDPlayerConfig.class);
        CDPlayer bean = app.getBean(CDPlayer.class);
        bean.play();
    }

运行结果:
在这里插入图片描述

如果没有匹配的bean,在应用上下文创建的时候会抛出异常,但是为了避免异常,@Autowired注解中的required属性,当属性设置为false时spring会尝试执行自动装配,但是如果没有匹配的bean的话Spring会将这个bean处于未装配的状态而不会报错,但有可能会报空指针异常(NullPointerException),如果有个多个bean满足条件,会产生歧义,spring将会抛出异常。

通过Java代码装配bean

创建配置类(JavaConfig)
@Configuration
public class CDPlayerConfig {
}
声明简单的bean

在JavaConfig中声明bean,编写有一个方法,这个方法创建所需类型的实例,在方法上面添加@Bean注解,@Bean注解会告诉Spring这个方法将返回一个都西昂,该对象要注册为spring应用上下文中的bean。方法体重包含了产生bean实例的逻辑。
在这里插入图片描述
默认情况下bean的ID与带有@Bean注解的方法名是一样的。
也可以通过Bean注解中的name属性指定一个bean的ID。
在这里插入图片描述

借助JavaConfig实现注入

创建一个方法(cdPlayer)
在这里插入图片描述
cdPlayer()方法像sgtPeppers()方法一样,同样使用了@Bean注解,这表明这个方法会创建一个bean实例并将其注册到Spring应用上下文中,创建的beanID为cdPlayer。
看起来,CompactDisc是通过调用sgtPeppers()得到的,但情况并非完全如此,因为sgtPeppers()方法上添加了@Bean注解,Spring将会拦截所有对他的调用,并确保直接返回该方法所创建的bean,而不是每次都对其进行实际的调用。
在创建一个方法(anotherCDPlayer)
在这里插入图片描述
如果在java方法调用的话那么上述两个方法都会一个自己特有的SgtPeppers实例。
但是在spring中默认情况下bean都是单例的,spring会拦截对sgtPeppers()的i盗用并确保返回的是Spring所创造的bean,也就是Spring本身在调用sgtPeppers()时所创建的CompactDisc的bean。因此两个CDPlayer bean会的到相同的SgtPeppers实例。
创建一个方法:
在这里插入图片描述
在这里,cdPlayer()方法请求一个CompactDisc作为参数。当Spring调用这个方法创建CDPlayer bean的时候,他会自动装配一个CompactDisc到配置方法的参数中。

通过XML代码装配bean

创建一个Spirng配置文件
在这里插入图片描述

声明一个简单的bean

在XML的Spring配置中声明一个bean
在这里插入图片描述
这个bean的类通过class属性来制定的,并且需要用全限定类名。
如果没有明确给定ID,所以这个bean将会个那句全限定类名进行命名,例如soundsystem.SgtPeppers#0 ,其中 #0 是一个计数的形式,用来区分相同类型的其他bean。如果声明了另一个SgtPeppers,并且没有明确ID,那么它自动的到的ID将会是soundsystem.SgtPeppers#1
在这里插入图片描述
也可以通过借助id属性,为每一个bean设置一个你自己选择的id

借助构造器注入初始化bean

在这里插入图片描述
当Spring遇到这bean元素时,它会创建一个CDPlayer实例。并且
constructor-arg 元素会告知Spring要将一个id为compactDisc的bean引用传递到CDPlayer的构造其中。
也可以用c-命名空间(spring3.0中引入的)要使用的话,必须在XML的顶部声明其模式:
在这里插入图片描述
在这里插入图片描述
属性名以c:开头也就是命名空间的前缀。接下来就是要装配构造器参数名,在此之后是”-ref“,这是一个命名的约定,它会告诉Spring,正在装配的是一个bean的引用,这个bean的名字是compactDisc,而不是字面量。
在这里插入图片描述
也可以将参数名称替换成0,也就是参数的索引
将字面量注入到构造器中
创建一个类
在这里插入图片描述
在这里插入图片描述
使用了 value属性而不是ref,通过该属性表明给定的值要以字面量的形式注入到构造器之中。
在这里插入图片描述
可以观察装配字面量与装配引用的区别在于属性名中去掉了-ref,类似的我们也可以用索引装配相同的字面量
装配集合
在这里插入图片描述

在这里插入图片描述
list元素是constructor-arg的子元素,这表明是一个包含值的列表将会传递到构造其中,其中value属性用来指定列表中的每一个元元素。
类似,也可以使用ref元素代替value实现bean引用列表的装配
在这里插入图片描述
在这里插入图片描述
也可以按照同样的方式使用set元素
在这里插入图片描述
constructor-arg比c命名空间的属性更有优势,目前使用c命名空间的属性无法实现装配集合的功能

在这里插入图片描述在这里插入图片描述
spring在创建bean的时候不会有任何问题,但是当要调用play()方法是会报空指针异常因为我们并没有注入CDPlayer的compactDisc属性。
在这里插入图片描述
property元素为属性的Setter方法所提供的功能。
Spring提供了更加间接的p-命名空间来作为property元素的替代方案,在使用p命名空间的时候必须要在xml文件中对其进行声明
在这里插入图片描述
p命名空间按照以下方式装配compactDisc属性
在这里插入图片描述
p命名空间的属性组成

在这里插入图片描述
将字面量注入到属性中
创建实体类
在这里插入图片描述

在这里插入图片描述
这里除了使用property元素的value属性来设置title和arlist属。

另一种可选方案就是使用p-命名空间的属性来完成该功能:
在这里插入图片描述
在这里插入图片描述
p-命名空间也不能用来装配集合。

我们可以使用Spring util-命名空间中的一些功能简化BlankDIsc bean
首先需要在XMl中声明util-命名空间及其模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

导入混合配置

在javaConfig中引用XML配置

在这里插入图片描述
在CDPlayerCOnfig中使用@Import注解导入CDconfig
在这里插入图片描述
或者采用更好的办法,也就是不在CDPlayerConfig中使用@Import,而是创建一个更高级别的SoundSystemConfig,在这个类中使用@Import将两个配置类组合在一起
在这里插入图片描述
如果希望通过XML来配置BlankDisc
在这里插入图片描述
那么如何让Spring同时加载它和其他基于Java的配置呢
答案是@ImportResource注解,假设BlankDisc定义在命名为cd-config.xml文件中,那么可以修改SoundSystemConfig,让他使用@ImportResource注解
在这里插入图片描述
在这里插入图片描述

在XML配置中引用JavaConfig

在XML中,我们可以使import元素来拆分XML配置

假设希望将BlankDisc bean拆分到自己的配置文件中,该文件命名为cd-config.xml,我们可以在XML配置文件中使用import元素来引用改文件。
现在,我们假设不在将BlankDisc配置在XML之中,而将其配置在JavaConfig中,CDplayer则继续配置在XML中,基于XML配置该如何引用一个JavaConfig类?
为了将JavaConfig类导入到XMl配置中,我们可以这样声明bean

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值