spring学习——装配Bean
装配Spring
spring 装配的方案
Spring容器负责创建应用程序中的Bean并且通过DI(依赖注入)来协调这些对象之间的关系。你需要告诉Spring怎样创建bean和装配bean,spring主要提供了三种方法来装配:
- 在XML中进行显式配置
- 在Java中进行显式配置
- 隐式的Bena发现机制和自动装配
一,自动装配Bean
(1)自动化装配Bean
从两个方面来实现自动化的装配:
1.组件扫描:Spring还会自动扫描应用上下问中所创建的Bena
2.自动装配:spring自动满足bean之间的依赖
组件扫描和自动装配组合在一起能够发挥强大的物理,能够将显示的配置降低到最少。
例子:创建一个Compactdisc类,spring会发现它并将它创建为一个bean,然后创建一个CDPlayer类,让Spring发现它,并将CompactDisc 的Bean注入进来。
创建一个可以被发现 的Bean,创建一个接口
创建一个实现接口的类,并使用@Component注解(该注解表明改类会作为组件类,并告诉Spring要为这个类创建一个Bean)
已经创建好 了Bean,但是组件扫描默认式不开启的,我们需要创建一个配置类来开启组件扫描,
@Configuration声明这是一个配置类,@ComponentScan开启了组件扫描,默认是扫描该配置类所在的基础包里的Bean
你也可以使用XML启动组件的扫描,主要是<context:component-scan base-package="soundsystem"/>
创建一个测试类,判断是否能够发现CompaceDisc的Bean
使用了@RunWith注解中添加了Spring的SpringJUnit4ClassRunner,以便在测试开始的时候就自动创建Spring的应用上下文,
使用@ContexeConfiguration添加了CDPlayerConfig了是告诉spring要在CDPlayerConfig中加载配置,应为实在此类中添加了扫描注解@componentScan
(2)为组件扫描的bean命名
Spring 应用上下问为所有的bean都会定义个ID,如果没有指定的话,名称为将类的第一个字母变小写,如上面的SgtPeppers没有命名,则它的别名为sgtPeppers,如果要设置别名,则在@Component中设置别名,例如@Component(''lonelyHeartsClub''),还有一种注解也可以设置别名,@Named(''lonelyHeartsClub''),两者之间可以互换使用。
(3)设置组件扫描的基础包
当没有为@ComponentScan设置任何的属性时候,按照默认的规则,它会以配置类所在的包作为基础包来扫描租件,
当我们想要将配置类都放在一个包里面,使其和其他的代码区分开来,那么默认的基础包就不能满足要求了,如果要满足这样的要求,可以在@ComponentScan的Value中指名包的名称,例如@ComponentScan('soundstytem'),
如果你想更明确的指定这是基础包,可以使用basepackages属性来进行设置,例如@ComponentScan(basePackages="soundsystem"),basePackages是复数,可以指定多个基础包,例如@ComponentScan(backPackages={'soundsystem','video'})。
还有一种方法是将其指定为包中所包含的类或者接口,例如@ComponentScan(basePackageClasses={CDPlayer.class,DVDPlayer.class}),这些类所在的包会作为组件扫描的基础包。
(4)通过为Bean添加注解实现自动装配
自动装配就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在Spring应用上下问中寻找匹配某个bean需求的其他Bean,我们可以使用Spring的@Autowired来实现自动装配,例如下面
@Autowired不仅可以使用在构造器上,还可以使用在setter方法上,比如说,如果CDPlayer有一个setCompactDisc()方法,那么可以采用下面这种注解形式来进行自动装配:
@Autowired可以用在类中的任何方法上,假设类中有一个方法是insertDisc(),该注解依然可以用在上面
不管是构造器,Setter方法还是其他的方法,Spring都可以试长满足方法参数上的依赖,假如有且只有一个bean匹配满足依赖需求的话,那么这个bean将会被装配进来。假如没有匹配的bean,那么在应用上下文被创建的时候,Spring会抛出一个异常,为了避免异常的出现,可以将@Autowired的required的属性值设置为false:
将值设置为false后,Spring会市场者执行自动装配,如果没有匹配的Bean的话,就会让这个Bean处于为装配的状态,如果代码中没有进行null检查的话,这个处于为装配状态的属性有可能出现NullPointerException,如果有多个Bean都能满足依赖关系的话,Spring也会抛出一个异常。
二,通过Java代码来装配Bean
在一般的情况下,可以使用自动装配来配置Bean,但是有时候需要使用Java代码来装配Bean,例如使用第三方的类,是没有办法在它的类上使用@Component和@autowired注解的,在这种情况下,自动装配是不可以实现的,我们可以使用两种显示装配的方法来实现装配:XML和java。
在进行显示装配的时候,使用JavaConfig是最好的,JavaConfig和其他的Java代码有些不同,JavaConfig是配置代码,这意味者它没有任何的逻辑代码,通常将javaConfig放在单独的包中,使它和应用程序的逻辑分离开来。
(1)创建配置类
创建JavaConfig的关键在于要为此类加上@Configuration注解,该注解表示这个类是一个配置类,该类应该包含在Spring应用上下问中如何创建bean细节。
(2)声明简单的Bean
在JavaConfig中声明bean,我们需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean注解,例如下面这个代码声明了一个CompactDisc的bean:
@bean注解告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean,可以通过@bean的value属性给该Bean设置一个名称,例如
(3)借助JavaConfig实现注入
在Java Config中配置Bean的最简单的方法就是引用创建bean的方法,例如下面
扩展:如果有两个方法中都使用了sgtPeppers()方法,那个sgtPeppers方法使创建了多少个Bean?
答案使一个,看起来,Compactdisc使调用sgtPeppers()方法得到到,但是并非如此,因为sgtPeppers()方法上添加了@Bean注解,Spring将会拦截所有对它的调用,并确保直接返回该方法所创建的bean,并不是每次都对他进行实际的调用,假如说,你引用了其他的CDPlayerBean,它和之前那个bean完全一样,假如对sgtPeppers()方法的调用和其他的Java方法一样的话,那么每次调用都会创建一个SgtPeppers实例,在物理意义上这是有用的,例如两台播放器播放相同 的CD,每台一个CD,但是在软件领域中,我们完全可以将同一个SgtPeppers实例注入到任意数量的其他Bean中,默认情况下,Spring中的Bean都是单例的,
三,通过XML来装配bean
在Spring刚开始出现的时候,XML是配置的主要方法。
(1)创建XML配置规范
创建一个带有@Configuration的JavaConfig配置类相对于创建一个XML配置文件,并且以<beans>元素为根,例如
(2)声明一个简单的Bean
要在基于XML的Spring中声明一个bean,我们要使用另一个元素,<bean>,该元素相对于JavaConfig中的@Bean注解,
class属性值指定创建bean的类,id指定这个Bean的名称,
(3)借助构造器来注入初始化Bean