IOC註解
用於創建對象的註解
使用註解之前需要在XML文件裏面加上這句,否則註解產生的Bean不會出現在SpringIOC容器中
<context:component-scan base-package="com.lyl"></context:component-scan>
- @Component
作用:用於把當前類對象存入spring容器中
屬性:value:用於指定bean的id,不寫的時候 默認值爲當前類名且首字母小寫
@Component(value="accountService")
@Scope("singleton")
public class AccountServiceImpl implements AccountService {
@Resource(name="accountDao1")
private AccountDao accountDao;
}
}
- @Controller 表現層
- @Service 業務層
- @Repository 持久層
以上三個註解與Component的作用一致,起到語義化的作用
用於注入bean類型數據的註解
-
@ Autowired
作用:自動按照類型注入,只要容器中有唯一的一個bean對象類型和要注入的變量類型匹配,就可以注入成功
如果IOC容器中沒有任何bean的類型和要注入的變量類型匹配,則報錯
如果IOC有多個類型匹配(service裏面的dao變量有多個實現類)時,首先先按照數據類型進行劃分,再對變量名進行匹配
位置:
變量、方法上
好處:使用註解注入時,set方法就不是必須的了
鑑於上面多個實現類的問題 -
@Qualifier
作用:在按照類型中注入的基礎之上再按照名稱注入,(寫在autowired下)他在給類成員注入時不能單獨使用,但是在給方法參數注入時可以單獨使用
屬性:
value用於指定注入bean的id -
@ Resource
作用:直接按照bean的id注入,可以單獨使用
屬性:name用於指定注入bean的id
以上三個註解只能注入其他bean類型的數據,而基本類型和String類型無法使用上述註解實現
另外,集合類型的注入只能通過XML來實現
**注意:
對於 @Autowired
當一個接口有多個實現類的時候如何分辨當前這個類應該注入哪一個,他首先去這就要求這個Dao口的名字要和對應將實現類的加入容器的標籤的value(id)一致
例子:比如有一個accountDao接口 有Dao1 和 Dao2實現類
當我們在一個類裏面聲明
一個`
@Autowired
private accountDao Dao;
而且在上面使用這個註解的時候,spring首先判斷IOC容器是否有accountDao類型的Bean或者他的實現類,如果沒有就判斷是否有與Dao名字匹配的id的Bean,沒有就報錯
也就是說當我們聲明爲
private accountDao Dao1;
spring就會給我們注入Dao1實現類的Bean
爲避免這種情況我們直接使用@Qualifier(“Dao2”)註解指定使用Dao2實現類進行注入,但是這個註解要放在Bean下
@Resource
註解則可以單獨使用且指定id的Bean注入**
@Resource(name = "Dao2")
private AccountDao accountDao;
-
@ Value
作用:用於注入基本類型和String類型的數據
屬性:value 值,可以使用spring中的spEL ${} -
@ Scope
作用:指定bean的作用範圍, 用於改變作用範圍的註解
屬性:value singleton prototype
和生命週期相關的註解(瞭解) -
@ PreDestroy :指定銷燬方法
@PostConstruct
public void init(){
System.out.println("初始化");
}
- @ PostConstruct :指定初始化方法
@PreDestroy
public void destroy(){
System.out.println("銷燬");
}
純註解代替XML配置文件
首先任意創建一個類
package com.lyl.config;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
import javax.sql.DataSource;
/**
* 該類是一個配置類,用於與bean.xml一致
* spring新註解
* @ Configuration
* 作用:表明當前類是一個配置類
* 細節:當配置類作爲AnnotationConfigApplicationContext對象創建的參數時,該註解可以不寫
* @ ComponentScan
* 作用:用於通過註解指定spring在創建容器時要掃描的包等同於在xml配置了:<context:component-scan base-package="com.lyl"></context:component-scan>
* 屬性:
* value和basePackages一致
*@ Bean
* 作用:用於把當前方法的返回值作爲bean對象存入spring的ioc容器中
* 屬性:name:用於指定bean的id。默認值爲當前方法的名稱
* 細節:
* 當時用註解配置方法時,如果方法有參數,spring框架會去容器查找對應bean對象查找方式與autowired的方式一致
* @ Scope
* @ Import(jdbcConfig.class) 用於導入其他配置類
* @ PropertySource 導入參數文件
* 屬性:路徑 前面要加classpath
*/
@Configuration
@ComponentScans(@ComponentScan(basePackages = {"com.lyl"}))
@PropertySource("classpath:jdbc.properties")
public class SpringConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
/**
* 用於創建一個QueryRunner對象
* @param dataSource
* @return
*/
@Bean
@Scope("singleton")
public QueryRunner createQueryRuner(DataSource dataSource ){
return new QueryRunner(dataSource);
}
/**
* 創建數據源對象
* @return
*/
@Bean
public DataSource createDateSource(){
try{
ComboPooledDataSource ds=new ComboPooledDataSource();
ds.setDriverClass(driver);
//這裏的 &不用轉義符號 在XML纔要
ds.setJdbcUrl(url);
ds.setUser(username);
ds.setPassword(password);
return ds;
}catch (Exception e){
throw new RuntimeException(e);
}
}
}
-
@Configuration
作用:表明當前類是一個配置類
細節:當配置類作爲AnnotationConfigApplicationContext對象創建的參數時,該註解可以不寫 -
@ComponentScan
作用:用於通過註解指定spring在創建容器時要掃描的包等同於在xml配置了:
<context:component-scan base-package=“com.lyl”></context:component-scan>
屬性:
value和basePackages一致 -
@Bean
作用:用於把當前方法的返回值作爲bean對象存入spring的ioc容器中
屬性:name:用於指定bean的id。默認值爲當前方法的名稱
細節:
當時用註解配置方法時,如果方法有參數,spring框架會去容器查找對應bean對象查找方式與autowired的方式一致 -
@Import(jdbcConfig.class) 用於導入其他配置類
-
@PropertySource 導入參數文件
屬性:路徑 前面要加classpath
要注意使用純註解的時候得使用
AnnotationConfigApplicationContext作爲ApplicationContext的實現類