首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring 進階:註解驅動 Bean 注入完整指南

     編輯:Java 綜合教學

Spring 註解式依賴注入詳解

前幾篇文章皆採用 XML 配置 Bean,應讀者要求,本文將系統講解基於註解的依賴注入方式。內容淺顯易懂,避免複雜程式碼,助您快速掌握核心概念。

核心刻型註解

以下四個註解用於標記 Spring 應管理的類別,啟用組件掃描後,單例模式下容器啟動時會自動實例化:

  • @Controller:標記控制層組件
  • @Service:標記業務邏輯層組件
  • @Repository:標記資料存取層組件
  • @Component:通用組件標記,上述三者實為其特化

非單例模式下,實例創建時機取決於客戶端請求(由 Spring 代理創建),詳見《Spring 進階之路(7)-Bean 生命週期》一文。

依賴注入註解

  • @Resource:按名稱注入,屬 JDK 標準註解,專案中廣泛使用
  • @Autowired:按類型自動裝配,Spring 專有註解

兩者皆用於將已實例化的 Bean 注入目標類屬性中。

生命週期與作用域註解

  • @Scope("prototype"):宣告多例模式,預設為單例
  • @PostConstruct:指定初始化回調方法,對應 XML 的 init-method
  • @PreDestroy:指定銷毀前回調方法,對應 XML 的 destroy-method

其他實用註解

  • @Lazy:取消預初始化,參數為 boolean
  • @DependsOn:強制優先初始化指定 Bean,可修飾類或方法

實戰演示:簡化版用戶登入

啟用註解掃描

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
       xmlns:context="https://www.springframework.org/schema/context"
       xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
         https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans-4.0.xsd
         https://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context-4.0.xsd">
  <context:component-scan base-package="com.siti.spring20160316" />
</beans>

控制層

@Controller
@Scope("prototype")
public class UserAction {
    @Resource private UserService userService;
    @Autowired private Utils utils;

    public boolean login(String userName, String password) {
        System.out.println("UserAction--login");
        if (utils.check(userName)) {
            return userService.login(userName, password);
        }
        return false;
    }
}

業務層

@Service
public class UserService {
    @Resource private UserDao userDao;

    public boolean login(String userName, String password) {
        System.out.println("UserService--login");
        return userDao.isExist(userName, password);
    }

    @PostConstruct public void init() { System.out.println("UserService--init"); }
    @PreDestroy public void destroyMethod() { System.out.println("UserService--destroyMethod"); }
}

資料存取層

@Repository
public class UserDao {
    public boolean isExist(String userName, String password) {
        System.out.println("UserDao--isExist");
        return "wy".equals(userName);
    }
}

測試驗證

public class MainTest {
    public static void main(String[] args) {
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext20160316.xml");
        UserAction action = (UserAction) context.getBean("userAction");
        UserAction action2 = (UserAction) context.getBean("userAction");
        System.out.println("是否同一實例:" + action.equals(action2)); // 輸出 false,驗證 prototype 生效
        
        boolean success = action.login("wy", "******");
        System.out.println(success ? "登入成功!" : "登入失敗!");
        context.registerShutdownHook();
    }
}

自定義註解探索

以下示範定義一個簡單的 @MyAutowired 註解(僅為演示,需配合處理器才能生效):

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
public @interface MyAutowired {
    String name() default "";
}

讀者可嘗試自行實現對應的處理器,歡迎交流心得。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved