Java springbean的公共访问修饰符和模块导出

Java springbean的公共访问修饰符和模块导出,java,spring,Java,Spring,Spring应用程序上下文设置的对象类springbean类必须是publicclasses,Spring才能创建这些对象吗?显然,如果您的bean在不同的包中访问您的其他bean,那么您的bean必须是公共的,才能相互交互。我的问题是,您的bean类是否必须是公共的 由于Spring代码本身与您的代码所在的包不同,从概念上讲,Spring正在做一些应该需要public访问您的类的事情。另一方面,Spring使用反射来创建bean,因此它可能不需要您的类是公共的 除了包访问类型之外,从Java9

Spring应用程序上下文设置的对象类springbean类必须是
public
classes,Spring才能创建这些对象吗?显然,如果您的bean在不同的包中访问您的其他bean,那么您的bean必须是
公共的
,才能相互交互。我的问题是,您的bean类是否必须是公共的

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


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

否,并非所有类都必须公开。Spring可以像您提到的那样使用反射实例化包私有类,而不会出现任何问题


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

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

附带说明,我通常在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;
 }

“这允许我的实现类具有默认的访问修饰符”:但您仍然可以选择使用包私有类,即使您的类没有实现
公共接口
?嗯,是和否。从Spring的角度来看,是的,它将为您拾取并创建bean。例如,您可以创建一个具有包私有访问权限的
@Controller
类,您将获得预期的请求/响应行为。问题是,如果您的包私有类在其他包的另一个类中用作依赖项,那么您将在很久之前收到编译错误。然而,Java语言规范就是这样设计的,与Spring无关。在这里拥有一个接口的唯一好处是,接口的方法可能比服务少,因此您只公开您想要公开的内容。就个人而言,我更喜欢组合而不是继承:拥有一个包private
@Service
类和一个依赖于此服务的公共外观。facade将所有调用委托给服务,并只公开包外部所需的内容。您能否详细说明为什么从其他模块注入包私有bean不起作用?这对我来说并不明显。