1基础
1.1注解优势
- 摆脱繁琐的XML形式的bean与依赖注入配置。
- 基于"声明式"的原则,更适合轻量级的现代企业应用。
- 让代码可读性变得更好,研发人员拥有更好的开发体验。
1.2三类注解(注解功能划分)
- 组件类型注解-声明当前类的功能与职责。
- 自动装配注解-根据属性特征自动注入对象。
- 元数据注解-更细化的辅助IoC容器管理对象的注解。
1.3四类主键类型注解
- @Component:组件注解,通用注解,被该注解描述的类将被loC容器管理并实例化,以下三个都是主键注解的细化,当不确当用哪一个时候,就可以用这个。
- @Controller:语义注解,说明当前类是MVC应用中的控制器类。
- @Service:语义注解,说明当前类是Service业务服务类。
- 如果需要被spring Ioc识别 需要在contextApplication.xml中:
- 扫描com.imooc下所有的class,如果class中有之前那四个注解实例化并且管理到ioc容器中
- @Repository:语义注解,说明当前类用于业务持久层通常描述对应Dao类。 关于beanid ,可以自己指定或者使用默认。
- 特别注意,当@Autowired注解使用某个对象时候,必须先用@Component/@Repository/@Service先将此类注解,否则springIoc找不到
1.3.1拓展@ConfigurationPropertie
通过这种注解可以使得ConfigBean.class 中对象被注入值,但是要注意命名一定要相同
1.4demo学习
代码准备
注意-其中contextApplication.xml中表头文件来源spring.io,具体见 spring ioc中contextApplication.xml
1.5两类自动装配注解
Ioc容器运行中,自动为某个属性注入数据,自动装配注解就是为了依赖注入存在的。让Spring自动的把属性需要的对象找出来,并注入给该属性。
1.5.1按照类型装配
- @Autowired 按容器内对象类型动态注入属性,由Spring机构提供。
- @Inject 基于JSR-330(Dependency Injection for Java)标准, 其他同@Autowired,但不支持required属性
- 按照类型装配置的缺点:当一个接口下有两个实现(一个用于mysql数据库、一个用于oracle数据库,这个时候实例化就会出错,系统不知道实例化哪一个)
-
-
mysql实现
- oracle实现
-
解决这种方法,要么在不使用的实现中删除@Repository,要么在要使用的实现中添加@Primary(系统就使用这个)
-
1.5.2按名称装配
- @Named 与@Inject配合使用,JSR-330规范,按属性名自动装配 属性
- @Resource 基于JSR-250规范,优先按名称、再按类型智能匹配
- @Resource设置name属性,则按name在IoC容器中将bean注入
- @Resource未设置name属性
- 以属性名作为bean name在IoC容器中匹配bean,如有匹配则注入
- 按属性名未匹配,则按类型进行匹配,同@Autowired,需加入@Primary解决类型冲突
-
使用建议:在使用@Resource对象时推荐设置name或保证属性名与bean名称一致
- demo
-
方式1 定义的名称与实现类名称不同,通过Bean( @Resource中定义名称=》和实现类相同) ioc容器则会根据名称去调用;方式2 定义的名称与实现类名称完全相同,ioc容器则会根据名称去调用;方式3如果以上都没有写,则和@Autowired解决方式相同
1.6元数据注解
- @Primary 按类型装配时出现多个相同类型对象,拥有此注解对象优先被注 入 @PostConstruct 描述方法,相当于XML中init-method配置的注解版本 。
- @PreDestroy 描述方法,相当于XML中destroy-method配置的注解版本 。
- @Scope 设置对象的scope属性 ,决定这个对象的生存周期是什么(单例模式、多例模式)。
- @Value 为属性注入静态数据。【@Value、@Resource、@Autowired对属性的设置原理都相同:运行时将private改为public 赋值完毕之后将public在改为private】