写了一个包装Ehcache的类EhcacheWrapper,加入多线程控制,代码如下
@service
public class EhcacheWrapper{
public Element get(String cacheName, String key){......}
public void put(String cacheName, String key, Object value){......}
//多线程控制,代码略
}
我在一个controller中自动装配EhcacheWrapper,比如
public class GetLabelServiceImpl{
@Autowired
private EhcacheWrapper ehcacheWrapper;
//代码略
}
我在其他controller中还能@Autowired EhcacheWrapper吗?
我觉得@Component默认的scope是singleton,只有一个实例。如果在两个类中都@Autowired EhcacheWrapper,是不是两个类都调用同一个bean呢?EhcacheWrapper有多线程控制,这样做是不是有什么问题?应该怎么处理比较好?
解决:
要不写成线程安全的类。要不在使用的地方new就可以了
默认scope=singleton单例的,在ioc容器中只实例化一次,如何你想每次都创建一个新的对象可以scope=prototype 每次发送请求时都会创建
第一个问题,如果你没有加scope,那么spring初始化的的这个类的实例只有一个,无论在其他什么地方注入都是那一个实例。第二个问题,一般service类作为其他类的成员变量,本身这个变量不涉及到赋值或内容改变,只是调用下实例的方法,方法也一般不涉及到自身成员变量的操作,不会有什么线程安全问题