Spring Bean的装配(非XML文件方式)

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标记即可。

创建配置类代码:

@Configuration
public class SpringConfig{
}

@ComponentScan:

该标签可以配置在Spring中开启组件扫描。使用方法也很简单,在配置类上打上该标签即可。

@Configuration
@ComponentScan
public 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();
}

@Component
public 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注解,因为不是自动装配
@Configuration
public 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中。

@Bean
public Login loginImpl(){
    return new LoginImpl(identityImpl());

第二种方法:

@Bean
public 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有点麻烦,可以看一看这篇资料 ----https://www.jb51.net/article/126458.htm

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值