在spring @Service上保存私有变量

时间:2016-09-06 07:07:04

标签: java spring

我想在每次调用服务时使用的弹簧@Service上保存数据。

将它保存为私有类成员是否是个好主意,如下例所示?

@Service
public class MyServiceImpl implements MyService {
    private int counter;

    @Override
    public int increment() {
        return counter++;
    }
}

3 个答案:

答案 0 :(得分:1)

在我看来,这是个坏主意,因为它不是线程安全的,也许你违反了单一责任原则。

如果我理解正确,您每次调用该方法时都要生成新的数字。我建议您创建课程@Component NumberGenerator,这将生成数字,您可以将其注入您的服务。然后你可以在你的服务中调用它。

如果您创建NumberGenerator + DI的界面,您可以轻松更改实施,而不是在服务中对您的逻辑进行硬编码。

我希望这可以帮助您决定哪种方式更好。

答案 1 :(得分:0)

我认为没问题。无论如何,无论如何抽象它,你都需要处理并发:

@Service
public class MyServiceImpl implements MyService {
    private static AtomicInteger COUNTER = new AtomicInteger(0);

    @Override
    public int increment() {
        return COUNTER.getAndIncrement();
    }
}

答案 2 :(得分:0)

这取决于计数器的用途。如果只是粗略地知道这个东西被调用多少次,我会把它private并在里面调用它。如果它被称为934957453次,没有人真正关心它是否超出1%/ 2%所以我不打扰同步它。

@Service
public class MyServiceImpl implements MyService {
    private int counter=0;

    private int increment() {
        return counter++;
    }

    @Override
    public getNumberOfCalls() {
        return counter;
    }

    @Override
    public int someMethod() {
        increment();
        ...
    }
}

但是,如果以某种方式使用计数器进行审核,请求跟踪,创建唯一ID或者不仅仅是计数器,那么您必须同步它并确保无法获得重复。