首先需要建立的認知是:註解配置和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 | 用於指定銷燬方法 |