Java Spring@组件类必须是公共的吗?

Java Spring@组件类必须是公共的吗?,java,spring,Java,Spring,我想将组件的接口公开为接口,实现类将受包保护(可能在其他包中): 假设baz.无论组件扫描中的是什么,Spring是否能够在其他地方自动连接baz.iface.Foo class FooClient { @Autowired private baz.iface.Foo; } 是,Spring将搜索类型为Foo的对象 SpringyFoo实现了Foo,可以用来代替Foo类型的对象。您不能将bar()设为“包保护”,因为它必须是公共的: Spring的反射系统将找到您的所有类,即

我想将组件的接口公开为接口,实现类将受包保护(可能在其他包中):

假设
baz.无论
组件扫描中的
是什么
,Spring是否能够在其他地方自动连接
baz.iface.Foo

class FooClient {
    @Autowired
    private baz.iface.Foo;
}

,Spring将搜索类型为
Foo
的对象

SpringyFoo
实现了
Foo
,可以用来代替
Foo

类型的对象。您不能将
bar()
设为“包保护”,因为它必须是
公共的


Spring的反射系统将找到您的所有类,即使是具有默认访问权限的类,但如果您的
bar()
方法不是
public
,则编译时出错。不,组件不必是公共的。唯一的要求是他们有一个无参数构造函数。

你试过了吗?我刚刚注意到这段代码的另一个问题:
baz.iface.Foo
baz.which
中不可见。您需要将界面
公开
。这可能是
SpringyFoo
中的输入错误。另外,您不必将接口方法声明为
public
as。我再说一遍,真正的问题是他应该试一试。使用Java反射/字节码操作和相应的松散安全管理器,您可以做任何事情,甚至包括设置最终字段。是的,在
bar()之前缺少的
public
SpringyFoo
中的一个输入错误。我已经更新了这个问题。我确实试过了,而且似乎很管用。然而,我能找到的所有文档/示例都是使用公共类的,所以我想知道这是否是受支持的行为;如果这不是你的意思,请告诉我。你也可以在构造函数中使用参数进行构造函数注入:要清楚,你是说不,组件不必是公共的。
class FooClient {
    @Autowired
    private baz.iface.Foo;
}