Spring 之注解开发
8、使用注解开发
8.1.什么是注解?
注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值)
使用注解,注解作用在类上面,方法上面,属性上面
使用注解目的:简化 xml 文件的配置。
注解的弊端:
为了达成注解驱动的目的,可能会将原先很简单的书写,变的更加复杂
XML 中配置第三方开发的资源是很方便的,但使用注解驱动无法在第三方开发的资源中进行编辑,因此会增大开发工作量
8.2.Spring 针对 Bean 管理中创建对象提供注解
@Component:用于类中,普通的注解,都可以创建对象,泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Service:用于业务层中,用于标注业务层组件
@Controller:用于 web 层,用于标注控制层组件(如 struts 中的 action)
@Repository:用于 dao 层,用于标注数据访问组件,即 DAO 组件.
@Controller : 一般用于表现层的注解。
@Service : 一般用于业务层的注解。
@Repository : 一般用于持久层的注解。
细节:如果注解中有且只有一个属性要赋值时,且名称是 value , value 在赋值是可以不写。
四种都可用在各个层使用。均可以创建 bean 实例,对象。
8.3.基本注解方式创建对象
①带入依赖
在 Spring4 之后,要使用注解开发,必须要保证 aop 的包导入了
②开启注解
引入名称空间
说明:
在进行包所扫描时,会对配置的包及其子包中所有文件进行扫描
扫描过程是以文件夹递归迭代的形式进行的
扫描过程仅读取合法的 Java 文件
扫描时仅读取 Spring 可识别的注解
扫描结束后会将可识别的有效注解转化为 spring 对应的资源加入 IoC 容器
注意:
无论是注解格式还是 XML 配置格式,最终都是将资源加载到 IoC 容器中,差别仅仅是数据读取方式不同
从加载效率上来说注解优于 XML 配置文件
使用注解需要导入 context 约束,增加注解的支持!
模块
@Component:用于类中,普通的注解,都可以创建对象
@Service:用于业务层中
@Controller:用于 web 层
@Repository:用于 dao 层
在类上添加以上其中一个注解就可以创建一个对象
8.4.开启组件扫描细节配置
8.5.属性注解方式实现属性注入
@Autowired:根据属性类型进行自动装配
@Qualifier:根据属性名称进行注入,id
@Resource:可以根据类型注入,也可以根据名称注入,相当于 @Autowired+@Qualifier
@Value:注入普通类型属性
属性注入:
使用 @Autowired 进行自动注入
@Autowired 默认按照类型进行注入
如果存在两个相同 Bean 类型相同,则按照名称注入
@Autowired 注入时可以针对成员变量或者 set 方法
通过 @Autowired 的 required 属性,设置一定要找到匹配的 Bean
使用 @Qualifier 指定注入 Bean 的名称
使用 Qualifier 指定 Bean 名称后,注解 Bean 必须指定相同名称
Spring 提供对 JSR-250 中定义 @Resource 标准注解的支持
普通数据类型的属性注入
@Value("值")
引用数据类型的属性注入
@Autowired
@Qualifier("")
@Resource(name="userDao")
① @Autowired:根据属性类型进行自动装配:
作用:自动按照类型注入。当使用注解注入属性时, set 方法可以省略。它只能注入其他 bean 类型。当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id ,在 spring 容器查找,找到了也可以注入成功。找不到就报错。
在 bean 中的属性上通过 @Autowired 实现自定义 bean 类型的属性注入
使用是对应的 bean 必须被 spring 管理,即手动配置了 bean 或者在类上添加了 @Component 注解
② @Qualifier:根据属性名称进行注入
③ @Resource:可以根据类型注入,也可以根据名称注入
@Resource 是 Java 自带的注解
④ @Value:注入普通类型属性
作用:注入基本数据类型和 String 类型数据的
属性:value :用于指定值
8.6.属性如何注入
user
@Component
组件,放在类上,说明这个类被 spring 管理了,就是 bean!
test
去掉名字内容,测试结果为 null
@Value
8.7.衍生的注解
@Component 有几个衍生注解,我们在 web 开发中,会按 mvc 三层架构分层
dao 【@Repository】
service 【@Service】
controller 【@Controller】
这四个注解功能都是一样的,都是代表将某个类注册到 spring 中,装配 Bean.
8.8.自动装配置
@Autowired:自动装配通过类型。名字如果 Autowired 不能唯一自动装配上属性,则需要通过 @Qualifier(va1ue="xxx")@Nullable :字段标记了这个注解,说明这个字段可以为 null;@Resource :自动装配通过名字。类型。
当一个类 Class A 中需要一个 B 类型的变量时,在声明变量时加上这个注解 spring 会在容器中寻找有没有
8.9.作用域
8.10.完全注解开发--无 xml 文件
① 创建配置类,代替 xml 配置文件
②测试类
8.11.常用注解总结
Spring 原始注解
Spring 原始注解主要是替代<Bean>的配置
注:红色需要掌握。
常用注解
8.11.1.启动注解功能
启动注解扫描,加载类中配置的注解项
说明:
在进行包所扫描时,会对配置的包及其子包中所有文件进行扫描
扫描过程是以文件夹递归迭代的形式进行的
扫描过程仅读取合法的 java 文件
扫描时仅读取 spring 可识别的注解
扫描结束后会将可识别的有效注解转化为 spring 对应的资源加入 IoC 容器
注意:
无论是注解格式还是 XML 配置格式,最终都是将资源加载到 IoC 容器中,差别仅仅是数据读取方式不同
从加载效率上来说注解优于 XML 配置文件
8.11.2.bean 的定义
名称:@Component @Controller @Service @Repository
类型:类注解
位置:类定义上方
作用:设置该类为 spring 管理的 bean
范例:
说明:
@Controller、@Service 、@Repository 是 @Component 的衍生注解,功能同 @Component
相关属性
value(默认):定义 bean 的访问 id
8.11.3.bean 的作用域
名称:@Scope
类型:类注解
位置:类定义上方
作用:设置该类作为 bean 对应的 scope 属性
范例:
相关属性
value(默认):定义 bean 的作用域,默认为 singleton
8.11.4.bean 的生命周期
名称:@PostConstruct、@PreDestroy
类型:方法注解
位置:方法定义上方
作用:设置该类作为 bean 对应的生命周期方法
范例:
8.11.5.加载第三方资源
名称:@Bean
类型:方法注解
位置:方法定义上方
作用:设置该方法的返回值作为 spring 管理的 bean
范例:
说明:
因为第三方 bean 无法在其源码上进行修改,使用 @Bean 解决第三方 bean 的引入问题
该注解用于替代 XML 配置中的静态工厂与实例工厂创建 bean,不区分方法是否为静态或非静态
@Bean 所在的类必须被 spring 扫描加载,否则该注解无法生效
相关属性
value(默认):定义 bean 的访问 id
8.11.6.bean 的非引用类型属性注入
名称:@Value
类型:属性注解、方法注解
位置:属性定义上方,方法定义上方
作用:设置对应属性的值或对方法进行传参
范例:
说明:
value 值仅支持非引用类型数据,赋值时对方法的所有参数全部赋值
value 值支持读取 properties 文件中的属性值,通过类属性将 properties 中数据传入类中
value 值支持 SpEL
@value 注解如果添加在属性上方,可以省略 set 方法(set 方法的目的是为属性赋值)
相关属性
value(默认):定义对应的属性值或参数值
8.11.7.bean 的引用类型属性注入
名称:@Autowired、@Qualifier
类型:属性注解、方法注解
位置:属性定义上方,方法定义上方
作用:设置对应属性的对象或对方法进行引用类型传参
范例:
说明:
@Autowired 默认按类型装配,指定 @Qualifier 后可以指定自动装配的 bean 的 id
相关属性
required:定义该属性是否允许为 null
8.11.8.bean 的引用类型属性注入
名称:@Primary
类型:类注解
位置:类定义上方
作用:设置类对应的 bean 按类型装配时优先装配
范例:
说明:
@Autowired 默认按类型装配,当出现相同类型的 bean,使用 @Primary 提高按类型自动装配的优先级,多个 @Primary 会导致优先级设置无效
8.11.9.bean 的引用类型属性注入
名称:@Inject、@Named、@Resource
说明:
@Inject 与 @Named 是 JSR330 规范中的注解,功能与 @Autowired 和 @Qualifier 完全相同,适用于不同架构场景
@Resource 是 JSR250 规范中的注解,可以简化书写格式
@Resource 相关属性
name:设置注入的 bean 的 id
type:设置注入的 bean 的类型,接收的参数为 Class 类型
8.11.10.加载 properties 文件
名称:@PropertySource
类型:类注解
位置:类定义上方
作用:加载 properties 文件中的属性值
范例:
说明:
不支持*通配格式,一旦加载,所有 spring 控制的 bean 中均可使用对应属性值
相关属性
value(默认):设置加载的 properties 文件名
ignoreResourceNotFound:如果资源未找到,是否忽略,默认为 false
8.11.11.纯注解格式
名称:@Configuration、@ComponentScan
类型:类注解
位置:类定义上方
作用:设置当前类为 spring 核心配置加载类
范例:
说明:
核心配合类用于替换 spring 核心配置文件,此类可以设置空的,不设置变量与属性
bean 扫描工作使用注解 @ComponentScan 替代
AnnotationConfigApplicationContext
加载纯注解格式上下文对象,需要使用 AnnotationConfigApplicationContext
8.11.12.第三方 bean 配置与管理
名称:@Import
类型:类注解
位置:类定义上方
作用:导入第三方 bean 作为 spring 控制的资源
范例:
说明:
@Import 注解在同一个类上,仅允许添加一次,如果需要导入多个,使用数组的形式进行设定
在被导入的类中可以继续使用 @Import 导入其他资源(了解)
@Bean 所在的类可以使用导入的形式进入 spring 容器,无需声明为 bean
8.12.小结
xml 与注解:
xml 更加万能,适用于任何场合!维护简单方便
注解 不是自己类使用不了,维护相对复杂!
xml 与 注解最佳实践:
xml 用来管理 bean;
注解只负责完成属性的注入;
我们在使用的过程中,只需要注意一个问题:必须让注解生效,就需要开启注解的支持
版权声明: 本文为 InfoQ 作者【楠羽】的原创文章。
原文链接:【http://xie.infoq.cn/article/326b90424caf4f11509db9818】。文章转载请联系作者。
评论