我是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都被初始化了。??
谢谢...... !!
答案 0 :(得分:3)
当您使用<context:component-scan base-package="com.javapapers.spring.ioc" />
时,spring将实例化“com.javapapers.spring.ioc”包中的所有类并拥有此注释之一:
是的,当您启动应用程序时,所有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及其子包中。