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

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

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

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

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

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

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

如下:

1@RestController 2public class MainController { 3 @Autowired 4 MainServices services; 5}

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

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

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

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

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

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

1@Autowired 2HttpServletRequest request;

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

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

spring中@Scope控制作用域

  注解形势:通过@Scope注解控制作用域,默认使用单实例模式,可修改为多实例模式1/2Specifiesthenameofthescopetousefortheannotatedcomponent/bean.3<pDefaultstoanempty

Spring中管理Bean依赖注入之后和Bean销毁之前的行为

    对于Singleton作用域的Bean,Spring容器将会跟踪它们的生命周期,容器知道何时实例化结束、何时销毁。Spring可以管理Bean在实例化结束之后和Bean销毁之前的行为。Bean依赖关系注入之后的行为:    Spring提供了两种方式在Bean全部属性设置成功后执行特定的行为:在Spring配置文件

Spring框架笔记(七)——Spring IOC容器Bean的作用域

每个Bean都有自己的作用域,它们会在特定的时间生成,在特定的范围生存。SpringIOC容器的bean有四种作用域:!(http://static.oschina.net/uploads/space/2015/0718/222714_BcCF_1156339.png)其中默认的作用域是singleton,单例模式。也就是我们之前配置的bean