本文介绍了sping in action之bean装配,内容包括自动扫描、Java代码装配、xml装配、选择哪种装配方式最合适以及项目中犯过的错误等。
sping in action之bean装配
- 自动扫描
- Java代码装配
- xml装配
- 选择哪种装配方式最合适?
- 项目中犯过的错误
自动扫描
User类
ComponentScan注解在spring中启用组件扫描,默认扫描与配置类相同的包,查找带有Component注解的类。也可以通过xml配置启用组件扫描。1
2
3
4
5
6
7package spring.di.componentScan.dto;
@Configuration
@ComponentScan
public class User {
}
Role类
Component注解表明该类会作为组件类,并告知spring要为这个类创建bean。
1 | package spring.di.componentScan.dto; |
测试类
1 | @RunWith(SpringJUnit4ClassRunner.class) |
单元测试能够通过,成功创建了Role的bean实例,默认的实例ID为role,也就是将类名的第一个字母变为小写,可以使用@Component(“reNameRole”)将ID修改为reNameRole。
这种方式需要在类上添加@Component和@Autowired注解,如果需要将第三方库中的组件装配到应用中,就需要采用显示装配方式:JavaConfig装配或xml装配。
JavaConfig装配
User类
Configuration注解表明该类是一个配置类,应该包含在spring应用上下文中如何创建bean的细节。可以将配置类放到单独的包中,使它与业务逻辑分离开。
Bean注解告诉spring,这个方法将会返回一个对象,该对象要注册为sprig应用上下文中的bean。
bean的默认ID与方法名一样,本例中bean的ID为getRole,可以使用@Bean(“reNameRole”)将ID修改为reNameRole。
1 | @Configuration |
Role类1
2
3public class Role{
}
xml装配
User类
1 | package spring.di.xml.dto; |
Role类
1 | package spring.di.xml.dto; |
xml配置
这里显示地设置了bean的ID,如果没有明确给定ID,默认的ID将会是spring.di.xml.dto.Role#0。
1 | <?xml version="1.0" encoding="UTF-8"?> |
测试类
1 | @RunWith(SpringJUnit4ClassRunner.class) |
选择哪种装配方式最合适?
根据项目的具体情况来选择,三种装配方式也可以相互搭配使用。我目前所在项目组使用自动装配与xml装配相结合的方式,《spring in action》作者给出了如下建议:
尽可能地使用自动装配,显示配置越少越好。当必须使用显示配置时(比如,有些源码不是由你来维护,而你需要为这些代码配置bean时),推荐使用类型安全并比xml更加强大的JavaConfig装配。最后,只有当你想要使用便利的xml命名空间,并且在JavaConfig中没有同样的实现时,才应使用xml。
项目中犯过的错误
因为对bean装配以及bean的默认ID理解不清楚,在项目中犯过一个错误。
通过xml配置的方式导入RoleService服务,UserService服务根据ID为”roleService”从上下文获取bean,但是获取的bean为null。
如果对bean装配的三种方式理解清楚的话,很容易知道,通过xml配置的方式装配bean时,默认ID为spring.di.sysconfig.service.RoleService#0,所以通过AppContext.getBean(“roleService”)方式获取的bean必定会为null。
UserService类
1 | @Component |
xml配置
1 | <?xml version="1.0" encoding="UTF-8"?> |