首先需要建立的认知是:注解配置和XML配置要实现的功能 (都是为了降低程序间的耦合) 都是一样的,只是形式上的区别。
不管是XML配置还是注解配置都需要Sping的jar包的支持,所以开始之前都需要导入jar包
<!--Spring开发包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
编写业务层,以及添加注解
/**
* 账户业务层接口
*/
public interface AccountService {
/**
* 保存账户
*/
void saveAccount();
}
/**
* 账户的业务层实现类
*/
@Component(value = "accountService")
public class AccountServiceImpl implements AccountService {
public void saveAccount() {
System.out.println("调用了业务层方法......");
}
}
注解 | 功能 |
---|---|
@Component | 把资源让Spring来管理,相当于在XML中配置一个bean |
属性:value:相当于XML配置bean标签的id属性,如果不指定value属性值,默认值为当前类名,首字母小写。
@Component注解的三个衍生注解
三个衍生注解和@Component 注解的作用以及属性是一模一样的,只是标明所用层
注解 | 功能 |
---|---|
@Controller | 相当于在XML中配置一个bean, 一般用于表现层的注解 |
@Service | 相当于在XML中配置一个bean, 一般用于业务层的注解 |
@Repository | 相当于在XML中配置一个bean, 一般用于持久层的注解 |
那么我们则可以把上面实例代码中的@Component替换为@Service
编写XML配置并开启注解支持
<?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创建容器时 需要扫描的包-->
<context:component-scan base-package="com.liang.service"></context:component-scan>
</beans>
编写测试方法
@Test
public void configTest()
{
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
AccountService accountService = (AccountService)applicationContext.getBean("accountService");
System.out.println(accountService);
accountService.saveAccount();
}
业务层测试完毕 接下来测试持久层,以及关联各层。
编写持久层,以及添加注解
public interface AccountDao {
/**
* 保存账户
*/
void saveAccount();
}
@Repository(value = "accountDao")
public class AccountDaoImpl implements AccountDao {
public void saveAccount() {
System.out.println("保存了账户");
}
}
修改业务层,以及添加注解
修改方式一
@Service(value = "accountService")
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
public void saveAccount() {
accountDao.saveAccount();
}
}
注解 | 功能 |
---|---|
@Autowired | 自动按照数据类型注入,但只能注入其他bean类型,当容器中有唯一的bean对象类型和注入的变量类型匹配时,注入成功。如果容器中有多个类型匹配时候,则在类型匹配的基础上寻找bean的value值和注入的变量名相同的,没有相同的则报错。 (使用注解注入属性时,set方法可以省略) |
修改方式二
@Service(value = "accountService")
public class AccountServiceImpl implements AccountService {
@Autowired
@Qualifier(value = "accountDao")
private AccountDao accountDao;
public void saveAccount() {
accountDao.saveAccount();
}
}
注解 | 功能 |
---|---|
@Qualifier | 在自动注入的基础上,在按照bean的id值注入,此注解在注入属性时,不能独立使用,必须和@Autowired配合使用 |
修改方式三
@Service(value = "accountService")
public class AccountServiceImpl implements AccountService {
@Resource(name = "accountDao")
private AccountDao accountDao;
public void saveAccount() {
accountDao.saveAccount();
}
}
注解 | 功能 |
---|---|
@Resource | 直接按照bean的di值注入,属性name用于指定bean的id(value)值 |
修改XML配置
<!--Spring创建容器时 需要扫描的包-->
<context:component-scan base-package="com.liang"></context:component-scan>
进行测试
@Test
public void configTest()
{
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
AccountService accountService = (AccountService)applicationContext.getBean("accountService");
System.out.println(accountService);
accountService.saveAccount();
}
以上三种注入属性的方式,都只能注入其他bean类型,无法注入基本类型、String类型和集合类型数据。
基本类型、String类型注入
注解 | 功能 |
---|---|
@Value | 注入基本类型和String类型的数据 属性value用于指定值 |
集合类型数据只能XML配置
补充注解
注解 | 功能 |
---|---|
@Scope | 指定bean的作用范围, value属性取值 singleton、prototype、request、session、globalsession |
@PostConstruct | 用于指定初始化方法 |
@PreDestroy | 用于指定销毁方法 |