spring的scope为prototype的bean的正确使用方法

Easter79
• 阅读 598

spring的bean的作用域有singleton,prototype,session,request等,本来以为很简单,但实际面试中,90%的人根本就不知道如何使用,其中不乏工作5,6年以上的,只知道有这几个作用域,这考验java开发人员de基础。

很多人看教程里面,使用prototype作用域的bean代码里面,获取bean的方法都是用appContext.getBean方法获取,但实际工作编码中,我们一般是通过方法的参数注入。

@Service
@Scope(value="prototype")
public class MainServices 

如下,每次注入新的MainServices实例:

@GetMapping("/test3")
public HashMap<String, Object> test2(@Autowired MainServices s) {
}

但要在一个controller里面注入一个多例的service需要怎么实现?(工作中不应该这样用,而是应该通过参数注入)

如下:

@RestController
public class MainController {
    @Autowired
    MainServices services;
}

很明显controller只有一个,service也有只一个,这样定义是不能达到效果的!自己测试一下就知道。

正确的方法是如下,需要指定使用代理,如果注入的是接口可以用INTERFACES,否则用TARGET_CLASS。

@Service
@Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class MainServices 

这样spring就会注入一个代理类,然后每次调用的时候会根据你的作用域去获取bean。只有不是singleton的bean,注入的都是代理类。

很简单的一个知识点,我想说明的是,看教程一定要自己尝试一下,并了解他的工作原理,思考ioc,aop,作用域的关系。

所以你知道为什么在controller里面注入request没有线程安全问题了吧?!

@Autowired
HttpServletRequest request;

这里request返回的是类名是com.sun.proxy.$Proxy62,很明显使用的jdk的动态代理。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
2年前
spring中@Scope控制作用域
  注解形势:通过@Scope注解控制作用域,默认使用单实例模式,可修改为多实例模式1/2Specifiesthenameofthescopetousefortheannotatedcomponent/bean.3<pDefaultstoanempty
Easter79 Easter79
2年前
Spring中管理Bean依赖注入之后和Bean销毁之前的行为
    对于Singleton作用域的Bean,Spring容器将会跟踪它们的生命周期,容器知道何时实例化结束、何时销毁。Spring可以管理Bean在实例化结束之后和Bean销毁之前的行为。Bean依赖关系注入之后的行为:    Spring提供了两种方式在Bean全部属性设置成功后执行特定的行为:在Spring配置文件
Easter79 Easter79
2年前
Spring框架笔记(七)——Spring IOC容器Bean的作用域
每个Bean都有自己的作用域,它们会在特定的时间生成,在特定的范围生存。SpringIOC容器的bean有四种作用域:!(http://static.oschina.net/uploads/space/2015/0718/222714_BcCF_1156339.png)其中默认的作用域是singleton,单例模式。也就是我们之前配置的bean
Wesley13 Wesley13
2年前
JAVA记录
singleton作用域:当把一个Bean定义设置为singleton作用域是,SpringIoC容器中只会存在一个共享的Bean实例,并且所有对Bean的请求,只要id与该Bean定义相匹配,则只会返回该Bean的同一实例。值得强调的是singleton作用域是Spring中的缺省作用域。prototype作用域:protot
Easter79 Easter79
2年前
Spring容器中Bean的作用域
当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下5种作用域:singleton:单例模式,在整个SpringIoC容器中,使用singleton定义的Bean将只有一个实例prototype:原型模式,每次通过容器
Easter79 Easter79
2年前
Spring笔记2
工厂注入:<beanid\_"xxx"_class\_"x.x.x"_factorymethod\_"methodName"_/\Bean的作用域<beanid\_"xxx"_class\_"x.x.x"_scope\_"scope"_/\scope"prototype"每次
Easter79 Easter79
2年前
Spring中的bean是线程安全的吗?
结论:不是线程安全的Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。Spring的bean作用域(scope)类型:singleton:单例,默认作用域。p
小万哥 小万哥
1个月前
掌握 Spring IoC 容器与 Bean 作用域:详解 singleton 与 prototype 的使用与配置
在您的应用程序中,由SpringIoC容器管理的形成其核心的对象被称为"bean"。一个bean是由SpringIoC容器实例化、组装和管理的对象。这些bean是通过您提供给容器的配置元数据创建的,例如,在前面章节中已经看到的XML定义。Bean定义包含了
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k