哪个类区域在Spring中加载为bean?

时间:2013-06-12 13:13:48

标签: java spring dependency-injection inversion-of-control spring-ioc

我是Spring框架的新手。在阅读依赖注入时,我发现了两种注入bean anotationbased和基于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" />

我想知道它将如何加载“野生”和“动物园”。

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

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

谢谢...... !!

3 个答案:

答案 0 :(得分:3)

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

  • @服务
  • @Controller
  • @Repository
  • ...

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

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

答案 1 :(得分:1)

通过ApplicationContext初始化Bean,这也是BeanFactory。使用XML配置,您需要实现该接口ClassPathXmlApplicationContext。您的应用程序需要创建这样的类,注册您的XML文件,并刷新上下文。完成后,Spring将通过读取配置开始创建bean。

当它到达<component-scan>元素时,Spring将扫描您声明的包,以查找使用@Component或其特化注释的任何类。来自docs

  

在Spring 2.0及更高版本中,@ Repository注释是一个标记   任何履行角色或刻板印象的类(也称为数据   存储库的Access Object或DAO)。这个标记的用途之一   是例外的自动翻译。

     

Spring 2.5引入了进一步的构造型注释:@Component,   @Service和@Controller。 @Component是任何的通用构造型   Spring管理的组件。 @ Repository,@ Service和@Controller都是   对于更具体的用例,@ Component的特化   例如,在持久性,服务和表示层中,   分别

     

因此,您可以使用@Component注释组件类,   但是通过@Repository,@ Service或@Controller注释它们   相反,您的类更适合按工具处理   或与方面联系。例如,这些刻板印象注释   为切入点制作理想的目标。

     

因此,如果您选择使用@Component或@Service   你的服务层,@ Service显然是更好的选择。同样的,   如上所述,已经支持@Repository作为标记   持久层中的自动异常转换。

当找到这些类时,它将创建每个类的实例。

至于它是如何做到的,它有点复杂。总体战略是反思。但是,由于您的配置,Spring有时会生成(java或cglib)代理而不是clear实例,以便它可以添加行为。

official documentation中详细介绍了所有步骤。

答案 2 :(得分:0)

将加载所有使用

注释的bean
@Controller
@Component
@Service
@Repository

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