20

Spring bean 类,即 Spring 应用程序上下文设置的对象的类,必须是public类,以便 Spring 创建这些对象?显然,如果您的bean 在不同的包中访问您的其他 bean,那么您的 bean 必须public相互交互。我的问题是你所有的 bean 类是否都必须是public.

由于 Spring 代码本身与您的代码所在的包位于不同的包中,因此从概念上讲,Spring 正在做一些应该需要public访问您的类的事情。另一方面,Spring 使用反射来创建 bean,所以它可能不需要你的类是public.

除了包访问类型之外,从 Java 9 开始,我们还有 Java 模块。如果将类放在模块中,是否需要公开并从模块中导出它们?

4

2 回答 2

25

不,并非所有课程都必须是public. Spring可以使用反射来实例化包私有类,就像你提到的那样,没有任何问题..

如果包私有 bean 由 IoC 容器管理并由同一包中的类使用,那没问题。仅当您尝试跨包连接该 bean 时才会出现问题。这当然是很明显的。

于 2013-09-18T10:22:03.000 回答
5

我总是努力让我的 bean 实现接口,并让其他 bean 依赖于接口而不是实现类。要回答您的问题,这允许我的实现类具有默认访问修饰符,这具有很好的副作用,即如果它们位于其他包中,其他 bean 不会意外访问它们。

旁注,我通常@Component在我的 bean 实现上使用家庭注释,并让 Spring 使用包扫描来导入它们。

例子:

 package com.example.service;

 public interface SomeService {}

执行:

 package com.example.service.impl;

 @Service
 class SomeServiceImpl {}

其他依赖于第一个接口的类:

 package com.example.other.impl;

 @Component
 class OtherServiceImpl implements OtherService {

     @Autowired
     private SomeService someService;
 }
于 2013-09-18T11:09:23.800 回答