Java開發經常使用的幾個註解

Java開發經常使用的註解有@Mapper @Repository(持久層)、@Service(業務層)、@Controller (控制層)和 @Component(其它),以及@Autowired 和@Resourcehtml

@Mapper

從mybatis3.4.0開始加入了@Mapper註解,添加@Mapper註解的接口生成一個實現類,目的就是爲了避免再寫mapper映射文件, 把mapper這個DAO交給Spring管理。java

@Repository

@Repository對應數據訪問層Bean ,例如:spring

@Repository(value="userDao")
public class UserDaoImpl extends BaseDaoImpl<User> {
 ………
}

@Repository(value="userDao")註解是告訴Spring,讓Spring建立一個名字叫「userDao」的UserDaoImpl實例。數據庫

當Service須要使用Spring建立的名字叫「userDao」的UserDaoImpl實例時,就可使用@Resource(name = "userDao")註解告訴Spring,Spring把建立好的userDao注入給Service便可。安全

 // 注入userDao,從數據庫中根據用戶Id取出指定用戶時須要用到
 @Resource(name = "userDao")
 private BaseDao<User> userDao;

 

 

@Controller

@Controller對應表現層的Bean,也就是Action,例如:mybatis

 @Controller
 @Scope("prototype")
 public class UserAction extends BaseAction<User>{
 ……
}

使用@Controller註解標識UserAction以後,就表示要把UserAction交給Spring容器管理,在Spring容器中會存在一個名字爲"userAction"action,這個名字是根據UserAction類名來取的。注意:若是@Controller不指定其value【@Controller】,則默認的bean名字爲這個類的類名首字母小寫,若是指定value【@Controller(value="UserAction")】或者【@Controller("UserAction")】,則使用value做爲bean的名字app

這裏的UserAction還使用了@Scope註解,@Scope("prototype")表示將Action的範圍聲明爲原型,能夠利用容器的scope="prototype"來保證每個請求有一個單獨的Action來處理,避免strutsAction的線程安全問題。spring 默認scope 是單例模式(scope="singleton"),這樣只會建立一個Action對象,每次訪問都是同一Action對象,數據不安全,struts2 是要求每次次訪問都對應不一樣的Actionscope="prototype" 能夠保證當有請求的時候都建立一個Action對象ui

@Service

@Service對應的是業務層Bean,例如:this

 @Service("userService")
 public class UserServiceImpl implements UserService {
 ………
}

@Service("userService")註解是告訴Spring,當Spring要建立UserServiceImpl的的實例時,bean的名字必須叫作"userService",這樣當Action須要使用UserServiceImpl的的實例時,就能夠由Spring建立好的"userService",而後注入給Action:在Action只須要聲明一個名字叫「userService」的變量來接收由Spring注入的"userService"便可,具體代碼以下:prototype

 // 注入userService
 @Resource(name = "userService")
 private UserService userService;

但如今本身不能主動去new「UserServiceImpl」類的實例,new「UserServiceImpl」類的實例的權力已經被Spring拿走了,只有Spring纔可以new「UserServiceImpl」類的實例,而Action只能等Spring建立好「UserServiceImpl」類的實例後,再「懇求」Spring把建立好的「UserServiceImpl」類的實例給他,這樣他纔可以使用「UserServiceImpl」,這就是Spring核心思想「控制反轉」,也叫「依賴注入」,「依賴注入」也很好理解,Action須要使用UserServiceImpl幹活,那麼就是對UserServiceImpl產生了依賴,Spring把Acion須要依賴的UserServiceImpl注入(也就是「給」)給Action,這就是所謂的「依賴注入」。對Action而言,Action依賴什麼東西,就請求Spring注入給他,對Spring而言,Action須要什麼,Spring就主動注入給他。

 

@Component

@Component泛指組件,當組件很差歸類的時候,咱們可使用這個註解進行標註。    

 

 

@Resource和@Autowired

@Resource和@Autowired都是作bean的注入時使用,其實@Resource並非Spring的註解,它的包是javax.annotation.Resource,須要導入,可是Spring支持該註解的注入。

一、共同點

二者均可以寫在字段和setter方法上。二者若是都寫在字段上,那麼就不須要再寫setter方法。

二、不一樣點

@Autowired註解是按照類型(byType)裝配依賴對象,默認狀況下它要求依賴對象必須存在,若是容許null值,能夠設置它的required屬性爲false。若是咱們想使用按照名稱(byName)來裝配,能夠結合@Qualifier註解一塊兒使用(@Service註解必須寫名字)。以下:

public class TestServiceImpl {
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao; 
}

@Resource

@Resource默認按照ByName自動注入,由J2EE提供,須要導入包javax.annotation.Resource。@Resource有兩個重要的屬性:name和type,而Spring將@Resource註解的name屬性解析爲bean的名字,而type屬性則解析爲bean的類型。因此,若是使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。若是既不制定name也不制定type屬性,這時將經過反射機制使用byName自動注入策略。

 

public class TestServiceImpl {

    // 下面兩種@Resource只要使用一種便可

    @Resource(name="userDao")

    private UserDao userDao; // 用於字段上

   

    @Resource(name="userDao")

    public void setUserDao(UserDao userDao) { // 用於屬性的setter方法上

        this.userDao = userDao;

    }

}

 

注:最好是將@Resource放在setter方法上,由於這樣更符合面向對象的思想,經過set、get去操做屬性,而不是直接去操做屬性。

相關文章
相關標籤/搜索