classpath扫描组件
- 组件扫描:spring能够从classpath下自动扫描,检测和实例化具有特定注解的组件。
- 特定组将
- @Component:基本注解,标识了一个受spring管理的组件。
- @Respository:标识持久层组件。
- @Service:标识服务层(业务层)组件。
- @Controller:标识表现层组件
- 对于扫描到的组件,spring有默认的命名策略:使用非限定类名,第一次字母小写。也可以在注解中通过value属性标识组件的名称。
- 当在组件类上使用了特定的注解后,还需要在spring的配置文件中声明<context:component-scan >
- base-package属性:指定一个需要扫描的其类包,spring容器将会扫描这个其类包以及子包中的所有类。
- 当需要扫描多个包时候,可以使用逗号进行分割。
- 如果只希望扫描特定的类而非其类包下的所有类,可以使用resource-pattern属性过滤特定的类
- context:include-filter 子结点表示要包含的目标类
- context:exclude-filter 子结点表示要排除在外的目标类
- context:component-scan可以拥有若干个context:include-filter与context:exclude-filter子结点。
配置context:include-filter与context:exclude-filter
首先建立一个包annotation里面包含有repository、controller、service三个包
写Java中的类
controller中的UserController.java
@Controller
public class UserController {
public void execute(){
System.out.println("UserController execute ....");
}
}
repository中的接口UserRepository.java与实现类UserRepositoryImpl.java
public interface UserRepository {
void save();
}
@Repository("userRepository")
public class UserRepositoryImpl implements UserRepository{
public void save() {
System.out.println("UserRepository save......");
}
}
service中的UserService.java
@Service
public class UserService {
public void add(){
System.out.println("UserSerive add ....");
}
}
annotation包下的TestObject.java
@Component
public class TestObject {
}
annotation包下的主函数Main.java
public class Main {
public static void main(String[] args) {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("bean.xml");
TestObject testObject = (TestObject) applicationContext.getBean("testObject");
System.out.println(testObject);
UserController userController = (UserController) applicationContext.getBean("userController");
System.out.println(userController);
UserService userService = (UserService) applicationContext.getBean("userService");
System.out.println(userService);
UserRepositoryImpl userRepository = (UserRepositoryImpl)applicationContext.getBean("userRepository");
System.out.println(userRepository);
}
}
配置xml文件
<!-- context:exclude-filter 配置type属性
annotation:指定忽略的注解,后面的expression属性指定注解的路径;
assignable:指定要忽略的类,后面的expression属性指定类的路径;
context:include-filter 配置只加载的内容,当需要使用的时候需要在context:component-scan上配置use-default-filters属性为false,其他和属性和context:exclude-filter一样
-->
<context:component-scan base-package="spring.annotation" >
<!-- <context:exclude-filter type="assignable" expression="org.springframework.stereotype.Repository"/>-->
<!-- <context:include-filter type="assignable" expression="spring.annotation.controller.UserController"/>-->
</context:component-scan>
运行结果
配置过滤
修改xml文件
<context:component-scan
base-package="spring.annotation"
resource-pattern="repository/*.class"
>
</context:component-scan>
注意其中resource-pattern所指向的是在base-package内容的基础上进行指定的
主函数
public static void main(String[] args) {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("bean.xml");
UserRepositoryImpl userRepository = (UserRepositoryImpl) applicationContext.getBean("userRepository");
System.out.println(userRepository);
}
运行结果