Spring入門Blog[五、Spring容器組建註解@Component和Resouces實現完全註解配置]
阿新 • • 發佈:2019-01-28
@Resource和@Component實現零XML配置 1、@Resource的註解: @Resource是J2EE的註解。意思是說在容器裡面找相應的資源。也可以通過name屬性指定它name的資源。可以註解到field或者setter上面 public class UserAction { private UserService userService; @Resource(name="userService") public void setUserService(UserService userService) { this.userService = userService; } public void addUser(){ userService.HelloWorld(); } } 2、@Component @Component和<context:component-scan base-package="com.spring"></context:component-scan>配合實現無XML配置,只通過註解配置及可將類放入資源容器中。 案例解析: 1、 xml檔案:配置容器資源掃描的包 <?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.spring"></context:component-scan> </beans> 2、 Java檔案: 標註資源的註解@Component。括號裡面指定的是存入容器的name屬性為userService 那麼將來我們拿的時候則getBean(“userService”)即可。如果我們不指定userService它預設存入容器bean的key為userServiceImpl這樣就可以得到一個裝有UserServiceImpl物件的容器 package com.spring.service; import org.springframework.stereotype.Component; import com.spring.dao.UserDao; @Component("userService") public class UserServiceImpl implements UserService{ private UserDao userDao; public void init(){ System.out.println("init"); } public void destory(){ System.out.println("destory"); } public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void HelloWorld(){ System.out.println("helloworld"); } } 通過@Resource將資源注入進來 因為上文已經配置了容器裡面的資源。所以我這裡將資源通過@Resource註解將資源注入到相關的屬性。請看程式碼: @Component("userAction") public class UserAction { private UserService userService; //它會將beans的xml檔案配置加入進去 //也可以使用name屬性指定byName的指定 @Resource(name="userService") public void setUserService(UserService userService) { this.userService = userService; } public void addUser(){ userService.HelloWorld(); } } 測試實現: 通過上文配置的userAction案例來得到這個物件然後呼叫它裡面的方法,因為上文通過了@ Component註解將UserAction的物件配置到了容器裡面。所以獲得容器之後就可以用這種方法getbean即可 @Test public void test01(){ BeanFactory applicationContext = new ClassPathXmlApplicationContext("beans.xml"); UserAction user = (UserAction) applicationContext.getBean("userAction"); user.addUser(); } @Scope和@PostConstruct、@PreDestroy 很簡單就相當於前面講到的作用於和initmethod和destorymethod請看下面程式碼。不再多說: @Scope("Singleton") @Component("userService") public class UserServiceImpl implements UserService{ private UserDao userDao; @PostConstruct public void init(){ System.out.println("init"); } @PreDestroy public void destory(){ System.out.println("destory"); } public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void HelloWorld(){ System.out.println("helloworld"); } }