using @Autowired many times

时间:2016-03-04 18:08:13

标签: java spring hibernate spring-mvc

I'm very new to spring, so I might ask silly question but anyway...

I have built Spring MVC 4.0 application.

my settings are like this:

Controller >> Service >> DAO

in controller level I use about 4 to 5 different @Autowired variables like this

@Autowired
private ClientService clientService;
@Autowired
private CommentService commentService;
@Autowired
private SearchService searchService;

In Service level I Autowire also several DAOs

@Autowired
SearchDAO searchDAO;

@Autowired
private ActivityDAO activityDAO;

@Autowired
private UserService userService;

I have about 10 different controllers and in majority of them I @Autowire same services, So my question is this ok or not?

Is is ok to use @Autowire as many times as I need or will bring too much memory usage? Will it have some other effects on my application?

I use Spring 4.0 + hibernate JPA

3 个答案:

答案 0 :(得分:4)

@Autowired没有问题。

Autowired在Spring上下文中查找bean并分配给变量。它只是引用Service / Dao bean的同一个对象。它不会创建重复。

但是将一个对象注入一个类是一个类做了很多的标志。检查尽可能将类重构为多个类的可能性。

答案 1 :(得分:1)

答案和一些评论已经回答了你的记忆问题。关于你的另一个问题

  

我有大约10个不同的控制器,其中大多数是我   @Autowire相同的服务,所以我的问题是否可以?

从设计角度来看,这听起来非常糟糕。 Ali Deghani提到了单一责任原则。事实上,如果您将服务从自动装配作为字段移动到通过构造函数自动装配,它会立即暗示您是否应该考虑重构,amongst other benefits

答案 2 :(得分:0)

  

我有大约10个不同的控制器,其中大多数我@Autowire相同的服务,所以我的问题是否可以?

可以在控制器之间重用服务。也就是说,我会犹豫在每个控制器中使用多个服务并重构代码,以便控制器不会“变得太胖”。通常,我努力将我的控制器作为HTTP世界和Java世界之间的映射层,并将所有业务逻辑下推到服务层。

Spring默认会创建带有singelton scope的bean,这意味着如果你在多个控制器中自动装配相同的bean,它们将共享同一个bean实例。

  

可以根据需要多次使用@Autowire或者会带来太多的内存使用量吗?它会对我的应用程序产生其他影响吗?

自动装配本身不需要太多内存,它只是对Java对象实例的引用。通常,Spring bean不包含任何状态(它们将其委托给组件,如缓存和数据库),所以除非你特别做某些事情,否则你不必担心内存使用。

要注意的一件事是,你应该避免在bean之间创建循环依赖关系。由于您正在使用字段注入,因此Spring将在应用程序初始化期间抛出异常,您需要重构应用程序。