Spring注解开发:去掉之前的配置文件,现在采用配置类来实现所有的开发。
这些注解只需要导入Spring-context包就可以满足
目录
1.@Configuration表明当前类是一个配置类
2.@Bean表示把当前类放入Spring容器中
配置文件:
@Configuration //告诉spring这是一个配置类
public class MainConfig {
@Bean //给容器中注册一个bean,类型为返回的类型,默认id是方法名(这里方法名是user)
public User user(){
return new User("vison",23);
}
}
//上面如果需要自定义给bean定义id名可以通过@Bean(name="user") 实现
测试文件:
public class TestAnotation {
public static void main(String[] args) {
AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
User user = configApplicationContext.getBean(User.class);
System.out.println(user);
}
}
3.@ComponentScan
类似于以前配置文件中的context:component-scan,这里使用注解扫描以前的@Controller,@Service,@Repository,@Component
例子:建议看注解源码了解怎么使用注解内的属性
@Configuration
@ComponentScan(value = "com.wusu",excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class,Service.class})
})
//value :表示需要扫描的包
//excludeFilters = Filter[] :指定扫描的时候按照什么规则排除某些组件
//includeFilters = Filter[] :指定扫描的时候只需要包含某些组件
public class MainConfig {
@Bean
public User user(){
return new User("vison",23);
}
}
3.1 上面例子中value表示需要扫描的包,excludeFilters表示在包含的包中需要排除的类型,这里type表示通过怎么样的方式排除某些组件;这里是注解,后面的classes表示通过注解排除@Controller和@Service注解,不扫描这些注解的类。
3.2 除了排除扫描外,还有只扫描某一些包或者类的注解@includeFilters;由于@ComponetScan有一个默认属性useDefaultFilter是扫描所有的包,所以在只扫描扫描某些包的时候,需要把这个属性设置为false;如下表示只包含Controller和Service.class两个注解的包。
@Configuration
@ComponentScan(value = "com.wusu",useDefaultFilters = false,includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class,Service.class})
})
public class MainConfig {
@Bean
public User user(){
return new User("vison",23);
}
}
3.3 上面过滤的时候type类型有:
public enum FilterType {
ANNOTATION, //通过注解过滤,常用,上面的例子就是这个
ASSIGNABLE_TYPE, //通过类型过滤,常用
ASPECTJ, //通过aspectJ过滤
REGEX, //通过正则表达式过滤
CUSTOM; //自定义过滤,这个需要自己实现TypeFilter类
private FilterType() {
}
}
3.4 使用CUSTOM自定义规则过滤,过滤后,自己的新建的过滤类myFilter也是会自动加入到Spring容器中
配置类:
@Configuration
@ComponentScan(value = "com.wusu",useDefaultFilters = false,includeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM,classes = MyFilter.class)
})
//这里type使用CUSTOM表示自定义规则,classes使用自定义规则的类
public class MainConfig {
@Bean
public User user(){
return new User("vison",23);
}
}
过滤类:
public class MyFilter implements TypeFilter {
//metadataReader 读取到当前类正在扫描的类
//metadataReaderFactory 可以获取到其他任何类的信息
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
//获取当前类的注解信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
//获取当前类的类信息,包括类的类名,接口等信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
//获取当前类资源(类的路径)
Resource resource = metadataReader.getResource();
if (classMetadata.getClassName().contains("wusu")){ //这里表示类名包含wusu的才能被扫描存入spring容器中
return true;
}
return false;
}
}