基于注解配置IoC容器
基于注解的优势
- 摆脱繁琐的XML形式的bean与依赖注入配置
- 基于“声明式”的原则,更适合轻量级的现代企业应用
- 让代码可读性变得更好,让研发人员拥有更好的开发体验
三类注解
- 组件类型注解-声明当前类的功能与职责
- 自动装配注解-根据属性特征自动注入对象
- 元数据注解-更细化的辅助IoC容器管理对象的 注解
组件类型注解:
四种组件类型注解
注解 | 说明 |
---|
@Component | 组件注解,通用注解,被该注解描述的类将被IoC容器管理并实例化 |
@Controller | xA语义注解,说明当前类是MVC应用中的控制器类 |
@Service | 语义注解,说明当前类是Service业务服务类 |
@Repository | 语义注解,说明当前类用于业务持久层,通常描述对应Dao类 |
开启组件扫描:
<context:component-scan base-package="com.imooc">
<context:exclude-filter type="regex" expression="com.imooc.exl.*">
</context:exclude-filter>
</context:component-scan>
基于注解初始化IoC容器
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.imooc"/>
</beans>
自动装配注解:
两类自动装配注解:
分类 | 注解 | 说明 |
---|
按类型装配 | @Autowired | 按容器内对象类型动态注入属性,由Spring机构提供 |
| @Inject | 基于JSR-330(Dependency Injection for Java)标准,其他同@Autowired,但不支持request属性 |
按名称装配 | @Named | 与@Inject配合使用,JSR-330规范,按属性名自动装配属性 |
| @Resource | 基于JSR-250规范,优先按名称,再按类型智能匹配 |
Autowired:
pring IoC容器会自动通过反射技术将属性private修饰符自动改为public,直接进行赋值, 不再执行set方法。如果装配注解放在set方法上,则自动按类型/名称对set方法参数进行注入
Resource:
- @Resource设置name属性,则按照name在IoC容器中将bean注入
- @Resource未设置name属性
2.1 以属性名作为bean name在IoC容器中匹配bean,如有匹配注入
2.2 按属性名未匹配,则按类型进行匹配,同autowired,需加入@Primary解决冲突
使用建议:在使用@Resource对象时,推荐设置name或保证属性名与bean名称一致
元数据注解
注解 | 说明 |
---|
@Primary | 按类型装配时出现多个相同类型对象,拥有此注解对象优先被注入 |
@PostConstruct | 描述方法,相当于XML中init-method配置的注解版本 |
@PreDestory | 描述方法,相当于XML中destroy-method配置的注解版本 |
@Scope | 设置对象的scope属性 |
@Value | 为属性注入静态数据 |