一. 使用注解的好处
(1)直接将Bean注册到IoC容器中,无需为Bean编写xml配置文件,提高了开发效率
(2)进行注入依赖时,也无需在Bean类中提供setter方法
二. 使用注解实现IoC的开发步骤
1. 修改spring.xml配置文件—添加context命名空间的声明
使用注解时,需要告诉Spring在创建IoC容器时,把哪些类作为Bean注册到IoC容器中 因此需要配置一个标签进行包扫描,包下的所有类将被自动注册到IoC容器中
该标签没有定义在beans名称空间中,而是在名称为context名称空间中定义的,所以注解配置的第一步是添加context名称空间
<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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
2. 添加<context:component-scan/>标签配置自动扫描包
<context:component-scan base-package="包名"/>
Spring将会自动扫描base-package属性所指定的包及其子包中的所有类,一旦检测到此类中使用了注解,就自动将此类的对象作为Bean注册到IoC容器中,此方式比在配置文件中编写标签更简单
3. 使用注解将Bean组件自动注册到IoC容器中
(1)老版注解
@Component 在Bean类上标注@Component注解后,Bean组件将自动注册到IoC容器中
@Component(value=“bean在IoC容器中的id”) 如果不指定value属性,则Bean的名称默认为类名的首字母小写形式 如果注解中只包含value属性时,属性名可以省略
@Component
@Component(value="user")
@Component("user")
public class User{...}
【特点】@Component注解在MVC各层中通用,语义不清晰
(2)新版注解
@Controller—表现层专用的注解,表示该Bean是一个控制器对象
@Controller
public class UserController{...}
@Service—业务层专用的注解,表示该Bean是一个业务对象
@Service(value="userService")
public class UserServiceImpl implements UserService{...}
@Repository—持久层专用的注解,表示该Bean是一个DAO对象
@Repository("userDAO")
public class UserDAOImpl implements UserDAO{...}
【特点】在MVC各层中使用专用的注解,语义清晰
三. Bean的作用范围
在Bean类上标注@Scope注解
@Scope(value="singleton|prototype")
public class User{...}
四. Bean的生命周期
(1)在初始化方法上标注@PostConstruct注解
@PostConstruct
public void init(){...}
(2)在销毁方法上标注@PreDestroy注解
@PreDestroy
public void destroy(){...}
五. Bean的依赖注入
1. 注入简单类型的数据
(1)在Bean类的属性上标注@Value注解 (2)无需提供属性的setter方法
2. 注入对象类型的数据
(1)在Bean类的属性上标注@AutoWired注解或@Resource注解 (2)无需提供属性的setter方法
【方式1】根据Bean的类型注入
(1)在Bean类的属性上标注@AutoWired注解,该注解在IoC容器中查找指定类型的Bean对象,自动完成依赖关系的注入
(2)@Autowired注解只能按类型匹配Bean,如果IoC容器中有多个类型相同的Bean,则抛出异常
(3)如果存在上述情况,可以配合使用@Qualifier注解,再进一步按名称匹配Bean 默认名称是类名的首字母小写,也可以通过value属性要查找的指定Bean名称 @Qualifier注解不能单独使用,必须配合@Autowired注解一起使用
@Autowired
@Qualifier("userService")
private UserService userService;
【方式2】根据Bean的名称注入
(1)在Bean类的属性上标注@Resource注解,默认在IoC容器中查找名称为类名的首字母小写的Bean,可以使用name属性指定要查找的Bean名称
(2)如果按照名称无法匹配Bean,@Resource注解再按照类型查找,可以使用type属性指定要查找的Bean类型
@Resource(name="userDAO")
private UserDAO userDAO;
@Autowired注解和@Resource注解的区别
【区别1】@Autowired默认按照类型查找Bean,按名称查找时,需要配合@Qualifier注解一起使用 @Resource默认按照名称查找Bean,比较方便
【区别2】@Autowired是Spring框架提供的注解 @Resource是JSR250规范提供的Java注解
JSR—Java Specification Requests—Java规范提案 JSR是指向JCP(JavaCommunity Process)提出新增一个标准化技术规范的正式请求 【参考网址】https://blog.csdn.net/u013182960/article/details/90257159
@Resource的装配顺序 了解
(1)同时指定了name和type属性,则根据名称和类型查找,找不到则抛出异常 (2)只指定了name属性,则根据名称查找,找不到则抛出异常 (3)只指定了type属性,则根据类型查找唯一匹配Bean,找不到或者找到多个都会抛出异常 (4)既没有指定name属性,也没有指定type属性,则先根据名称查找,如果找不到,再根据类型查找,如果还找不到,最终抛出异常
- 注入集合类型的参数
对于array,list,set,map,properties等集合类型,元素的数据无法使用注解注入,只能通过XML配置实现
Spring系列学习笔记会每日更新,欢迎大家关注订阅点赞!!!
|