Spring提供三种装配Bean的方法:
- 自动化装配Bean
- Java 代码中显式配置Bean
- XML配置文件配置Bean
自动化装配Bean:
使用到的注解:
- @Configuration:标记在class上,表示该类是一个配置类,配置类并不参与业务逻辑,只是告诉Spring该类里面是一些配置项,比如Spring默认不开启组件扫描,可以在该类里面配置开启组件扫描
- @ComponentScan:该注解能够在Spring中开启组件扫描,标记在配置类上
- @Component:标记在class上,表示该类是一个组件类,通知Spring要为这个类创建bean
- @Autowired:标记在类的字段或者方法上,Spring会在满足依赖的情况下进行自动装配
@Configuration:
Spring自动扫描默认没有开启,所以我们需要配置开启组件扫描。当然可以通过XML文件配置,但新Spring支持Java配置。
要使用Java配置Spring需要一个配置类,这个类没有逻辑意义,只是用来配置Spring。创建配置类只需要简单的在类上使用@Configuration标记即可。
创建配置类代码:
@Configurationpublic class SpringConfig{}
@ComponentScan:
该标签可以配置在Spring中开启组件扫描。使用方法也很简单,在配置类上打上该标签即可。
@Configuration@ComponentScanpublic class SpringConfig{}
上面这种方式默认会以配置类所在的包作为基础包来扫描组件。如果想扫描不同的包或者多个包怎么办?那么就需要在注解中明确指定要扫描的包:
@ComponentScan(basePackages={"music","video"})
@Component:
我们在组件类上添加该标签通知Spring为该类创建Bean。比如我们有一个Login接口,该接口有一个LoginImpl实现,很明显,我们需要为LoginImpl配置一个Bean,使用自动装配的话只需要在LoginImpl类上添加@Component注解即可。
可能会有疑问Spring自动创建的Bean的id是什么?我应该如何获取这个Bean?Spring会将Bean的id设置为class的名字,但会将第一个字母变为小写。如下面例子,这个Bean的id则是 ”loginImpl“ 。
interface Login{ boolean isLogin();}@Componentpublic class LoginImpl implements Login{ @Override public boolean isLogin(){}}
当然可以为Bean指定名字,通过在标签中添加id字符串即可。
@Component("myLogin")
@Autowired:
该注解会根据依赖关系自动将Bean装配到相应的地方。
public class test(){ @Autowired Login login; //其他操作}
总结:
只需要使用上面的四个注解,就可以实现Spring自动装配Bean。一般情况下尽可能使用自动装配的方法,因为在项目中显式的配置越少越好。
Java 代码中显式配置Bean:
使用到的注解:@Bean
@Bean:
简单声明Bean:
注意,该注解标记在方法上,告诉Spring该方法将返回一个对象,该对象要注册为Spring应用上下文中的Bean。方法体包含最终产生bean实例的逻辑。
//这里不需要@ComponentScan注解,因为不是自动装配@Configurationpublic class SpringConfig{ //这里手动配置LoginImpl的Bean @Bean public Login loginImpl(){ return new LoginImpl(); }}
默认情况下返回的Bean的id与带有@Bean注解的方法名是一样的,上面的例子Bean的id就是 “loginImpl"。如果想设置其他id,可以重命名这个方法名即可;另一种方法就是在@Bean中指定名字:
@Bean("loginImpl2")
实现注入:
上面的例子很简单,但如果一个Bean依赖与其他对象应该如何写?比如LoginImpl依赖Identity对象。
第一种方法:
如果Identity也像loginImpl()方法一样有一个方法identityImpl()声明了Bean,那么下面这种方法可以将Identity对象装配到LoginImpl中。
@Beanpublic Login loginImpl(){ return new LoginImpl(identityImpl());
第二种方法:
@Beanpublic Login loginImpl(Identity identity){ return new LoginImpl(identity);}
这种方法是最佳的选择,因为该方法不要求Identity在配置类中有显式声明Bean的方法,Identity可以是通过自动扫描或者XML文件配置出来的Bean。当Spring调用loginImpl创建loginImpl的bean时,会自动装配一个Identity Bean进来,不管这个Identity Bean是自动装配来的还是java或者XML显式配置来的。
注意:默认情况下Spring中的Bean都是单例模式,也就是说两个IoginImpl bean会得到相同的LoginImpl实例。
总结:
在必须显示配置Bean的时候,优先选择JavaConfig配置。因为Java配置Bean的类型安全检查更加强大。
XML配置文件配置Bean:
通过XML文件装配Bean有点麻烦,可以看一看这篇资料 ----。