天天看點

spring中基于IOC容器對bean進行管理1.IOC容器的兩種實作方式

spring中基于IOC對bean進行管理

  • 1.IOC容器的兩種實作方式
    • 2.Bean對象的管理
      • (1)基于xml配置檔案(略寫)
      • (2)基于注解方式(常用)

1.IOC容器的兩種實作方式

  • IOC(控制反轉)底層主要是通過xml解析,反射,工廠模式實作的
  • IOC容器是基于IOC的具體是實作,可以把IOC容器了解成一個對象工廠
spring架構對IOC容器的實作提供了兩個兩個接口,一個是BeanFactory接口,另一個是BeanFactory的子接口ApplicationContext接口
spring中基于IOC容器對bean進行管理1.IOC容器的兩種實作方式
通過實作這兩個接口,并加載配置檔案,進而完成對象的建立

差別:

BeanFactory接口:

  • 是Spring内部的使用接口,不提供開發人員進行使用是
  • 加載配置檔案時候不會建立對象,在擷取對象(使用)才去建立對象

ApplicationContext接口:

  • BeanFactory接口的子接口,提供更多更強大的功能,一般由開發人員進行使用
  • 加載配置檔案時候就會把在配置檔案對象進行建立,這樣的目的是在項目啟動的時候就把對象建立好,節約了資源,減少開銷;

2.Bean對象的管理

Bean對象的管理包含兩個方面:

  • 對象的建立
  • 注入屬性

(1)基于xml配置檔案(略寫)

對象建立:

spring中基于IOC容器對bean進行管理1.IOC容器的兩種實作方式

注意:

  • 建立對象預設是執行無參構造方法完成對象建立
  • id屬性是該對象的名稱(是唯一辨別),class是該類的全類名

屬性注入:

可以通過

set方法

有參構造方法

兩種方式實作

spring中基于IOC容器對bean進行管理1.IOC容器的兩種實作方式
spring中基于IOC容器對bean進行管理1.IOC容器的兩種實作方式
spring中基于IOC容器對bean進行管理1.IOC容器的兩種實作方式
spring中基于IOC容器對bean進行管理1.IOC容器的兩種實作方式

(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;