5.spring:註解配置 Bean
在classpath中掃描元件
組鍵掃描:能夠從classpath下自動掃描,偵測和例項化具有特定註解的元件
特定的元件包括:
->@Componment:基於註解,標識一個受Spring管理的組鍵
->@Respository:標識持久層元件
->@Service:標識服務層
->@controller:標識表現層元件
對於掃描到的元件,Spring有預設的命名策略,使用非限定類名,第一個字母小寫,也可以通過註解中value屬性值標識組建的名稱
在classpath中掃描組鍵
當在組鍵類中使用了特定的註解後,還需要再Spring的配置中宣告<context:componment-scan>
->base-packge屬性是指定一個需要掃描的基類包,Spring容器將會掃描這個基類包裡及其他子類包中的所有類
->當需要掃描多個包時,可以使用逗號分隔
->如果僅希望掃描特定類而非集包下的所有類,可使用resource-pattren屬性過濾特定的類
通常情況下我們在建立spring專案的時候在xml配置檔案中都會配置這個標籤,配置完這個標籤後,spring就會去自動
掃描base-package對應的路徑或者該路徑的子包下面的java檔案,
如果掃描到檔案中帶有@Service,@Component,@Repository,@Controller等這些註解的類,則把這些類註冊為bean
注:在註解後加上例如@Component(value=”abc”)時,註冊的這個類的bean的id就是abc.
TestObject.java
@Componentpublic class TestObject { //@Componment:基於註解,標識一個受Spring管理的組鍵 }
UserController.java
@Controller public class UserController { //建立關聯關係 @Autowired private UserService userService; public void execute() { System.out.println("UserController execute..."); userService.add(); } }
UserRepository.java
public interface UserRepository { void save(); }
UserRepositoryImpl.java
@Repository("userRepository") public class UserRepositoryImpl implements UserRepository { @Override public void save() { System.out.println("UserRepository save..."); } }
UserService.java
@Service public class UserService { @Autowired private UserRepository userRepository;
public void add() { // TODO Auto-generated method stub System.out.println("UserService add..."); userRepository.save(); } }
applicationContext.xml
<!-- 指定IOC容器掃描的包 --> <!-- 下面的引入檔案,沒有進入IOC容器的立馬進入IOC容器,有S的標誌 --> <!-- 掃描這個包以及它的子包 --> <context:component-scan base-package="com.MrChengsb.Annotations" ></context:component-scan> <!-- 只掃描子包中這個包裡的類 resource-pattern="repository/*.class" 不包含... 指定排除那些表示式的組鍵 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> --> <!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> --> <!-- 和 context:component-scan 中的 use-default-filters="false" 進行搭配才可以只包括,就是隻有包含的這個 <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/> -->
<!--
只包含
use-default-filters="false" 共同使用 <context:include-filter type="assignable" expression="com.MrChengsb.Annotations.repository.UserRepository"/> -->
<!-- 不包含這個介面以及它的實現類 <context:exclude-filter type="assignable" expression="com.MrChengsb.Annotations.repository.UserRepository"/> -->
測試以及相關注釋:
public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("Annotations.xml"); //沒有設立關聯關係的 // TestObject test = (TestObject) ctx.getBean("testObject"); // System.out.println(test); // // UserController uc = (UserController) ctx.getBean("userController"); // System.out.println(uc); // // UserRepositoryImpl urp = (UserRepositoryImpl) ctx.getBean("userRepository"); // System.out.println(urp); // // UserService use = (UserService) ctx.getBean("userService"); // System.out.println(use); // //設立關聯關係的 // TestObject test = (TestObject) ctx.getBean("testObject"); // System.out.println(test); UserController uc = (UserController) ctx.getBean("userController"); System.out.println(uc); uc.execute(); // UserRepositoryImpl urp = (UserRepositoryImpl) ctx.getBean("userRepository"); // System.out.println(urp); // // UserService use = (UserService) ctx.getBean("userService"); // System.out.println(use); //沒建立Bean之家的引用關係 // [email protected]ption in thread "main" // UserController execute... // java.lang.NullPointerException // at com.MrChengsb.Annotations.controller.UserController.execute(UserController.java:18) // at com.MrChengsb.Annotations.main.main(main.java:37) }
測試程式碼省略.......