spring沒有采用約定優於配置的策略,spring要求顯示指定搜索哪些路徑下的Java文件。spring將會把合適的java類全部注冊成spring Bean。
問題:spring怎麼知道把哪些Java類當初bean類處理? 這就需要使用annotation,spring使用一些特殊的annotation來標注bean類。 @Component:標准一個普通的spring Bean類。 @Controller:標注一個控制器組件類。 @Service:標注一個業務邏輯組件類。 @Repository:標注一個DAO組件類。 Bean實例的名稱默認是Bean類的首字母小寫,其他部分不變。 在spring未來的版本中,@Controller,@Service,@Repository會攜帶更多語義。盡量考慮使用@Controller,@Service,@Repository代替通用的@Component。 指定了某些類可作為Spring Bean類使用後,最好還需要讓spring搜索指定路徑,此時需要在spring配置文件中導入context Schema,並指定一個簡單的搜索路徑。<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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 自動掃描指定包及其子包下的所有Bean類 --> <context:component-scan base-package="org.crazyit.app.service"/> </beans>我們可以通過為<context:component-scan>添加<include-filter...>或<exclude-filter...>子元素來指定spring bean類,只要位於指定路徑下的java類滿足這種規則,即使這些java類沒有使用任何annotation標注,spring一樣會將他們當初bean類來處理。 <include-filter...>:滿足該規則的java類會被當初bean類處理。
<!-- 自動掃描指定包及其子包下的所有Bean類 --> <context:component-scan base-package="org.crazyit.app.service"> <!-- 只將以Chinese、Axe結尾的類當成Spring容器中的Bean --> <context:include-filter type="regex" expression=".*Chinese"/> <context:include-filter type="regex" expression=".*Axe"/> </context:component-scan>
@Resource位於java.annotation包下,來自於java EE規范的一個annotation。使用該annotation為目標bean指定協作者Bean。 @Resource詳細用法見經典javaEE企業應用實戰。
@Controller public class demo { @Resource(name="user") private User user; @Resource(name="user") public void setUser(User user) { this.user = user; } public User getUser() { return user; } }@Resource也可以直接修飾Filed,
@Controller("demo") @Scope("prototype") public class demo { }作用范圍就那4中填寫,不知道的等我博客,最近在回顧spring知識。 @PostConstruct和@PreDestory位於java.annotation包下。 在spring中用於定制spring容器中bean的生命周期行為。 @PostConstruct修飾的方法是bean的初始化之前的方法。
@Component public class SteelAxe { public SteelAxe() { System.out.println("創建SteelAxe類對象實例..."); } }demo1:
@Component public class Chinese { // 執行Field注入 @Resource(name="steelAxe") private SteelAxe steeAxe; public Chinese() { super(); System.out.println("創建Chinese類對象實例..."); } @PostConstruct public void init() { System.out.println("正在執行初始化的init方法..."); } @PreDestroy public void close() { System.out.println("正在執行銷毀之前的close方法..."); } }
// 創建Spring容器 AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); // 注冊關閉鉤子 ctx.registerShutdownHook();打印:
創建Chinese類對象實例...
創建SteelAxe類對象實例...
正在執行初始化的init方法...
正在執行銷毀之前的close方法...
如果注釋掉chinese的依賴注入,那麼結果如下:
@Component public class Chinese { // 執行Field注入 //@Resource(name="steelAxe") //private SteelAxe steeAxe; public Chinese() { super(); System.out.println("創建Chinese類對象實例..."); } @PostConstruct public void init() { System.out.println("正在執行初始化的init方法..."); } @PreDestroy public void close() { System.out.println("正在執行銷毀之前的close方法..."); } }打印:
創建Chinese類對象實例...
正在執行初始化的init方法...
創建SteelAxe類對象實例...
正在執行銷毀之前的close方法...