Spring注解的使用和組件掃描


非常重要】 組件掃描(Component-Scan)

  • 通過配置組件掃描,可以使得spring自動掃描package,而不必在spring的配置文件中逐一聲明各個<bean>
  • 在配置組件掃描時,指定的包是“根包”,即例如指定了cn.tedu.spring,spring不只會掃描這個包,還會掃描它的各個層級子包,例如:cn.tedu.spring.dao
  • 直接在spring的配置文件中開啟組件掃描即可 <context:component-scan base-package="cn.tedu.spring"></context:component-scan>
  • 注意: 僅僅開啟組件掃描spring是不會自動管理bean的,而是自動的掃描package,要想自動管理bean,那么還需要配置注解

注解

  • 在類的聲明上方添加@Component注解,可以是的spring知道這個類是一個組件,需要進行管理,所以如過某個類需要被Spring管理,應該將這個類放在被掃描的包中,並且添加注解
  • 由Spring掃描到的組件(由@Component注解標記的類),會由Spring自動設置Bean Id,值為將類名首字母小寫的名稱,例如組件類的名稱是UserDao,則配置的Bean的id是userDao,如果需要自定義Bean,那么可以直接在注解中設置,比如@Component("id")

前提

  • 一定要是在開啟組件掃描的包下使用注解,否則將不會掃描到配置的注解

常用注解

  • 可以混用,暫時這幾個注解沒有差異,完全功能相同,但是我們還是要根據規則使用
  • @Component : 通用注解
  • @Service : 用於對業務邏輯類的注解(Service層)
  • @Controller : 用於對控制器類的注解
  • @Repository :用於對持久層處理類的注解(Dao層)
  • @Named :通用注解(不用)
  • 以上5個注解從實現目標和效果是等效的,但是基於方便理解代碼的目的,應該按需使用,了;例如對名為UserService類的,應該使用@Service

其他注解

@Scope

  • 在類的聲明語句上方添加這個注解,用於設置bean的作用域,比如@Scope("prototype")表示非單例,默認是單例

@Lazy

  • 在單例模式下設置是否懶加載,例如@Lazy("true")用於設置成懶加載
  • 在類的聲明語句上方添加
  • 前面之前已經說過,在創建Bean的時候默認使用的是單例模式下的餓漢式的創建,即是在spring配置文件加載的時候創建

@PostConstruct

  • 將方法設置為生命周期的初始化方法
  • 設置初始化方法,直接在初始化方法的聲明語句中添加即可
    
    @PostConstruct   
    public void init(){ System.out.println("初始化方法"); }

@PreDestroy(單例模式下才會銷毀)

  • 在方法的聲明語句上方使用,可以將這個方法設置為生命周期的銷毀方法
@PreDestroy   
    public void destroy(){ System.out.println("銷毀方法"); }

注入值

@Autowired (不推薦使用)

  • 在類中,在聲明屬性的上方添加@Autowired,用於標記該屬性是自動裝配值
  • 這種自動裝配默認按照類型(byType)實現自動裝配
  • 如果需要按照名稱(byName)來自動裝配,還需要使用@Qualifier("userDao")來組合使用,注解中配置的名稱是需要注入的值的Bean-Id
  • UserDao
@Repository("userDao") public class UserDaoImpl implements UserDao{ public void reg() { System.out.println("reg"); } }
  • UserService
@Service
public class UserService { @Autowired @Qualifier("userDao") private UserDao userDao; public void reg(){ userDao.reg(); } }

@Resource (推薦使用)

  • 在需要注入的屬性的上方添加該注解
  • 默認先按照名稱來自動裝配的(byName),如果名稱對應不上,那么按照類型(byType)進行匹配
    @Resource   
    private UserDao userDao;
  • 如果使用@Resource(name="userDaoImpl"),name屬性指定的是Bean Id,添加了name屬性,那么只是按照名稱來裝配,如果這個名稱對應的Bean不存在,那么就注入失敗
    @Resource(name="userDaoImpl") private UserDao userDao;

@Value

  • 使用@Value注解添加在屬性的聲明的上方,可以對屬性注入值
  • 直接注入值
    @Value("陳加兵") private String name;
  • 在使用@Value("#{beanId.屬性名}")的注解時還可以使用Spring表達式

 

https://cloud.tencent.com/developer/article/1120386


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM