Spring4.0 学习(第一天)-------自动装配Bean(@Autowired @Component @ComponentScan)

Spring中,对象无需自己查找或创建与其所关联的其他对象。相反,容器负责把需要相互协作的对象引用赋予各个对象。例如,一个订单管 理组件需要信用卡认证组件,但它不需要自己创建信用卡认证组件。订单管理组件只需要表明自己两手空空,容器就会主动赋予它一个信用卡 认证组件。

 

创建应用对象之间协作关系的行为通常称为装配(wiring),这也是依赖注入(DI)的本质。

 

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

1.  在XML中进行显式配置。

2.  在Java中进行显式配置。(类型比xml安全且强大)

3.  隐式的bean发现机制和自动装配。(建议使用)

 

自动化装配bean

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

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

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

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

 

 类上使用了@Component注解。这个简单的注解表明该类会作为组件类,并告知Spring要为这个类创建bean。

不过,组件扫描默认是不启用的。我们还需要显式配置一下Spring,从而命令它去寻找带有@Component注解的类,并为其创建bean

 

   配置类部分代码:

  我们在该类上方加上  @Configuration   注解和  @ComponentScan  注解。

   @Configuration   注解: 表明该类是一个配置类

   @ComponentScan  注解:这个注解能够在 Spring中 启用组件扫描。如果没有其他配置的话,@ComponentScan默认会扫描与配置类相同的包,以及这个包下的所有子包,查找带有@Component注解的类,并且会在Spring中自动为其创建一个bean

 

测试类部分代码:

注解@ContextConfiguration 会告诉它需要在CDPlayerConfig中加载配置。因为 CDPlayerConfig类中包含@ComponentScan

因此最终的应用上下文中应该包含 CompactDiscbean(与CDPlayerConfig在统同一包下的类)。

测试代码中有一个CompactDisc类型的属性,并且这个属性带有@Autowired注解,以便于将CompactDiscbean注入 到测试代码之中(稍后,我会讨论@Autowired)。最后,会有一个简单的测试方法断言cd属性不为null。如果它不为null的话,就意味着 Spring能够发现CompactDisc类,自动在Spring上下文中将其创建为bean并将其注入到测试代码之中。

 

为组件扫描的bean命名

Spring应用上下文中所有的bean都会给定一个ID。

Spring会根据类名为其指定一个ID。具体来讲,也就是将类名的第一个字母变为小写。

如果想为这个bean设置不同的ID,你所要做的就是将期望的ID作为值传递给@Component注解。比如说,如果想将这个bean标识为 lonelyHeartsClub

设置组件扫描的基础包

我们没有为@ComponentScan设置任何属性。这意味着,按照默认规则,它会以配置类所在的包作为基础包(base package

来扫描组件。但是,如果你想扫描不同的包,那该怎么办呢?或者,如果你想扫描多个基础包,那又该怎么办呢?

   string类型的不安全:

 除了将包设置为简单的String类型之外,@ComponentScan还提供了另外一种方法,那就是将其指定为包中所包含的类或接口:

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

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

考虑程序清单2.6中的CDPlayer类,它的构造器上添加了@Autowired注解,这表明当Spring创建CDPlayerbean的时候,会通过

这个构造器来进行实例化并且会传入一个可设置给CompactDisc类型的bean

  @Autowired注解不仅能够用在构造器上,还能用在属性的Setter方法上。比如说,如果CDPlayer有一个setCompactDisc()方法,那么可以采用如下的注解形式进行自动装配:

Spring初始化bean之后,它会尽可能得去满足bean的依赖,在本例中,依赖是通过带有@Autowired注解的方法进行声明的,也就是setCompactDisc()

实际上,Setter方法并没有什么特殊之处。@Autowired注解可以用在类的任何方法上。假设CDPlayer类有一个insertDisc()方法,那么@Autowired能够像在setCompactDisc()上那样,发挥完全相同的作用:

不管是构造器、Setter方法还是其他的方法,Spring都会尝试满足方法参数上所声明的依赖。假如有且只有一个bean匹配依赖需求的话,那么这个bean将会被装配进来。

如果没有匹配的bean,那么在应用上下文创建的时候,Spring会抛出一个异常。为了避免异常的出现,你可以将@Autowiredrequired性设置为false

required属性设置为false时,你需要谨慎对待。如果在你的代码中没有进行null检查的话,这个处于未装配状态的属性有可能会

出现NullPointerException。 如果有多个bean都能满足依赖关系的话,Spring将会抛出一个异常,表明没有明确指定要选择哪个bean进行自动装配。(稍后博文写自动装配歧义性)

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值