我想将组件的接口公开为接口,实现类将受到包保护(可能在其他包中):
package baz.iface
interface Foo {
void bar();
}
package baz.whatever
@Component
class SpringyFoo implements baz.iface.Foo {
public void bar() { frobnicate(); }
}
假设baz.whatever
中有component-scan
,Spring是否可以在其他地方自动装配baz.iface.Foo
?
class FooClient {
@Autowired
private baz.iface.Foo;
}
答案 0 :(得分:4)
不,组件不必公开。唯一的要求是他们有一个no-arg构造函数。
答案 1 :(得分:0)
是,Spring会搜索Foo
类型的对象
SpringyFoo
实现Foo
,可用于代替Foo
类型的对象。
答案 2 :(得分:0)
您无法使bar()
"受套餐保护"因为它必须是public
:
Every method declaration in the body of an interface is implicitly public.
Spring的反射系统会找到你的所有类,甚至是那些具有默认访问权限的类,但是bar()
方法的编译时错误不是public
。