在平时的开发,我们会配置 @Controller 、 @Service 、 @Repository 、@Component 注解来声明该类为 Spring IoC容器的组件。 在 xml 中会配置扫描包,那么使用 JavaConfig 的方式,同样可以配置扫描包。
DAO 的注解类
@Repository
public class BusinessDAO {
public void update() {
System.out.println("调用了 dao 层的 update 方法....");
}
}
Service 的注解类
@Service
public class BusinessService {
@Autowired
private BusinessDAO dao;
public void service() {
System.out.println("调用了 service 层的 service() 方法 .....");
dao.update();
}
}
Controller 的注解类
@Controller
public class BusinessController {
@Autowired
private BusinessService service;
public void request() {
System.out.println(" 调用了 Controller 的 request() 方法...");
service.service();
}
}
以上三个类是我们平时开发时经常使用的方式,在不同的类上打不同的注解,然后让 Spring 的包扫描自动去扫描这些类。
Java Config 配置类
@Configuration
@ComponentScan("me.sjl.*")
public class ScanConfig {
}
结果
Bean 成功的加入到了 Spring IoC容器
@ComponentScan 的排除规则
FilterType.ANNOTATION 按注解类型排除
@Configuration
@ComponentScan(basePackages = "me.sjl.*", excludeFilters = {
@Filter(type = FilterType.ANNOTATION, classes = Controller.class)
})
public class ScanConfig {
}
excludeFilters 属性表示排除规则, 可以写多个 @Filter 来排除, 上面的代码表示 排除 Controller 注解的类
测试结果
IoC 容器中已经不包含 Controller 注解的类了
除了排除,还可以指定只包含的类注解
JavaConfig 配置
@Configuration
@ComponentScan(basePackages = "me.sjl.*", useDefaultFilters = false, includeFilters = {
@Filter(type = FilterType.ANNOTATION, classes = Controller.class)
})
public class ScanConfig {
}
useDefaultFilters = false 表示禁用默认的过滤规则
FilterType.ASSIGNABLE_TYPE 类型
FilterType.ASPECTJ AspectJ表达式
FilterType.REGEX 正则表示达
FilterType.CUSTOM 自定义规则
自定义过滤规则是需要实现 TypeFilter 接口
自定义扫描规则, 类名中带有 Service 的类,被 Spring IoC 容器扫描
public class MyCustomerFilter implements TypeFilter {
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
String className = metadataReader.getClassMetadata().getClassName();
return className.contains("Service");
}
}
网友评论