使用注解实现IoC
一、注解定义Bean组件
Spring从2.0版本开始引入注解的配置方式,将Bean的配置信息和Bean实现类结合在一起,进一步减少了配置文件的代码量。
@Component("userDao") public class UserDaoImpl implements UserDao{ //省略 }
@Component("userDao")的作用与在XML配置文件中编写<bean id="userDao" class="edu.cn.dao.Impl.UserDaoImpl"/>等效。
除了@Component,Spring还提供了3个特殊的注解,如下
- @Repository 用于标注DAO类
- @Service 用于标注业务类
- @Controller 用于标注控制器类
二、注解装配Bean组件
1、@Autowired注解
Spring提供了@Autowired注解实现Bean的装配,如下
import org.springframework.stereotype.Service import org.springframework.beans.factory.annotation.Autowired @Service("userService") public class UserServiceImpl implements UserService{ @Autowired private UserDao dao; }
@Autowired为dao属性注入所依赖的对象,Spring将直接对dao属性进行赋值,此时类中可以省略属性相关的setter方法。
@Autowired采用按类型匹配的方式为属性自动装配合适的依赖对象,即容器会查找和属性类型相匹配的Bean组件,并自动为属性注入。若容器中有一个以上类型相匹配的Bean时,则可以使用@Qualifier指定所需的Bean的名称。
import org.springframework.stereotype.Service import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Qualifier @Service("userService") public class UserServiceImpl implements UserService{ //为dao属性注入名为userDao的Bean @Autowired @Qualifier("userDao") private UserDao dao; }
1.1、@Autowired注解扩展
- @Autowired也可以对方法的入参进行标注,如下
@Service("userService") public class UserServiceImpl implements UserService{ private UserDao dao; @Autowired public void setDao(@Qualifier("userDao") UserDao dao){ this.dao = dao; } }
- @Autowired也可用于构造方法,实现构造注入,如下
@Service("userService") public class UserServiceImpl implements UserService{ private UserDao dao; @Autowired public UserServiceImpl(@Qualifier("userDao") UserDao dao){ this.dao = dao; } }
- 使用@Autowired注解进行装配时,如果找不到相匹配的Bean组件,Spring容器会抛出异常。此时如果依赖不是必需的,为避免抛出异常,可以将required属性设置为false。默认为true,如下
@Service("userService") public class UserServiceImpl implements UserService{ @Autowired(required = false) private UserDao dao; }
- 如果对类中集合类型的成员变量或方法入参使用@Autowired注解,Spring会将容器中所有和集合中元素类型匹配的Bean组件都注入进来,如下
@Component public class TaskQueue{ @Autowired(required = false) private List<Job> toDoList; }
在上述代码中,Spring会将Job类型的Bean组件都注入给toDoList属性。
2、@Resource注解
Spring还支持使用JSR-250中定义的@Resource注解实现组件装配,该注解也能对类的成员变量或方法入参提供注入功能。
JSR全称是Java Specification Requests,即Java规范提案。Java的版本及其功能在不断的更新和扩展,JSR就是用来规范这些功能及其接口的标准,已经成为Java业界的一个重要标准。
@Resource有一个name属性,默认情况下,Spring将这个属性的值解释为要注入的Bean的名称,如下
@Service("userService") public class UserServiceImpl implements UserService{ @Resource(name = "userDao") private UserDao dao; }
如果没有显示的指定Bean的名称,@Resource注解将根据字段名或者setter方法名产生默认的名称。如果注解应用于字段,将使用字段名作为Bean的名称;如果注解应用于setter方法,Bean的名称就是通过setter方法得到的属性名,如下
@Service("userService") public class UserServiceImpl implements UserService{ //查找名为dao的Bean,并注入给dao属性 @Resource private UserDao dao; }
@Service("userService") public class UserServiceImpl implements UserService{ //查找名为userDao的Bean,并注入给setter方法 private UserDao dao; @Resource public void setUserDao(UserDao userDao){ this.dao = userDao; } }
如果没有显示的指定Bean的名称,且无法找到与默认Bean名称匹配的Bean组件,@Resource注解会由按名称查找的方式自动变为按类型匹配的方式进行装配。
三、加载注解定义的Bean组件
在XML配置文件中使用context命名空间下的component-scan标签扫描注解标注的类。bace-package属性指定了需要扫描的基准包(多个包可用逗号隔开)。Spring会扫描这些包中所有的类,获取Bean的定义信息。
<?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 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="service,dao"/> </beans>
原文地址:https://www.cnblogs.com/yanguobin/p/11704036.html
- 重温delphi之控制台程序:Hello World!
- Docker集中化web界面管理平台-Shipyard部署记录
- "Goole项目托管"及"CodePlex发布开源项目"要点
- Docker网络解决方案-Calico部署记录
- c#中开发ActiveX的学习笔记
- Android新手之旅(4) 通过HTTP访问web
- Flash/Flex学习笔记(9):ActionScript3.0与Javascript的相互调用
- Flash/Flex学习笔记(8):ActionScript3.0中的面对对象
- Docker网络解决方案-Weave部署记录
- Flash/Flex学习笔记(7):FMS3.5基于IIS的安装
- Netdata---Linux系统性能实时监控平台部署记录
- linux下向一个文件中的某行插入数据的做法
- Flash/Flex学习笔记(2):捕获摄像头
- split-brain 脑裂问题(Keepalived)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法