Beans 通过一个 初始化ApplicationContext
,它也是一个BeanFactory
. 使用 XML 配置,您将需要该接口的实现,ClassPathXmlApplicationContext
. 您的应用程序需要创建这样一个类、注册您的 XML 文件并刷新上下文。完成后,Spring 将通过读取配置开始创建您的 bean。
当它命中<component-scan>
元素时,Spring 将扫描您声明的包以查找任何带有注释的类@Component
或其特化。从文档:
在 Spring 2.0 及更高版本中,@Repository 注释是任何满足存储库角色或原型(也称为数据访问对象或 DAO)的类的标记。此标记的用途之一是异常的自动翻译。
Spring 2.5 引入了更多的原型注解:@Component、@Service 和 @Controller。@Component 是任何 Spring 管理的组件的通用构造型。@Repository、@Service 和 @Controller 是 @Component 针对更具体的用例的特化,例如,分别在持久层、服务层和表示层中。
因此,您可以使用@Component 注释您的组件类,但是通过使用@Repository、@Service 或@Controller 来注释它们,您的类更适合工具处理或与方面关联。例如,这些原型注释是切入点的理想目标。
因此,如果您在服务层使用@Component 或@Service 之间进行选择,@Service 显然是更好的选择。同样,如上所述,@Repository 已被支持作为持久层中自动异常转换的标记。
当它找到这些类时,它将为每个类创建一个实例。
As for how it does this, it's a little more complicated. The overall strategy is with reflection. However, because of your configuration, Spring will sometimes generate (java or cglib) proxies instead of clear instances so that it can add behavior.
All the steps are described in detail in the official documentation.