1. 程式人生 > >spring之註解掃描

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

    

不使用value屬性標識Bean的名稱,預設以類名小寫命名。 

當在元件類上使用了特定的註解之後, 還需要在 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就可以去掉了。