Spring 中 IOC 的常用注解
上一节介绍的 xml 配置:
1 2 3
| <bean id="" class="" scope="" init-method="" destroy-method=""> <property name="" value="" | ref=""></property> </bean>
|
用于创建对象的
与在 xml 配置文件中的 标签实现的功能一致
@Component:
作用:用于把当前类对象存入 Spring 容器中
属性:value
:用于指定 bean 的 id。如果不写,默认为当前类名,且首字母小写
还有三个和 @Component
作用一摸一样的注解:
@Controller
:一般用在表现层
@Service
:一般用在业务层
@Repository
:一般用在持久层
是 spring 框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰(这四个注解可以互换使用,但不推荐)
com\conv\service\impl\AccountServiceImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package com.conv.service.impl;
import com.conv.dao.IAccountDao; import com.conv.service.IAccountService; import org.springframework.stereotype.Component;
@Component("accountService")
public class AccountServiceImpl implements IAccountService {
private IAccountDao accountDao;
public AccountServiceImpl() { System.out.println("对象创建了"); }
@Override public void saveAccount() { accountDao.saveAccount(); } }
|
bean.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.conv"/>
</beans>
|
用于注入数据的
与在 xml 配置文件中在 标签中写一个 标签的作用一致
@Autowired
:
作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功。如果ioc容器中没有任何bean类型和要注入的变量类型匹配,则报错。如果有多个匹配时,先按照类型圈定数据类型,再按照名称去匹配,若都不匹配,则报错。
出现位置:可以是变量上,也可以是方法上。
细节:在使用注解注入时,set 方法就不是必须的了。
1 2
| @Autowired private IAccountDao accountDao;
|
@Qualifier
:
作用:在按照类中注入的基础上再按照名称注入,它给类成员注入时不能单独使用(需要和Autowired同时使用)。但是给方法参数注入时可以
属性:
value:用于指定注入bean的id
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
@Service("accountService")
public class AccountServiceImpl implements IAccountService {
@Autowired @Qualifier("accountDao") private IAccountDao accountDao;
@Override public void saveAccount() { accountDao.saveAccount(); } }
|
@Resource
:
作用:直接按照bean的id注入。它可以独立使用。
属性:
name:用于指定注入bean的id
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
@Service("accountService")
public class AccountServiceImpl implements IAccountService {
@Resource(name = "accountDao") private IAccountDao accountDao;
@Override public void saveAccount() { accountDao.saveAccount(); } }
|
注意,这里的 pom.xml
要增加一项:
1 2 3 4 5
| <dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency>
|
- 以上三个注解都只能注入其他 bean 类型的数据,而基本类型和 String 类型无法使用上述注解实现
- 另外:集合类型的注入只能通过 XML 来实现
@Value
:
作用:用于注入基本类型和 String 类型的数据
属性:
value:用于指定数据的值。它可以使用 spring 中 SpEL(也就是 spring 的el表达式)
SpEL 的写法:${表达式}
用于改变作用范围的
与在 标签中使用 scope
属性实现的功能一致
@Scope
:
作用:用于指定 bean 的作用范围
属性:
value:指定范围的取值。常用取值:singleton prototype
默认是单例的
和生命周期相关(了解)
与在 标签中使用 init-method
,destroy-method
属性实现的功能一致
@PreDestroy
:
作用:用于指定销毁方法
@PostConstruct
:
作用:用于指定初始化方法
案例
使用xml方式和注解的方式实现单表的CRUD操作
改造基于注解的IOC案例,使用纯注解的方式实现
Spring 的一些新注解使用
Spring 和 Junit 的整合