您的位置:首页 > 编程语言 > Java开发

Spring入门之bean装配

2017-01-16 16:02 253 查看

1、Spring配置的可选方案:

a、在XML中进行显示配置;

b、在Java中进行显示配置;

c、隐式的bean发现机制和自动配置。

这三种方式可以自由选择,并且也可以相互搭配。

即便如此,建议是尽可能地使用自动配置的机制。显示配置越少越好。当必须要显示配置bean的时候,推荐使用类型安全并且比xml更加强大的JavaConfig。最后,只有当你想要使用便利的xml命名空间,并且JavaConfig中没有同样的实现时,才能使用xml。

2、自动化装配bean

在便利性方面,最强大的还是Spring的自动化配置,如果Spring能够进行自动化装配的话,那何苦还要显示地将这些bean装配在一起呢?Spring从两个角度来实现自动化装配:

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

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

组件扫描和自动装配组合在一起就能发挥出强大的威力,他们能够将你的显示配置降低到最少。

所有带有@Component注解的类都会创建bean,只添加一行@ComponentScan注解就能自动创建无数个bean。

3、为bean命名的方法

@Component("lonelyHeartsClub")
public class SgtPeppers implements CompactDisc{
......
}


4、设置组件扫描的基础包,指定想要加载的基础包

@Configuration
@ComponentScan("com.soundsystem")
public class CDPlayerConfig{
......
}


你可能注意到了,配置类所在的包可能不止一个,那么如何指定多个配置包呢?

类:CDPlayerConfig

@Configuration
//指定多个基础扫描包,自动扫描这些包下带有注解的bean
@ComponentScan(basePackages={"soundsystem","video"})
public class CDPlayerConfig{}


5、通过为bean添加注解实现自动配置

简单来说,自动装配就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在Spring应用上下文中寻找匹配某个bean需求的其他bean。为了声明要进行自动装配,我们可以借助Spring的@Autowired注解。

@Autowired注解不仅能够用在构造器上,还能用在属性的setter方法上。在Spring初始化bean之后,它会尽可能得去满足bean的依赖,在类中通过@Autowired注解来装配和注入其他bean。

@Autowired注解有required属性,当该属性为false时,Spring会尝试执行自动装配,但是如果没有匹配的bean的话,Spring将会让这个bean处于未装配状态,如果没有该属性,则会抛出一个异常。

如果有多个bean都满足依赖关系的话,Spring将会抛出一个异常,表明没有明确指定要选择哪个bean进行自动装配。

6、通过Java代码装配bean

尽管在很多场景下通过组件扫描和自动装配实现Spring的自动化配置是更为推荐的方式,但有时候自动化配置方案行不通,因此需要明确配置Spring。比如说,你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component和@Autowired注解的,因此就不能使用自动化装配方案了。在这种情况下,必须要采用显示装配方式。在进行显示装配的时候,可选方案有两种:Java和Xml。

在进行显示配置时,JavaConfig是更好的方案,因为它更为强大、类型安全并且对重构友好。JavaConfig同其他Java代码不同,它是配置代码,这意味着它不应该包含任何业务逻辑,也不应该侵入到业务逻辑代码之中。通产会将JavaConfig放到单独的包中,使它与其他的应用逻辑分离开来,这样对于它的意图就不会产生困惑了。

创建配置类:

@Configuration
public class CDPlayerConfig{}


创建JavaConfig类的关键在于为其添加@Configuration注解。@Configuration注解表明这个类是一个配置类,该类应该包含Spring应用上下文中如何创建bean的细节。在上面的例子中,我们是依靠组件扫描来发现Spring应该创建的bean。尽管我们可以同时使用组件扫描和显示配置,但本节中我们更加注重显示配置。因此我们将CDPlayerConfig的@ComponentScan注解移除掉。

除了@ComponentScan注解,此时的CDPlayerConfig类就没有任何作用了。

6.1声明简单的bean

要在JavaConfig中声明bean,我们需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean注解。比如说,下面的代码声明了CompactDist bean:

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


@Bean注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean。方法体中包含了最终产生bean实例的逻辑。默认情况下,bean的ID与带有@Bean注解的方法名是一样的。在本例中,bean的名字将会是sgtPeppers。如果想设置为其他名字,可以重命名该方法,也可以通过name属性指定一个不同的名字:

@Bean(name="lonlyHeartClubBand")
public CompactDisc sgtPeppers(){
return new SgtPeppers();
}


不管采用什么方法来为bean命名,bean声明都是非常简单的。方法体返回了一个新的SgtPeppers实例。这里是使用Java来进行描述的,因此我们可以发挥Java提供的所有功能,例如你想要随机播放一首CD,那么在方法体中加入随机逻辑即可,只要最终生成一个CompactDisc实例就可以。(原来这就是基于Java配置的强大点之一啊!)

6.2基于Java配置的bean注入

我们前面所声明的CompactDisc bean是非常简单的,它自身没有其他的依赖。但现在,我们需要声明CDPlayer bean,它依赖于CompactDisc。在JavaConfig中装配bean的最简单方式就是引用创建bean的方法。下面就是一种声明CDPlayer的可行方案:

@Bean
public CDPlayer cdPlayer(){
return new CDPlayer(sgtPeppers());//注入bean
}


这种方式有两个局限:sgtPeppers()必须和cdPlayer()同样被Java配置所创建,并且要位于同一个配置类中。

还有一种理解起来更为简单的方式:

@Bean
public CDPlayer cdPlayer(CompactDisc cd){
CDPlayer cdPlayer= new CDPlayer();
player.setCompactDisc(cd);
return cdPlayer;
}


在这里,cdPlayer()方法请求一个CompactDisc作为参数。当Spring调用cdPlayer()创建CDPlayer bean的时候,它会自动装配一个CompactDisc到配置方法中。然后,方法体就可以按照合适的方式来使用它了。借助这种技术,不用明确引用CompactDisc的@Bean方法。

通过这种方式引用其他的bean通常是最佳的选择,因为它不会要求将CompactDisc声明到同一个配置类中。在这里甚至没有要求CompactDisc必须要在JavaConfig中声明,实际上它可以通过组件扫描功能自动发现或者通过xml来进行配置。不管CompactDisc是采用什么方式创建出来的,Spring都会将其传入到配置方法中。

7、通过xml装配bean

本节的内容应该只是用来帮助维护已有的xml配置,在完成新的Spring工作时,应该使用自动化配置和JavaConfig。

在使用xml为Spring装配bean之前,你需要创建一个新的配置规范。在使用JavaConfig的时候,这意味着要创建一个带有@Configuration注解的类,而在XML配置中,这意味着要创建一个XML文件,并且要以元素为根。作为起步,在JavaConfig中所需的只是@Configuration,但在使用XML时,需要在配置文件顶部声明多个XML模式(XSD)文件,这些文件定义了配置Spring的XML元素。

小技巧:借助Spring Tool Suite 创建XML配置文件: 创建和管理Spring XML配置文件的一种简便方式是使用Spring Tool Suite(https://spring.io/tools/sts )。在Spring Tool suite的菜单中,选择File>New>Spring Bean Configuration File,能够创建Spring XML 配置文件,并且可以选择可用的配置命名空间。

c命名空间可以简化构造器注入;p命名空间可以讲话属性(Setter)注入。

8、导入和混合配置

在典型的Spring应用中,我们会同时使用自动化和显式配置。几遍你更喜欢通过JavaConfig实现显式配置,但有的时候XML确实最佳的方案。在Spring中各种配置方案都是不排斥的。

8.1在JavaConfig中引用XML配置

首先让我们想想,在一个真正的项目中,配置类可能不止一个,那么我们要怎么在一个配置类中引用另一个配置类中定义的bean呢?答案是使用@Import注解。例如:

CDConfig类:

@Configuration
public class CDConfig{
.......
}


CDPlayerConfig类:

@Configuration
@Import(CDConfig.class)        //引入另一个配置类
public class CDPlayerConfig{
........
}


或者采用一个更好的办法,也就是不在CDPlayerConfig中使用@Import,而是创建一个更高级别的SoundSystemConfig,在这个类中使用@Import将两个配置类组合在一起。

@Configuration
@Import({CDPlayerConfig.class,CDConfig.class})  //一数组的形式组合JavaConfig类
public class SoundSystemConfig{
}


那么如果我们要在JavaConfig类中引用在XML中配置的bean又应该怎么做呢?答案是使用@ImportResource注解。假设BlankDisc定义在名为cd-config.xml的文件中,该文件位于根类路径下,那么可以修改SoundSystemConfig,让它使用@ImportResource注解,如下所示:

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


在XML配置中引入JavaConfig配置的bean。

<bean class="soundsystem.CDConfig"/>


不管使用JavaConfig还是使用XML进行配置,通常应该创建一个跟配置类组合其他各种配置,同时也应该在根配置中启用组件扫描(通过
<context:component-scan>
或@ComponentScan)。

9、小结

Spring框架的核心是Spring容器。容器负责管理应用中组件的生命周期,它会创建这些组件并且保证它们的依赖能够得到满足,这样的话,组件才能完成预定的任务。

Spring中装配bean有三种主要方式:自动化配置、基于Java的显示配置以及基于XML的显式配置。建议尽可能使用自动化配置,以免显示配置所带来的维护成本。但是,如果确实需要使用显式配置的话,应该优先选择基于Java的配置,它比基于XML的配置更加强大、类型安全并且易于重构。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: