0

我是 Spring 框架的新手。在阅读依赖注入时,我发现了两种注入 bean annotationbased 和基于 xml 的方法。

在 xmlBased 中,在应用程序上下文 xml 文件中定义一个 bean 非常简单。

例如。

<bean id="wild" class="com.javapapers.spring.ioc.Wolf" />
<bean id="zoo" class="com.javapapers.spring.ioc.Zoo">
     <property name="wild" ref="wild" />
</bean> 

但是在基于注释的配置中,我们只需要编写

<context:component-scan base-package="com.javapapers.spring.ioc" />

我想知道它将如何加载 "wild" 和 "zoo" 。

这是否意味着它将加载所有bean或仅加载@Service注释下编写的特定bean..???

我也想知道它是如何加载的..??? 加载应用程序时是否所有bean都被初始化..??

谢谢 ...!!

4

3 回答 3

3

当您使用时<context:component-scan base-package="com.javapapers.spring.ioc" />,spring 将实例化“com.javapapers.spring.ioc”包中的所有类并具有以下注释之一:

  • @服务
  • @控制器
  • @Repository
  • ...

是的,当您启动应用程序时,所有 bean 都会被初始化。

您可以在此页面中获得更多信息:这里

于 2013-06-12T13:24:55.010 回答
1

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.

于 2013-06-12T13:30:21.393 回答
0

将加载所有带有注释的bean

@Controller
@Component
@Service
@Repository

它们位于包 com.javapapers.spring.ioc 及其子包中。

于 2013-06-12T13:25:33.687 回答