spring之註解掃描
元件掃描(component scanning):
Spring 能夠從 classpath 下自動掃描, 偵測和例項化具有特定註解(annotation)的Bean.
Spring提供如下幾個Annotation來標註Spring Bean:
@Component: 標註一個普通的Spring Bean類
@Controller: 標註一個控制層元件類
@Service: 標註一個業務邏輯層元件類
@Repository: 標註一個DAO層元件類
以前例項化一個bean要在配置檔案中寫bean標籤:
有了這個掃描機制之後呢,只需要在類上加個註解,Spring容器一掃描到這個註解,就會自動例項化這個類。對於掃描到的類, Spring 有預設的命名策略:使用非限定類名,第一個字母小寫,也可以在註解中通過 value 屬性值標識元件的名稱。
@Component
public class A {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
當在元件類上使用了特定的註解之後, 還需要在 Spring 的配置檔案中宣告 <context:component-scan>
配置檔案中:
<!-- 控制元件掃描-->
<context:component-scan base-package="demo02.anno"></context:component-scan>
base-package 屬性指定一個需要掃描的基類包,Spring 容器將會掃描這個基類包裡及其子包中的所有類,當需要掃描多個包時, 可以使用逗號分隔。
測試類:
ApplicationContext context = new ClassPathXmlApplicationContext("/demo02/anno/configBeanSpring.xml");
A a =(A)context.getBean("a");
system.out.println(a);
使用value屬性命名:
@Component("aaa")
public class A {
private String name;
}
那麼在getBean的時候自然就要用aaa取了,不多BB。
Autowired自動裝配
Spring提供了@Autowired註解來指定自動裝配,@Autowired可以修飾setter方法、普通方法、例項變數和構造器等。當使用@Autowired標註setter方法時,預設採用byType自動裝配策略。
示範類:
@Repository
public class MyDAO {
/*
* 在配置檔案中定義好這個JdbcTemplate,在這裡加上
* Autowired註解,容器會自動把Bean裝配到這裡,因為
* Spring類的自動裝配機制預設是以型別裝配。
*
* 注意:Autowired不支援靜態變數的注入
*/
@Autowired
private JdbcTemplate template;
/**
* 執行查詢
*/
public List<Map<String, Object>> query(String sql){
return template.queryForList(sql);
}
}
配置檔案中定義好template即可。
Spring 還支援 @Resource 和 @Inject 註解,這兩個註解和 @Autowired 註解的功用類似
@Resource 註解要求提供一個 Bean 名稱的屬性,若該屬性為空,則根據型別裝配。
用法如下:
但是呢大部分專案都是用@Autowired進行裝配的,Resource還是比較少見,建議使用 @Autowired 註解。
@Resource是JDK自帶的註解,耦合度低
@Inject 和 @Autowired 註解一樣也是按型別匹配注入的 Bean, 但沒有 reqired 屬性
過濾掃描
過濾掃描
這個功能需要用以下兩個子標籤實現:
<context:include-filter> 子節點表示要包含的目標類
例子:
<context:include-filter type="annotation" expression="lesson02.anno.mvc.zhujie"/>
zhujie是一個自定義的註解,這行程式碼的意思呢就是告訴Spring容器,把使用了這個註解的類例項化。
<context:exclude-filter> 子節點表示要排除在外的目標類
例子:
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
排除使用了org.springframework.stereotype.Controller這個註解的類,使用了這個註解的類不會被Spring容器例項化。
type對應圖中的類別,expression則表示過濾規則。
這兩個子節點支援多種型別的過濾表示式:
通過註解用Java檔案來建立bean
以前配置jdbcTemplate是這樣的
Spring 4 中多了新特性,通過註解建立配置類,通過配置類來代替配置檔案。
通過 @Configuration 來使用java檔案建立bean
還是以JDBC為例子,新建一個配置類:
//使用註解獲取 jdbc.properties 裡面配置的值
@Value("${url}")
private String url;
@Value("${driverClass}")
private String driverClassName;
@Value("${userName1}")
private String userName;
@Value("${passWord2}")
private String password;
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource){
return new JdbcTemplate(dataSource);
}
@Bean
public DataSource dataSouce(){
DriverManagerDataSource dmds=new DriverManagerDataSource();
dmds.setUrl(url);
dmds.setDriverClassName(driverClassName);
dmds.setUsername(userName);
dmds.setPassword(password);
return dmds;
}
有了這個方法,那麼配置檔案中的JdbcTemplate就可以去掉了。