后面的文章,咱们介绍了 Bean 的申明与注入,对于 Bean 还有一些辅助性注解是十分重要的,本文,咱们重点聊聊这些辅助性注解。

@Scope

@Scope 用于指定 Bean 的作用域。

比方,通过 @Scope 能够标注 Bean 的作用域为 singleton(这也是 Spring Bean 的默认作用域),如上面代码失去的 Bean 就是单例的:

@Configurationpublic class BeanConfig {    @Bean    @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)    public MyBean singletonBean() {        return new MyBean();    }}

也能够通过 @Scope 标注 Bean 的作用域为 prototype,上面代码失去的 Bean 是多例的(每次拜访都会获取一个新的对象):

@Configurationpublic class BeanConfig {    @Bean    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)    public MyBean prototypeBean() {        return new MyBean();    }}
@Componentpublic class GetBeanTest {    @Autowired    private ScopeBeanConfig scopeBeanConfig;    @EventListener    private void getBeans(ApplicationReadyEvent event) {        MyBean singletonBean1 = scopeBeanConfig.singletonBean();        MyBean singletonBean2 = scopeBeanConfig.singletonBean();        MyBean prototypeBean1 = scopeBeanConfig.prototypeBean();        MyBean prototypeBean2 = scopeBeanConfig.prototypeBean();        System.out.println("singletonBean1 与 singletonBean2 是同一个对象: " + ((singletonBean1.equals(singletonBean2) ? "是" : "不是")));        System.out.println("prototypeBean1 与 prototypeBean2 是同一个对象: " + (prototypeBean1.equals(prototypeBean2) ? "是" : "不是"));    }}

下面代码演示了屡次申请获取同一个 Bean 时,失去的对象是否是同一个,它的输入后果为:

singletonBean1 与 singletonBean2 是同一个对象: 是prototypeBean1 与 prototypeBean2 是同一个对象: 不是

@Scope 除了能定义这两种作用域,对于 Web 利用,还能定义以下三种作用域:request、session、application,示意对象的生命周期是在申请内、会话内,还是在利用内。上面是具体的代码例子:

public class ScopeBeanConfig {    @Bean    @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)    public MyBean requestBean() {        return new MyBean();    }    @Bean    @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)    public MyBean sessionBean() {        return new MyBean();    }    @Bean    @Scope(value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS)    public MyBean applicationBean() {        return new MyBean();    }}

须要留神的是,这三种作用域的 Bean,定义时 proxyMode 是必须要指定的,否则利用启动时将抛出异样。另外,下面几个作用域的标注,也能够用上面几个注解代替:

public class ScopeBeanConfig {    @Bean    @RequestScope    public MyBean requestBean2() {        return new MyBean();    }    @Bean    @SessionScope    public MyBean sessionBean2() {        return new MyBean();    }    @Bean    @ApplicationScope    public MyBean applicationBean2() {        return new MyBean();    }}

@Lazy

@Lazy 用于指定 Bean 的提早加载,即用 @Lazy 标注过的 Bean 不会在利用启动的时候就初始化,会提早到须要用到的时候才初始化。示例代码如下:

@Component@Lazypublic class MyLazyBean {    public MyLazyBean() {        System.out.println("init MyLazyBean");    }}

须要留神的是,如果代码的某处注入了该 Bean,那么只有注入该 Bean 的类在利用启动时被初始化了,该 Bean 也会在此时被初始化(主动注入时会创立该 Bean 的对象),如:

@Autowiredprivate MyLazyBean myLazyBean;

如果要保障该 Bean 的确能够提早加载,能够应用上面的办法获取:

@Autowiredprivate ApplicationContext applicationContext;...applicationContext.getBean(MyLazyBean.class);

@DependsOn

@DependsOn 用来指定 Bean 之间的依赖关系,如上面的例子:

@Component@DependsOn({"myDependsOnBeanB"})public class MyDependsOnBeanA {    public MyDependsOnBeanA() {        System.out.println("init MyDependsOnBeanA");    }}
@Componentpublic class MyDependsOnBeanB {    public MyDependsOnBeanB() {        System.out.println("init MyDependsOnBeanB");    }}

myDependsOnBeanA 依赖于 myDependsOnBeanB,因而它会在 myDependsOnBeanB 加载实现之后才被加载。

@Primary

@Primary 用于指定依赖注入的首选 Bean,即指定有多个类型雷同的 Bean 时,优先注入的是哪个。对于 @Primary 的用法,在上一篇文章中曾经介绍,本文不再赘述。

总结

本文次要解说了 Spring Bean 的几个附加注解的应用办法,它们都是咱们平时开发中比拟罕用的几个注解,心愿这些常识对读者会有所帮忙。