Spring_IOC_注解
1. 使用注解标识组件
- @Component: 标识一个受SpringIOC容器管理的组件
- @Respository: 持久化层组件
- @Service: 业务逻辑层组件
- @Controller: 表述层控制器组件
2. 组件命名规则
- 默认情况下: 使用组件的简单
类名首字母小写
后得到的字符串作为bean的id, 默认是单例的 - 使用组件注解的
value属性
指定bean的id
3. 开启注解扫描
组件上被注解标识之后还需要开启注解扫描
application.xml中指定被扫描的package
- base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包及其子包中的所有类
- 当需要扫描多个包时可以使用逗号分隔。
- 如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类,示例:
<context:component-scan base-package="com.lz.component"/>
<context:component-scan base-package="com.lz.component" resource-pattern="autowire/*.class"/>
包含与排除
<context:include-filter>
子节点表示要包含的目标类(要禁用默认规则才行)<context:exclude-filter>
子节点表示要排除在外的目标类
<context:component-scan base-package="com.lz.component" use-default-filters="flase">
<context:include-filter type="annotation" expression=""/>
</context:component-scan>
4. 组件装配
使用@Autowired注解
- 先根据
类型
实现自动装配.
根据类型
去容器中找对应的组件。
没找到, 抛异常.
找到了, 找到多个: 按照bean的变量名作为ID进行匹配.- 构造器、普通字段(即使是非public)、一切具有参数的方法都可以应用@Autowired注解
方法上有@AutoWired:
① 这个方法也会在容器启动的时候自动运行
② 这个方法的每一个参数都会自动注入值- 认情况下,所有使用@Autowired注解的属性都需要被设置。当Spring找不到匹配的bean装配属性时,会抛出异常。
- 若某一属性允许不被设置,可以设置@Autowired注解的
required
属性为 false- 默认情况下,当IOC容器里存在
多个类型兼容的bean时
,Spring会尝试匹配bean的id值
是否与变量名相同,如果相同则进行装配。如果bean的id值不相同,通过类型的自动装配将无法工作。此时可以在@Qualifier
注解里提供bean的名称。Spring甚至允许在方法的形参上标注@Qualifiter注解以指定注入bean的名称。- 可以使用@Qualifier来具体指定要装配的bean的id值.
其他的自动专装配注解
- @Resource : java自己的注解, 扩展性更强, 因为是java的标准. 如果切换成另外一个容器框架, @Resource还是可以使用的. @Autowired就不行了
- @Inject
5. IOC总结
- IOC是一个容器, 帮助我们管理所有的组件
- 某个组件要使用spring提供的IOC或AOP,必须先加入到容器中(注册会员)
- 容器启动, 创建所有单例对象bean
- autowire的自动装配时, 是从容器中找这些符合要求的bean
- ioc.getBean(“bookService”),也是从容器中找这个bean
- 容器中包括了所有的bean
- spring容器其实就是一个
map
- 这个map中保存了所有创建好的bean,并提供外界获取功能