Spring注解@Component、@Repository、@Service、@Controlle

ph44 9年前發布 | 17K 次閱讀 Spring Spring MVC Web框架

很長時間沒做web項目都把以前學的那點框架知識忘光了,今天把以前做的一個項目翻出來看一下發現用·@Component標記一個組件,而網上有的用@Service標記組件,我暈就查了一下資料:

Spring 2.5 中除了提供 @Component 注釋外,還定義了幾個擁有特殊語義的注釋,它們分別是:@Repository、@Service 和 @Controller。
在目前的 Spring 版本中,這 3 個注釋和 @Component 是等效的,但是從注釋類的命名上,很容易看出這 3 個注釋分別和持久層、業務層和控制層(Web 層)相對應。
雖然目前這3 個注釋和 @Component 相比沒有什么新意,但 Spring 將在以后的版本中為它們添加特殊的功能。
所以,如果 Web 應用程序采用了經典的三層分層結構的話,最好在持久層、業務層和控制層分別采用上述注解對分層中的類進行注釋。

@Service用于標注業務層組件

@Controller用于標注控制層組件(如struts中的action)

@Repository用于標注數據訪問組件,即DAO組件

@Component泛指組件,當組件不好歸類的時候,我們可以使用這個注解進行標注。

@Service
public class VentorServiceImpl implements iVentorService {   
}
@Repository
public class VentorDaoImpl implements iVentorDao { 
}

在一個稍大的項目中,如果組件采用xml的bean定義來配置,顯然會增加配置文件的體積,查找以及維護起來也不太方便。 
Spring2.5為我們引入了組件自動掃描機制,他在類路徑下尋找標注了上述注解的類,并把這些類納入進spring容器中管理。
它的作用和在xml文件中使用bean節點配置組件時一樣的。要使用自動掃描機制,我們需要打開以下配置信息:

<?xml version="1.0" encoding="UTF-8" ?> 
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 
   
    <context:annotation-config />
    <context:component-scan base-package=”com.eric.spring”>   
</beans>

1.annotation-config是對標記了 Spring's @Required、@Autowired、JSR250's @PostConstruct、@PreDestroy、@Resource、JAX-WS's @WebServiceRef、EJB3's @EJB、JPA's @PersistenceContext、@PersistenceUnit等注解的類進行對應的操作使注解生效。
2.base-package為需要掃描的包(含所有子包),負責掃描那些類有注解。

 

getBean的默認名稱是類名(頭字母小寫),如果想自定義,可以@Service(“aaaaa”)這樣來指定。
這種bean默認是“singleton”的,如果想改變,可以使用@Scope(“prototype”)來改變。

可以使用以下方式指定初始化方法和銷毀方法:

@PostConstruct
public void init() { 
} 
@PreDestroy
public void destory() { 
}

注入方式:

把DAO實現類注入到action的service接口(注意不要是service的實現類)中,注入時不要new 這個注入的類,因為spring會自動注入,如果手動再new的話會出現錯誤,
然后屬性加上@Autowired后不需要getter()和setter()方法,Spring也會自動注入。  

在接口前面標上@Autowired注釋使得接口可以被容器注入,如:

@Autowired
@Qualifier("chinese")
private Man man;

當接口存在兩個實現類的時候必須使用@Qualifier指定注入哪個實現類,否則可以省略,只寫@Autowired。

 本文由用戶 ph44 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!