一、xml配置文件的形式 VS 配置类的形式
1、基于xml的形式定义Bean的信息
<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
<bean id="bert" class="com.bert.xmlbeanfactory.Bert"></bean>
<bean class="com.bert.vo.Bert1"></bean>
</beans>
去容器中读取Bean,默认根据类全路径名读取,也可以指定id读取
public static void main( String[] args )
{
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
System.out.println(ctx.getBean("com.bert.vo.Bert1"));
System.out.println(ctx.getBean("bert"));
}
2、基于读取配置类的形式定义Bean信息
@Bean的默认名称是方法名,若@Bean(value="bean的名称") 那么bean的名称是指定的 去容器中读取Bean的信息
@Configuration
public class ConfigMain {
@Bean
public Bert bert() {
return new Bert();
}
@Bean(value = "testBert1")
public Bert1 bert1() {
return new Bert1();
}
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new
AnnotationConfigApplicationContext(ConfigMain.class);
System.out.println(ctx.getBean("bert"));
System.out.println(ctx.getBean("testBert1"))
}
}
二、在配置类上写@CompentScan注解来进行包扫描
@Component
public class BertVo {
public BertVo() {
System.out.println("创建构造器BertVo");
}
}
@Configuration
@ComponentScan(basePackages = {"com.bert.compentscan"})
public class CompentScanMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(CompentScanMain.class);
System.out.println(ctx);
}
}
@Controller
public class BertController {
public BertController()
System.out.println("初始化BertController");
}
}
@Service
public @interface BertService {
}
@BertService
public class BertServiceImpl {
public BertServiceImpl() {
System.out.println("初始化BertServiceImpl");
}
}
1、排除用法 excludeFilters(排除@Controller注解的,和BertService的)
@Configuration
@ComponentScan(basePackages = {"com.bert.compentscan"},
excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, value =
{Controller.class}),
@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE,value=
{BertService.class})
}
)
public class CompentScanMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(CompentScanMain.class);
}
}
2、包含用法 includeFilters ,注意,若使用包含的用法,需要把useDefaultFilters属性设置为false(true表示扫描全部的)
@Configuration
@ComponentScan(basePackages = {"com.bert.compentscan"},
includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,
value = {Controller.class, Service.class})
}, useDefaultFilters = false
)
public class CompentScanMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(CompentScanMain.class);
}
}
3、 @ComponentScan.Filter type的类型
public enum FilterType {
//注解形式 比如@Controller @Service @Repository @Compent
ANNOTATION,
//指定的类型
ASSIGNABLE_TYPE,
//aspectJ形式的,切点
ASPECTJ,
//正则表达式的
REGEX,
//自定义的
CUSTOM
}
使用ASPECTJ 需要引入如下jar包
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.4</version>
</dependency>
4、FilterType.CUSTOM 自定义类型使用
public class BertFilterType implements TypeFilter {
public boolean match(MetadataReader metadataReader, MetadataReaderFactory
metadataReaderFactory) throws IOException {
//获取当前类的注解源信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
System.out.println("注解源信息:" + annotationMetadata.getAnnotationTypes());
if (annotationMetadata.getAnnotationTypes().
contains("com.bert.compentscan.BertService")) {
return true;
}
//获取当前类的class的源信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
System.out.println("class的源信息:" + classMetadata.getClassName());
if (classMetadata.getClassName().contains("BertVo")) {
return true;
}
//获取当前类的资源信息
Resource resource = metadataReader.getResource();
System.out.println("资源信息:" + resource.getFilename());
if (resource.getFilename().equals("BertController.class")) {
return true;
}
return false;
}
}
@ComponentScan(basePackages = {"com.bert.compentscan"}, includeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM,value = BertFilterType.class)
},useDefaultFilters = false)
public class CompentScanMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(CompentScanMain.class);
}
}