spring中基于IOC對bean進行管理
- 1.IOC容器的兩種實作方式
-
- 2.Bean對象的管理
-
- (1)基于xml配置檔案(略寫)
- (2)基于注解方式(常用)
1.IOC容器的兩種實作方式
- IOC(控制反轉)底層主要是通過xml解析,反射,工廠模式實作的
- IOC容器是基于IOC的具體是實作,可以把IOC容器了解成一個對象工廠
spring架構對IOC容器的實作提供了兩個兩個接口,一個是BeanFactory接口,另一個是BeanFactory的子接口ApplicationContext接口 通過實作這兩個接口,并加載配置檔案,進而完成對象的建立
差別:
BeanFactory接口:
- 是Spring内部的使用接口,不提供開發人員進行使用是
- 加載配置檔案時候不會建立對象,在擷取對象(使用)才去建立對象
ApplicationContext接口:
- BeanFactory接口的子接口,提供更多更強大的功能,一般由開發人員進行使用
- 加載配置檔案時候就會把在配置檔案對象進行建立,這樣的目的是在項目啟動的時候就把對象建立好,節約了資源,減少開銷;
2.Bean對象的管理
Bean對象的管理包含兩個方面:
- 對象的建立
- 注入屬性
(1)基于xml配置檔案(略寫)
對象建立:
注意:
- 建立對象預設是執行無參構造方法完成對象建立
- id屬性是該對象的名稱(是唯一辨別),class是該類的全類名
屬性注入:
可以通過
set方法
和
有參構造方法
兩種方式實作
(2)基于注解方式(常用)
1.其中對象建立的注解包括以下4個
@Component
@Controller
@Service
@Repository
這4個注解功能一樣,都是為了建立對象,
這樣做的目的是:在不同的子產品中使用不同的注解,友善程式員閱讀
在注解中value屬性值可以不寫,預設是類名小寫,類比xml中的id,
如果我們不想要預設值,可以自己設定;
//<bean id="userService" class=".."/>
@Component(value = "userService")
public class UserService {
public void add() {
System.out.println("service add.......");
}
}
2.屬性注入有以下4個注解
@Autowired
@Qualifier
@Resource
@Value
以下三個注解是針對
屬性是類
的情況:
@Autowired 是根據屬性的類型進行注入
@Service
public class UserService
{
//定義dao類型屬性
//不需要添加set方法
//添加注入屬性注解
@Autowired
private UserDao userDao;
public void add() {
System.out.println("service add.......");
userDao.add();
}
}
@Qualifier 是根據屬性的名字進行注入
@Resource 即可屬性的類型進行注入,也可根據屬性的名字進行注入
該注解是針對屬性是普通類型,比如String,int…
@Value
@Value(value = "abc")
private String name;
注意:
@Resource注解是javax擴充包中的,它不是spring架構中的,官方不推薦使用
@Autowired和@Qualifier一般一起使用;因為@Autowired注解根據屬性類型注入可能會報錯;
如果UserDao接口有多個實作類都被建立,此時我們使用@Autowired給UserDao注入時,spring不知道該把哪一個實作類注入,是以會報錯;
解決辦法:
通過@Qualifier注解,在value中寫明對象的名稱
@Autowired
@Qualifier(value = "userDaoImpl1")
private UserDao userDao;