Spring学习笔记02

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;

/**
* 账户的业务层实现类
* 当只有一个属性 value 时,value 可以省略不写
*/
@Component("accountService")
//@Component(value = "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">

<!-- 告知spring在创建容器时要扫描的包,
配置需要的标签不是在beans的约束中,而是一个名称为context名称空间和约束中 -->
<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")
//@Service(value = "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")
//@Service(value = "accountService")
public class AccountServiceImpl implements IAccountService {

// @Autowired
// @Qualifier("accountDao")
@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操作

  • 持久层技术选型:dbutils

改造基于注解的IOC案例,使用纯注解的方式实现

Spring 的一些新注解使用

Spring 和 Junit 的整合

坚持原创技术分享,感谢您的支持和鼓励!