<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Spring – 原型注解 > 原文: [https://howtodoinjava.com/spring-core/stereotype-annotations/](https://howtodoinjava.com/spring-core/stereotype-annotations/) 在[Spring 自動裝配](https://howtodoinjava.com/spring-core/spring-beans-autowiring-concepts/)中,`@Autowired`注解僅處理裝配部分。 我們仍然必須定義 bean,以便容器知道它們并可以為我們注入它們。 啟用`@Component`,`@Repository`,`@Service`和`@Controller`注解并啟用**自動組件掃描**后,Spring 會自動將 bean 導入容器并注入依賴項。 這些注解也稱為**原型注解**。 在開始使用這些注解的示例之前,讓我們學習有關這些注解的快速事實,這將有助于我們更好地決定何時使用哪種注解。 ## 1\. Spring bean 原型注解 #### 1.1. `@Component`注解 `@Component`注解將 Java 類標記為 Bean,因此 spring 的組件掃描機制可以將其拾取并將其拉入應用程序上下文。 要使用此注解,請將其應用于類,如下所示: ```java @Component public class EmployeeDAOImpl implements EmployeeDAO { ... } ``` #### 1.2. `@Repository`注解 盡管以上使用`@Repository`足夠好,但是我們可以使用更合適的注解,該注解專門為 DAO 提供額外的好處,即`@Repository`注解。 `@Repository`注解是`@Component`注解的特化,具有相似的用途和功能。 除了將 DAO 導入 DI 容器之外,還使**未經檢查的異常**(從 DAO 方法拋出)有資格將轉換為 Spring `DataAccessException`。 #### 1.3. `@Service`注解 `@Service`注解也是組件注解的一種特殊形式。 它目前不提供`@Component`注解以外的任何其他行為,但是最好在服務層類中使用`@Service`而不是`@Component`,因為**可以更好地指定意圖**。 此外,將來工具支持和其他行為可能會依賴它。 #### 1.4. `@Controller`注解 `@Controller`注解將一個類標記為 Spring Web MVC 控制器。 它也是`@Component`專長,因此標有它的 bean 將自動導入 DI 容器中。 當我們將`@Controller`注解添加到類中時,我們可以使用另一個注解,即`@RequestMapping`; 將 URL 映射到類的實例方法。 在**實際使用**中,我們將遇到非常罕見的情況,需要使用`@Component`注釋。 在大多數情況下,我們將使用`@Repository`,`@Service`和`@Controller`注解。 如果該類不屬于控制器,服務和 DAO 這三個類別中的任何一個,則應使用`@Component`。 > 如果我們想定義將要在 DI 容器中注冊的 bean 的**名稱**,則可以在**注解屬性**本身中傳遞該名稱,例如`@Service(employeeManager")`。 ## 2\. 啟用組件掃描 以上四個注解僅在由 Spring 框架的 DI 容器掃描時才進行掃描和配置。 要啟用此掃描,我們將需要在`applicationContext.xml`文件中使用`context:component-scan`標簽。 `applicationContext.xml` ```java <context:component-scan base-package="com.howtodoinjava.demo.service" /> <context:component-scan base-package="com.howtodoinjava.demo.dao" /> <context:component-scan base-package="com.howtodoinjava.demo.controller" /> ``` `context:component-scan`元素需要`base-package`屬性,顧名思義,該屬性指定了遞歸組件搜索的起點。 我們可能不希望將頂層軟件包交給 spring,所以您應該聲明三個`component-scan`元素,每個元素都具有指向另一個軟件包的`base-package`屬性。 聲明組件掃描后,您不再需要聲明`context:annotation-config`,因為在啟用組件掃描時隱式啟用了自動裝配。 ## 3\. 使用`@Component`,`@Repository`,`@Service`和`@Controller`注解 正如我已經說過的,您在 DAO,管理器和控制器類上使用`@Repository`,`@Service`和`@Controller`注解。 但是在現實生活中,在 DAO 和管理者層,我們經常有單獨的類和接口。 用于定義合同的接口,以及用于定義合同實現的類。 在哪里使用這些注解? 讓我們找出答案。 > 始終對**具體類**使用注解; 而不是通過接口。 ```java public interface EmployeeDAO { //... } @Repository public class EmployeeDAOImpl implements EmployeeDAO { //... } ``` 在 bean 上具有這些構造型注解后,就可以直接使用在具體類中定義的 bean 引用。 注意引用的類型為接口。 在這種情況下,Spring DI 容器足夠聰明,可以注入正確的實例。 ## 4\. `@Component`和`@Bean`注解之間的區別 在 Spring 中,兩個注解都大不相同。 `@Component`用于使用類路徑掃描自動檢測和自動配置 bean。 在帶注解的類和 Bean 之間存在隱式的一對一映射(即每個類一個 Bean)。 `@Bean`用于顯式聲明單個 bean,而不是讓 Spring 為我們自動完成。 另一個很大的區別是`@Component`是**類級別注解**,其中`@Bean`是**方法級別注解**,默認情況下,該方法的名稱用作 Bean 名稱。 ## 5\. 演示 #### 5.1. Bean 定義 `EmployeeDAO.java and EmployeeDAOImpl.java` ```java public interface EmployeeDAO { public EmployeeDTO createNewEmployee(); } @Repository ("employeeDao") public class EmployeeDAOImpl implements EmployeeDAO { public EmployeeDTO createNewEmployee() { EmployeeDTO e = new EmployeeDTO(); e.setId(1); e.setFirstName("Lokesh"); e.setLastName("Gupta"); return e; } } ``` `EmployeeManager.java and EmployeeManagerImpl.java` ```java public interface EmployeeManager { public EmployeeDTO createNewEmployee(); } @Service ("employeeManager") public class EmployeeManagerImpl implements EmployeeManager { @Autowired EmployeeDAO dao; public EmployeeDTO createNewEmployee() { return dao.createNewEmployee(); } } ``` `EmployeeController.java` ```java @Controller ("employeeController") public class EmployeeController { @Autowired EmployeeManager manager; public EmployeeDTO createNewEmployee() { return manager.createNewEmployee(); } } ``` `EmployeeDTO.java` ```java public class EmployeeDTO { private Integer id; private String firstName; private String lastName; } ``` #### 5.2. 運行演示 讓我們測試上述配置和注解: `TestSpringContext.java` ```java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.howtodoinjava.demo.service.EmployeeManager; public class TestSpringContext { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //EmployeeManager manager = (EmployeeManager) context.getBean(EmployeeManager.class); //OR this will also work EmployeeController controller = (EmployeeController) context.getBean("employeeController"); System.out.println(controller.createNewEmployee()); } } ``` 程序輸出。 `Console` ```java Jan 22, 2015 6:17:57 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1b2b2f7f: startup date [Thu Jan 22 18:17:57 IST 2015]; root of context hierarchy Jan 22, 2015 6:17:57 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO: Loading XML bean definitions from class path resource [applicationContext.xml] Employee [id=1, firstName=Lokesh, lastName=Gupta] ``` 如果需要更多說明,請給我評論/查詢。 學習愉快! 閱讀更多: [`@Component`與`@Bean`](https://stackoverflow.com/questions/10604298/spring-component-versus-bean) [`@Component`注解](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html) [`@Repository`注解](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Repository.html) [`@Service`注解](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Service.html) [`@Controller`注解](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Controller.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看