Spring实际遇到的多例单例

weixin_让那风在身后吃惊_04128960 2020/9/17 8:03:47

这是我的笔记,有可能不对,望指正。 @Autowired的注入是单例注入,单例类似于静态,具有全局唯一性。 一个类使用@Autowired,那么这个类必须由spring容器托管,就比如这个类要打上@Component或@Service的注解。一个由Spring容器代理的类不能有不带@Autowired自己的私有成…

这是我的笔记,有可能不对,望指正。
@Autowired的注入是单例注入,单例类似于静态,具有全局唯一性。
一个类使用@Autowired,那么这个类必须由spring容器托管,就比如这个类要打上@Component或@Service的注解。一个由Spring容器代理的类不能有不带@Autowired自己的私有成员变量。
我遇到的业务场景是,我要给A服务不同的Controller访问的路径的model中,放入B服务生成的Map令牌集合。

我要通过RestTemplate来请求B服务并待会结果信息。

此时的,错误代码:

public class CreateJwtUtil{
	@Autowired
	private RestTemplate restTemplate;
    public static Map<String,String> getJwts(){
		return restTemplate.postForObject(url,requestObject,Map.class);
	}
}
// 此时的错误 我在非Spring管理的类中使用了@Autowired
/*
 我这个RestTemplate是不是应该单例呢,明显不是
因为会有多个Controller来调用这个工具类
*/

调用这个方法的Controller

public Controlelr{
	
	@GetMapping("/test")
	public String test(){
		model.addAttribute("jwt",CreateJwtUtil.getJwts());
		return "jsp";
	}
}

解决方式一:
不依赖Spring容器

public class CreateJwtUtil{
	private RestTemplate restTemplate;
	public CreateJwtUtil(RestTemplate restTemplate){
		this.restTemplate = restTemplate;
	}
    public static Map<String,String> getJwts(){
		return restTemplate.postForObject(url,requestObject,Map.class);
	}
}

调用的Controller

public Controlelr{
	@Autowired
	private RestTemplate restTemplate;
	
	@GetMapping("/test")
	public String test(){
		CreateJwtUtil util = new CreateJwtUtil(restTemplate);
		model.addAttribute("jwt",util.getJwts());
		return "jsp";
	}
}

解决方式二:
依赖Spring容器,多例注入这个RestTemplate我不知道怎么实现。
多例注入的例子
方案一:

@Component
// @Scope默认是单例模式,即scope="singleton"
// prototype原型模式,每次获取Bean的时候会有一个新的实例
@Scope(value="prototype")
public class Test {
    private String name = "7";
}

注入方式

	@Autowired
	private Test test;
	@Autowired
	private Test test1;

方案二(对象工厂):

@Component
// @Scope默认是单例模式,即scope="singleton"
// prototype原型模式,每次获取Bean的时候会有一个新的实例
@Scope(value="prototype")
public class Test {
    private String name = "7";
}

注入方式

public class Controller{
	@Autowired
	private ObjectFactory<Test> test;
	@GetMapping("/test")
	public void test(){
		this.test.getObject();
	}
}

方案三(动态代理):

@Component
// @Scope默认是单例模式,即scope="singleton"
// prototype原型模式,每次获取Bean的时候会有一个新的实例
@Scope(value="prototype",proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Test {
    private String name = "7";
}
随时随地学软件编程-关注百度小程序和微信小程序
关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[Spring实际遇到的多例单例]http://www.zyiz.net/tech/detail-147135.html

上一篇:如何修改WordPress网站页脚版权(2种方法)

下一篇:Spring 5 中文解析数据存储篇-Spring框架的事物支持模型的优势

赞(0)

共有 条评论 网友评论

验证码: 看不清楚?
    关注微信小程序
    程序员编程王-随时随地学编程

    扫描二维码或查找【程序员编程王】

    可以随时随地学编程啦!

    技术文章导航 更多>
    扫一扫关注最新编程教程