前言:上面梳理了经过注解来隐式的完成了组件的扫描和自动装配,下面来学习下如何经过显式的配置的装配bean;安全
使用场景:好比说,你想要将第三方库中的组件装配到你的应用中,在这种状况下,是没有办法在它的类上添加@Component和@Autowired注解的,所以就不能使用自动化装配的方案了。学习
在使用第三方jar包状况下,你必需要采用显式装配的方式。在进行显式配置的时候,有两种可选方案:Java和XML。在这节中,咱们将会学习如何使用Java配置,接下来的一节中将会继续学习Spring的XML配置3d
就像我以前所说的,在进行显式配置时,JavaConfig是更好的方案,由于它更为强大、类型安全而且对重构友好。由于它就是Java代码,就像应用程序中的其余Java代码同样。同时,JavaConfig与其余的Java代码又有所区别,在概念上,它与应用程序中的业务逻辑和领域代码是不一样的。尽管它与其余的组件同样都使用相同的语言进行表述,但JavaConfig是配置代码。这意味着它不该该包含任何业务逻辑,JavaConfig也不该该侵入到业务逻辑代码之中。尽管不是必须的,但一般会将JavaConfig放到单独的包中,使它与其余的应用程序逻辑分离开来,这样对于它的意图就不会产生困惑了对象
要在JavaConfig中声明bean,@Bean注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean。方法体中包含了最终产生bean实例的逻辑。blog
下面的代码声明了CompactDisc bean:自动化
默认状况下,bean的ID与带有@Bean注解的方法名是同样的。在本例中,bean的名字将会是sgtPeppers。若是你想为其设置成一个不一样的名字的话,那么能够重命名该方法,也能够经过name属性指定一个不一样的名字:重构
在JavaConfig中,如何将CompactDisc注入到CDPlayer之中?配置
例如,下面就是一种声明CDPlayer的可行方案:引用
注入过程:看起来,CompactDisc是经过调用sgtPeppers()获得的,但状况并不是彻底如此。由于sgtPeppers()方法上添加了@Bean注解,Spring将会拦截全部对它的调用,并确保直接返回该方法所建立的bean,而不是每次都对其进行实际的调用。请求
若是有多个其余的bean注入同个实例,两个CDPlayer bean会获得相同的SgtPeppers实例。以下:
默认状况下,Spring中的bean都是单例的,咱们并无必要为第二个CDPlayer bean建立彻底相同的sgtPeppers实例。因此,Spring会拦截对sgtPeppers()的调用并确保返回的是Spring所建立的bean,也就是Spring自己在调用sgtPeppers()时所建立的CompactDiscbean。所以,两个CDPlayer bean会获得相同的SgtPeppers实例。
在这里,cdPlayer()方法请求一个CompactDisc做为参数。当Spring调用cdPlayer()建立CDPlayerbean的时候,它会自动装配一个CompactDisc到配置方法之中。并且不用明确引用CompactDisc的@Bean方法。
经过这种方式引用其余的bean一般是最佳的选择,由于它不会要求将CompactDisc声明到同一个配置类之中。在这里甚至没有要求CompactDisc必需要在JavaConfig中声明,实际上它能够经过组件扫描功能自动发现或者经过XML来进行配置。你能够将配置分散到多个配置类、XML文件以及自动扫描和装配bean之中,只要功能完整健全便可。无论CompactDisc是采用什么方式建立出来的,Spring都会将其传入到配置方法中,并用来建立CDPlayer bean。