在没有任何附加的条件下,Spring创建对象的方式是单例模式,也就是说不管在什么地方注入多少次,使用的都是同一个bean。有时候这种模式并不能满足我们的需求。
@Scope注解可以声明创建bean的方式,以及bean的作用域。它可以与@Bean、@Component注解一起使用。看个例子:
//ConfigurableBeanFactory.SCOPE_PROTOTYPE:原型模式,每次注入bean时都重新创建对象 //ConfigurableBeanFactory.SCOPE_SINGLETON:单例模式,上下文中永远只有一个bean @Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) Homework homework(){ return new Homework("1+2 = ?"); }
另外,在一些应用场景下,我们会希望bean是有作用范围的。比如说:购物车对象,每个用户都应该有属于自己的购物车,并且每次web会话中,购物车是不变的。对于一个用户来说,每个对购物车的添加、删除商品操作都是同一个购物车,而每个用户只能操作自己的购物车。
这就不得不提一下@Scope的另外的参数:WebApplicationContext.SCOPE_SESSION、WebApplicationContext.SCOPE_REQUEST。使用这两个值作为@Scope的参数,会创建出基于会话的bean、基于请求的bean。即每个会话创建一个bean、每个请求创建一个bean。当然了,对于web应用来说,光指定这个参数还不够还需要设置@Scope的proxyMode属性。就像下图的例子:
你有没有想过将外部配置文件的字段注入到bean的属性里面?比如数据库信息。Spring为这提供了很好的实现方式:创建一个PropertySourcesPlaceholderConfigurer 类的bean,同时给它设定你的.properties文件的位置,就可以通过"${xxx.xxx}"占位符的方式访问了。对于这块如果看得有点迷糊,你可以在网上找一些例子,其实很简单,或者在评论区给我留言。
如果这篇文章有帮到你,欢迎收藏、关注、点赞。