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 条评论
登录 后参与评论

相关文章

来自专栏Java编程技术

Go并发编程之美-互斥锁

go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CAS、原子变量操作类。相比Java来说go提供了独特的基于...

11320
来自专栏Java职业技术分享

了解一下Spring中用了哪些设计模式?这样回答面试官才稳

又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。

6300
来自专栏Java编程技术

Go并发编程之美-读写锁

go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CAS、原子变量操作类。相比Java来说go提供了独特的基于...

19220
来自专栏码匠的流水账

聊聊flink的AbstractNonHaServices

flink-runtime_2.11-1.7.1-sources.jar!/org/apache/flink/runtime/highavailability/...

14420
来自专栏米扑专栏

Clojure 学习入门(17)—— 异常处理

异常处理 Clojure代码里面抛出来的异常都是运行时异常。当然从Clojure代码里面调用的java代码还是可能抛出那种需要检查的异常的。

7720
来自专栏Java编程技术

Go并发编程之美-Load/Store操作

go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CAS、原子变量操作类。相比Java来说go提供了独特的基于...

13720
来自专栏Java编程技术

Go并发编程之美-CAS操作

go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CAS、原子变量操作类。相比Java来说go提供了独特的基于...

16420
来自专栏hadoop学习笔记

NLP自然语言处理中的hanlp分词实例

本篇分享的依然是关于hanlp的分词使用,文章内容分享自 gladosAI 的博客,本篇文章中提出了一个问题,hanlp分词影响了实验判断结果。为何会如此,不妨...

12530
来自专栏Java编程技术

Go并发编程之美-条件变量

go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CAS、原子变量操作类。相比Java来说go提供了独特的基于...

14320
来自专栏米扑专栏

Mac 高效程序猿开发必备软件

一个聪明的开发者会用合理使用工具软件来提高工作效率,MacBook Pro开发必备软件。

1.1K20

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励