spring_(13)通過註解配置之一
阿新 • • 發佈:2018-11-21
在classpath中掃描元件
-
元件掃描(component scanning):Spring 能夠從classpath下自動掃描,偵測和例項化具有特定註解的元件.
-
特定元件包括:
- @Component:基本註解,標識了一個受Spring管理的元件
- @Respository:標識持久層元件
- @Service:標識服務層(業務層)元件
- @Controller:標識表現層元件 UserService userService
-
對於掃描到的元件,Spring有預設的命名策略:使用非限定類名,第一個字母小寫。也可以在註解中通過value屬性值標識元件的名稱
-
當在元件類上使用了特定的註解之後,還需要在Spring的配置檔案中宣告**< context:component-scan >**:
-
base-package屬性指定一個需要掃描的基類包,Spring容器將會掃描這個基類包裡及其子包中的所有類
-
當需要掃描多個包時,可以使用逗號分隔.
-
如果僅希望掃描特定的類而非基包下的所有類,可使用resource-pattern屬性過濾特定的類,示例:
<context:component-scan base-package="com.spring.beans" resource-pattern
-
< context:include-filter >子節點表示要包含的目標類
-
< context:exclude-filter >子節點表示要排除在外的目標類
-
< context:component-scan >下可以擁有若干個< context:include-filter >和< context:exclude-filter >子節點
例子程式
基本結構
-
TestObject.java
package com. spring.beans.annotation;
import org.springframework.stereotype.Component;
@Component
public class TestObject {
}
UserController.java
package com.spring.beans.annotation.controller;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
public void execute(){
System.out.println("UserController execute...");
}
}
UserRepository.java(介面)
package com.spring.beans.annotation.repository;
public interface UserRepository {
void save();
}
UserRepositoryImpl.java
package com.spring.beans.annotation.repository;
import org.springframework.stereotype.Repository;
@Repository("userRepository")
public class UserRepositoryImpl implements UserRepository {
@Override
public void save() {
System.out.println("UserRepository Save...");
}
}
UserService.java
package com.spring.beans.annotation.service;
import org.springframework.stereotype.Service;
@Service
public class UserService {
public void add(){
System.out.println("UserService add...");
}
}
beans-annotation.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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--指定spring IOC 容器掃描的包-->
<!--可以通過resource-pattern指定掃描的資源-->
<!--<context:component-scan
base-package="com.spring.beans.annotation"
resource-pattern="repository/*.class">
</context:component-scan>-->
<!--exclude-filter 子節點指定排除哪些指定表示式的元件-->
<!--context:include-filter 子節點指定包含哪些表示式的元件,該子節點需要 use-default-filters 配合使用-->
<context:component-scan
base-package="com.spring.beans.annotation">
<!-- 只包含時需要新增這個屬性use-default-filters="false"-->
<!--不包含<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>-->
<!--只包含<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>-->
<!--不包含這個介面以及介面的實現類<context:exclude-filter type="assignable" expression="com.spring.beans.annotation.repository.UserRepository"/>-->
<!--只包含這個介面以及介面的實現類<context:include-filter type="assignable" expression="com.spring.beans.annotation.repository.UserRepository"/>-->
</context:component-scan>
</beans>
Main.java
package com.spring.beans.annotation;
import com.spring.beans.annotation.controller.UserController;
import com.spring.beans.annotation.repository.UserRepository;
import com.spring.beans.annotation.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-annotation.xml");
TestObject to = (TestObject) ctx.getBean("testObject");
System.out.println(to);
UserController userController =(UserController) ctx.getBean("userController");
System.out.println(userController);
UserService userService = (UserService) ctx.getBean("userService");
System.out.println(userService);
UserRepository userRepository = (UserRepository) ctx.getBean("userRepository");
System.out.println(userRepository);
}
}