在這里我們要詳細說明一下利用Annotation-注解來裝配Bean。
因為如果你學會了注解,你就再也不願意去手動配置xml文件了,下面就看看Annotation的魅力所在吧。
先來看看之前的bean注解裝配例子:
package com.eco.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.eco.dao.UserDao; import com.eco.model.User; @Service public class Userservice { //@Autowired private UserDao userdao; public void setUserdao(UserDao userdao) { this.userdao = userdao; } public void useradd(User newuser) { userdao.adduser(newuser); } }
package com.eco.daoimp; import org.hibernate.Session; import org.hibernate.Transaction;import org.springframework.stereotype.Repository; import com.eco.hibernate.HibernateSessionFactory; import com.eco.dao.UserDao; import com.eco.model.User; @Repository public class Usertodo1 implements UserDao { public void adduser(User user) { Session session = HibernateSessionFactory.getSession(); Transaction transaction = session.beginTransaction(); session.save(user); transaction.commit(); session.close(); System.out.println("todo1 create the user"); } }
由於這里只是講注解,為了讓代碼看得更加清晰,就省略了方法內部的注釋。
1.組件注解
@controller 控制器(注入服務)
@service 服務(注入dao)
@repository dao(實現dao訪問)
@component (泛指組件,當組件不好歸類的時候,我們可以使用這個注解進行標注。)
其實在Annotation設計之初,是定義了四個組件注解的,每個組件注解聲明該組件的功能,但是由於某種原因,這些設計
思想並未真正實現,以至於上面的四個組件注解都是一樣的,沒有任何區別;
所以當你搞不清當前要注解的類到底是dao層,service層,還是controller層時,建議使用@component注解;
或者說所有組件類都用@component注解,不然,萬一dao層類你用了@service注解,雖然代碼能夠正常運行,但是明眼
人一看就知道你不專業,連dao層和service層都搞不清。
2.Autowired注解
采用@Autowired注解的成員變量、setter方法、構造方法(對應依賴注入的接口注入、setter注入、構造器注入),會讓
Spring去做一件事:去所有@component注解的類里面找和我類型相同的,並裝配到bean中,它默認是byType的,所以
如果你為多個與之類型相同的類注解了@component,那么Spring就說:我找到了好多和你類型相同的,這下該怎么辦啊。
然后華麗麗地報錯了。
所以我們建議在使用組件注解時給它起個名字,方式為@component("eco"),如果不自定義的話,Spring默認為組件起個
名字,這個名字就是該組件類名首字母小寫。
那么在@Autowired(name="eco"),這樣顯式地聲明注入的組件名稱為eco,就不會出錯了,但是你別故意注入一個類型不
匹配的,那就沒意思了。
3.Resource注解
@Resource是一個比@Autowired注解功能更強大的注解,並且更易於理解;
@Autowired(name="eco")========@Resource(name="eco"),這兩種注解功能是一樣的,都能實現往此處注入一個名為
eco的類(資源)。
如此一來,就可以實現幾個注解來實現xml文件手動裝配bean的的功能了。
組件使用@Component注解,需要注入依賴(資源)就使用@Resource注解。