一、概述
spring 基於註解的IoC與基於XML的IoC實現的功能是一樣的,只是配置的形式不同而已
二、常用註解
1. 用於創建對象的註解:同bean標籤
@Component
spring 通用組件的註解@Controller
spring 表現層組件註解@Service
spring 服務層組件註解@Repository
spring 持久層組件註解
屬性:value,用於指定組件的id,默認爲類的名稱,且首字母小寫
<?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.lizza"/>
</beans>
@Component
public class UserServiceImpl implements UserService {
@Override
public void saveUser(){
System.out.println("UserService: user saved!");
}
}
2. 用於注入數據的註解:同property標籤
@Autowired
自動按照類型注入,只要spring容器中有唯一的一個類型與被注入的bean類型相同的bean對象時,就可以注入成功
- 如果容器中沒有對應類型的bean時,則報NoUniqueBeanDefinitionException異常
- 容器中有多個對應類型的bean時,用變量名稱作爲id在spring容器中查找對應的bean,若沒有則報NoUniqueBeanDefinitionException異常
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public void saveUser(){
userDao.saveUser();
}
}
@Repository("userDao1")
public class UserDao1Impl implements UserDao {
@Override
public void saveUser() {
System.out.println("UserDao1: user saved!");
}
}
@Repository("userDao2")
public class UserDao1Impl implements UserDao {
@Override
public void saveUser() {
System.out.println("UserDao2: user saved!");
}
}
上面會報
NoUniqueBeanDefinitionException
異常
@Qualifier
按照類型注入的基礎上再按照bean的id去注入
- 在給類成員注入時,不能單獨使用
- 在給方法參數注入時,可以單獨使用
- 屬性value,用於指定bean的id
@Service
public class UserServiceImpl implements UserService {
@Autowired
@Qualifier("userDao2")
private UserDao userDao;
@Override
public void saveUser(){
userDao.saveUser();
}
}
- @Resource: 按照id注入,可以獨立使用
@Service
public class UserServiceImpl implements UserService {
@Resource(name = "userDao2")
private UserDao userDao;
@Override
public void saveUser(){
userDao.saveUser();
}
}
總結:以上的三個註解只能注入其他bean類型的數據,而不能注入基本類型和String類型的數據,另外集合類型的數據只能使用XML來注入
@Value
用於注入String類型和基本類型的數據,在註解的屬性值中可以使用SpEL(Spring的el表達式),即:${表達式}
- 屬性:value,用於指定屬性的值
@Repository
public class UserDao1Impl implements UserDao {
@Value("1")
int index;
@Override
public void saveUser() {
System.out.println("UserDao" + index + ": user saved!");
}
}
3. 用於描述作用範圍的註解:同scope屬性
@Scope
指定bean的作用範圍,常用取值:singleton,prototype;默認singleton
4. 用於配置生命週期的註解:同init-method和destroy-method屬性
@PostConstruct
用於指定初始化的方法,執行完構造器之後會執行,可以註解多個@PreDestroy
用於指定銷燬方法