Spring Bean的公共访问修饰符和模块导出

Rae*_*ald 12 java spring

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

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

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

Bar*_*art 15

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

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

  • @Dcortez 包私有类只能在同一个包中访问,如果您尝试在不同的包中访问,您的 IDE 本身会抱怨。 (2认同)

mat*_*sev 5

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

旁注,我通常@Component在我的bean实现上使用系列注释,让Spring使用包扫描来导入它们.

例:

 package com.example.service;

 public interface SomeService {}
Run Code Online (Sandbox Code Playgroud)

执行:

 package com.example.service.impl;

 @Service
 class SomeServiceImpl {}
Run Code Online (Sandbox Code Playgroud)

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

 package com.example.other.impl;

 @Component
 class OtherServiceImpl implements OtherService {

     @Autowired
     private SomeService someService;
 }
Run Code Online (Sandbox Code Playgroud)