说明:
使用注解和使用配置文件实现的功能是一样的,都是为了解耦,但是配置文件语法属于非编程语言法语,无法调试,难以定位bug,使用注解更易定位问题。
配置步骤
编译器必须先安装了STS插件
第一步
导包:在基于注解配置中,我们还要拷贝一个aop的jar
第二步
使用规则文件创建配置文件(上一篇有详细过程)
注意:基于注解整合时,Spring配置文件导入约束时需要添加一条context名称空间下的约束
第三步:创建一个普通类
使用注解配置,需要在spring启动时就创建对象的类标记为组件类
用于对象的注解
我们将用于被扫描创建对象的注解统称为组件注解,包括:
@Component @Controller @Service @Repository
这四个类都在context/stereotype下
四个组件注解在功能上没有任何区别,只是意义有所不同
组件注解的功能都是标识类为注解的组件类,启动Spring框架的程序时,声明将这些组件类的对象注入到Spring容器里面。意味着,只有加了这四个注解任何一个注解的类,在程序启动的时候,Spring就通过配置文件指定的路径将该路径下的所有带组件注解的类创建对象并且放在容器里面。相当于配置文件中的<bean>标签
用于依赖注入
实现了配置文件中<property>的功能
@Autowired注解:用于给引用注入容器中的对象
其中该注解的required属性可以指定注入对象是否允许为空
使用@Autowired纾解的三种情况
1)在属性上注入
2)在方法上面注入(要求方法必须有参数)作用是用容器中的对象传递给参数
3)在构造方法中注入
@Qualifier注解
@Qualifier注解:用于指定注入对象名,使用@Autowired注入对象时,没有指定对象名,只能通过@Qualifier字段设置容器中的对象名
value:指定注入Spring容器中对应对象名的对象给引用
@Resource注解
@Resource注解是Spring框架支持Sun官方制定的JSR-250标准注入对象的实现
@Resource 功能等同 @Autowired + @Qualifier ,等同配置文件标签 <proprty name=”...” ref=”...”>
@Resource注解:用于给引用注入容器的对象,可以通过name属性指定对象名
注意:@Resource注解只能注入方法和属性,不能注入构造方法
@Value注解
@Value注解:注入基本数据类型以及它们的包装类和String类型数据的,支持${}注入Properties文件的键值对,等同 <proprty name=”...” value=”${Key}”>。
注意:当一个类在容器中有两个对象的情况,为指定对象名使用依赖注入的话会报错。
首先我们必须要先理解Spring创建对象到注入对象的原理。
----------Spring对象创建流程
1. 在启动Spring框架的时候,框架先根据 <context:component-scan base-package="com.sxt">,去获得该包下的所有类名。
2. 通过反射技术,根据类名获得类结构的组件注解,如果有就创建对象,如果没有就忽略该类。
3. 创建对象后将对象放入Spring容器里面,如果不在组件注解的value指定对象名,使用的使用默认命名法:就是取类名的首字符修改为小写为对象名,如,CustomerDAOImpl的对象名为customerDAOImpl
--------------Spring对象注入流程
Spring将容器里面的对象注入给声明的引用
1. 首先匹配引用的类型在容器中是否兼容类型的对象。就是匹配引用的类型是否是父类或者相同的类型的类,如果匹配的类型的对象只有一个直接将对象注入到该引用。
2. 如果匹配的类型的对象不是唯一的,将将引用的属性名匹配Spring容器对象的对象名,如果找到对象名一样的,就注入相同对象名的对象。
根据Spring对象注入流程,如果出现两个类型一样的对象,必须要指定对应的对象名。
指定对象名的方式有两种
为注入对象指定容器中的对象
spring生命周期注解
Spring通过@Scpoe注解来指定对象的生命周期
参数:
*singleton:单例
对象出生:当程序加载配置文件创建容器时,创建
对象活着:只要容器还在,一直活着
对象死亡:应用停止,容器销毁,对象死亡
*prototype:多例(原型对象)
对象出生:当程序加载配置文件创建容器时,创建
对象活着:只要对象被使用,一直活着
对象死亡:对象长时间不用,会被Java垃圾回收机制回收
*reqeust:web项目中,Spring将创建的对象放在request作用域中
*session:web项目中,Spring将创建的对象放在session作用域中
纯注解配置
通过@Configuration注解 和 @ComponentScan注解实现