请教一个service注入的概念

@JFinal

有一个概念我一直没真正理解:

在controller里使用

@Inject

BlogService service;

和使用

BlogService service = new BlogService();

有什么根本性的区别呢?


评论区

JFinal

2019-11-23 11:41

主要区别如下:
1:节省点代码

2:@Inject 的方式支持 singleton,而 new BlogService() 每次要创建新对象(除非使用 static 关键字)

3:@Inject 可以注入接口的实现类,类的子类,抽象类的子类,这样就可以实现动态化,而 new BlogService 中的 BlogService 类型是写死在代码中的

4:@Inject 在注入的时候便于实现 AOP,被注入的对象上如果使用了 @Before 拦截器是生效的。而 new BlogService() 的方式在里头用的 @Before 将不起作用

zzutligang

2019-11-23 15:45

@JFinal,感谢波总的回复。@Inject 的service是singleton的,那是不是要在写service代码的时候,要考虑线程安全问题?

JFinal

2019-11-23 16:28

@zzutligang 单例必须考虑线程安全问题,一般业务层做成无状态的,天然就是线程安全的即可

你可以在不能是 singleton 的 service 上用注解来解决,例如:
@Singleton(false)
public class BlogService {
...
}

zzutligang

2019-11-25 10:12

@JFinal,麻烦再追问一个问题,业务层无状态,是不是就是说所有业务逻辑代码不再依赖其他数据或则状态数据,或则依赖其他对象里的方法也是直接new实例后调用。一个业务逻辑函数只是根据传递进来的参数进行逻辑处理,处理完也不会保存任何状态信息。这样的service就是无状态的吗?是不是还有更详细的概念?

JFinal

2019-11-25 10:44

@zzutligang 严格来说,业务层无状态是指:你的业务 class 里没有属性,或者只有 final 属性,例如:
public class MyService {
final int value = 123;
}

上面的 MyService 有一个 final 属性,是可以多线程共享的。或者上面的 MyService 没有属性,也可以称之为无状态


如果不严格来说,业务层无状态是指:你的业务 class 里面没有属性,或者只有无状态属性,例如:
public class MyService {
OtherService otherService;
}

上面的 MyService 有一个 OtherService 属性,如果它是无状态的,那么 MyService 也是无状态的

简单总结无状态就是:无属性或者只有无状态属性

状态这个词你简单理解为类的属性就好

JFinal

2019-11-25 10:45

这个是 java 基础,一定要搞清楚,否则在面临多线程开发时,必然造成混乱

zzutligang

2019-11-26 12:01

@JFinal,感谢耐心回复。也就是说service的class不能有属于class的属性变量,只包含若干function就一定是无状态的class了。至于final类型的属性变量或则属性变量是其他无状态的class,也是可以的。