第2章 装配bean

Posted xzcode

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第2章 装配bean相关的知识,希望对你有一定的参考价值。

Spring 容器负责创建应用程序中的 bean 并通过 DI 来协调这些对象之间的关系。但是,作为开发人员,你需要告诉 Spring 要创建哪些 bean 并且如何将其装配在一起。当描述 bean 如何进行装配时, Spring 具有非常大的灵活性,它提供了三种主要的装配机制:

  • 在 XML 中进行显式配置。

  • 在 Java 中进行显式配置。

  • 隐式的 bean 发现机制和自动装配。

2.1 自动化装配bean

Spring 从两个角度来实现自动化装配:

  • 组件扫描( component scanning ): Spring 会自动发现应用上下文中所创建的 bean 。

  • 自动装配( autowiring ): Spring 自动满足 bean 之间的依赖。

 

给相应的类加上@Component注解

在实现类上加入@Component注解,这个注解相当于一个标记,告诉spring需要创建这个类的实例并管理起来。

 

@Component
public class UserImpl implements User{
   
}

 

在spring配置类中启用自动扫描@ComponentScan

@Configuration
@ComponentScan
public class Config{
    
}

 

::: tip 注意

如果没有其他配置的话, @ComponentScan 默认会扫描与配置类相同的包。Spring也会扫描这个包以及这个包下的所有子包,查找带有 @Component 注解的类。如果你更倾向于使用 XML 来启用组件扫描的话,那么可以使用 Spring context 命名空间的 <context:component-scan> 元素。

:::

我们可以手动的设置要扫描的包@ComponentScan(basePackages="包名"),如果我们要扫描多个包@ComponentScan(basePackages={"包名",...,"包名"})。当让以上方式是通过字符串形式,还有一种方式采用basePackageClasses进行配置,例如@ComponentScan(basePackageClasses=User.class)@ComponentScan(basePackageClasses={User.class}),我个人比较喜欢第二种方式。

 

使用spring管理的bean,使用@Autowired注解

使用Autowired注解,spring会把前面管理生成的实例,自动赋值到你声明的属性上。

@Service
public class UserServiceImpl implements UserService{
    @Autowired
    private User user;
}

 

::: tip 注意

@Autowired 注解不仅能够用在构造器上,还能用在属性的 Setter 方法上。实际上, Setter 方法并没有什么特殊之处。 @Autowired 注解可以用在类的任何方法上。

:::

2.2 通过java代码装配bean

创建配置类

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

@Configuration
public class SpringConfig{
    
}

 

::: tip 注意

我们可以同时使用组件扫描和显式配置

:::

声明简单的Bean

@Bean注解会告诉 Spring 这个方法将会返回一个对象,该对象要注册为 Spring 应用上下文中的 bean 。

@Bean
public CompactDisc sgtPeppers(){
    return new SgtPeppers();
}

 

::: tip 注意

默认情况下, bean 的 ID 与带有 @Bean 注解的方法名是一样的。在本例中, bean 的名字将会是 sgtPeppers 。如果你想为其设置成一个不同的名字的话,那么可以重命名该方法,也可以通过 name 属性指定一个不同的名字:@Bean(name="sgtPeppers")。如果一个接口有一个实例,则bean的id可能作用不是太明显,不重复即可,但是如果有多个实例,就需要手动指定注入的bean是哪个了。

:::

借助JavaConfig实现注入

@Bean
public CDPlayer cdPlayer(){
    return new CDPlayer(sgtPeppers());
}

 

::: tip 注意

看起来, CompactDisc 是通过调用 sgtPeppers() 得到的,但情况并非完全如此。因为 sgtPeppers() 方法上添加了 @Bean 注解, Spring将会拦截所有对它的调用,并确保直接返回该方法所创建的 bean ,而不是每次都对其进行实际的调用。

:::

 

2.3 通过XML装配bean

这里介绍xml就采用相对简单的思路介绍了,建议xml如果要手动编辑的话,就直接上spring文章中复制吧,或者借助于sts之类的工具,这样确保不会出错是不。

声明bean

<bean class="soundsystem.SgtPeppers"/>

 

本来想写的,想了想还是看文档吧,这里就不整理了,只是稍微提一下思路。

 

2.4 导入和混合配置

在JavaConfig中引用XML配置

JavaConfig引用其它JavaConfig

@Configuration
@Import(CDConfig.class)
public class Config{}

 

JavaConfig引用xml配置文件

@Configuration
@ImportResource("classpath:cd-config.xml")
public class Config{}

在XML配置中引用JavaConfig

在XML中引用JavaConfig

<bean class="config.CDConfig"/>

 

在XML中引用XML

<import resource="cdplayer-config.xml"/>

 

以上是关于第2章 装配bean的主要内容,如果未能解决你的问题,请参考以下文章

SpringInAction读书笔记--第2章装配Bean

第2章—装配Bean—自动化装配Bean

第2章—装配Bean—通过XML装配Bean

第2章 装配bean

《Spring实战》 1-2

第3章 高级装配