public class Main
{
//传入的是配置类的位置,一开始是加载配置类,之前是加载配置文件的位置
private ApplicationContext ioc= new AnnotationConfigApplicationContext(MyConfig.class);
@Test
public void test()
{
people peo = ioc.getBean(people.class);
System.out.println(peo);
//获取对应组件在容器中的名字
String[] beans = ioc.getBeanNamesForType(people.class);
for (String bean : beans) {
System.out.println(bean);
}
}
}
@Configuration和 @Bean注解以及补充注解的详细说明,强推!!!
配合@Bean注解一起使用的@Scope注解,感兴趣可以看看
=============================================================================
以前:
<context:component-scan base-package=“com.controller”></context:component-scan>
配置类:
@Configuration //标注当前是一个配置类
@ComponentScan(“com.controller”)
public class MyConfig
{ }
controller:
//@Controller(“大忽悠”)这里同样可以起一个别名
@Controller(“大忽悠”)//这里同样可以起一个别名
public class peoController
{}
测试:
public class Main
{
//传入的是配置类的位置,一开始是加载配置类,之前是加载配置文件的位置
private ApplicationContext ioc= new AnnotationConfigApplicationContext(MyConfig.class);
@Test
public void test()
{
//获取容器中所有定义的Bean的名字
String[] beans = ioc.getBeanDefinitionNames();
for (String bean : beans) {
System.out.println(bean);
}
}
}
@Configuration //标注当前是一个配置类
@ComponentScan(value = “com.controller”,includeFilters = {
//按照注解排除,排除掉Controller注解
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class)
}, //这里禁用掉默认的扫描规则
useDefaultFilters = false)
public class MyConfig
{ }
@Configuration //标注当前是一个配置类
@ComponentScan(value = “com.controller”,excludeFilters = {
//按照注解排除,排除掉Controller注解
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class)
}, //这里禁用掉默认的扫描规则
useDefaultFilters = false)
public class MyConfig
{ }
@Configuration //标注当前是一个配置类
@ComponentScan(value = “com.controller”,includeFilters= {
//按照注解包含,排除掉Controller注解
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class),
//按照类型包含要扫描的组件
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = peoController.class)
}, //这里禁用掉默认的扫描规则
useDefaultFilters = false)
public class MyConfig
{ }
继承TypeFilter接口,重写扫描匹配方法:
public class MyTypeFilter implements TypeFilter
{
//MetadataReader:读取到当前正在扫描的类的相关信息
//MetadataReaderFactory: 可以获取到其他任何类的信息
public boolean match(MetadataReader metadataReader,
MetadataReaderFactory metadataReaderFactory) throws IOException {
//获取当前类注解信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
//获取当前正在扫描的类的类信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
//获取当前类资源(类路径)
Resource resource = metadataReader.getResource();
String className = classMetadata.getClassName();
//如果当前类名包含peo,则不扫描
if(className.contains(“peo”))
return false;
//否则扫描
return true;
}
}
配置类:
@Configuration //标注当前是一个配置类
@ComponentScan(value = “com.controller”,includeFilters= {
//按照自定义规则
@ComponentScan.Filter(type = FilterType.CUSTOM,classes = {MyTypeFilter.class})
}, //这里禁用掉默认的扫描规则
useDefaultFilters = false)
public class MyConfig
{ }
peo没被扫描进来,完美
=====================================================================
@Configuration //标