将组件加入到IOC容器有很多方法:对于三层组件来说,有两种:
举个例子来进行说明,创建三层模型来进行模拟。建立两个Dao层。
Controller
package org.awen.controll;
import org.springframework.stereotype.Controller;
@Controller
public class StudentController {
}
Service
package org.awen.service;
import org.awen.dao.StudentDao;
import org.springframework.stereotype.Service;
@Service
public class StudentService {
}
Dao
package org.awen.dao;
import org.springframework.stereotype.Repository;
@Repository
public class SchoolDao {
}
Dao
package org.awen.dao;
import org.springframework.stereotype.Repository;
@Repository
public class StudentDao {
}
第一种:
首先都通过注解将三层模型加入到 IOC容器中。上面的代码已经包含注解了
Dao层的注解:@Repository
Service层的注解:@Service
Controller层的注解:@Controller
将其在applicationContext.xml之中配置,也就是添加扫描器,扫描多个包就行了。
public static void testAnnotation() {
ApplicationContext contet=new ClassPathXmlApplicationContext("applicationContext.xml");
/**
* 遍历容器中所有的bean
* */
String[] ids=contet.getBeanDefinitionNames();
for(String id:ids) {
System.out.println(id);
}
}
第二种:
将其写入配置类之中。首先第一步都是相同的,都是在三层上面加上,注解。
将三层都包含在其内部了。
//这个东西 会将 当前配置类 也纳入到IOC容器中 并且id就是类名
@Configuration
@ComponentScan(value="org.awen")
public class MyConfig {
}
test的方法为:
public static void testAnnotation_one() {
ApplicationContext contet=new AnnotationConfigApplicationContext(MyConfig.class);
String[] ids=contet.getBeanDefinitionNames();
for(String id:ids) {
System.out.println(id);
}
}
在Config.class的注解里面@ComponentScan是可以进行选择的。
比如
@ComponentScan(value="org.awen",excludeFilters= {@ComponentScan.Filter(type=FilterType.ANNOTATION,value= {Service.class,Controller.class})})
这样子,是具有选择的功能的,就将注解为:Service和Controller的类排除掉了,所以显示结果就不包含了Controller,Service类。
@ComponentScan(value="org.awen",excludeFilters= {@ComponentScan.Filter(type=ASSIGNABLE_TYPE,value= {StudentController.class})})
这样子,是将StudentController这个类排除掉。
解释:
FilterType.ANNOTATION
---------这个针对于三层注解类型
FilterType.ASSIGNABLE_TYPE
---------针对具体的类后面跟的是具体的类
//这个是包括某些类的使用方法,需要设置默认行为,才可以。禁止默认行为
//@ComponentScan(value="org.awen",includeFilters= {@ComponentScan.Filter(type=FilterType.ANNOTATION,value= {Service.class})},useDefaultFilters=false)
比如这样子,就是将某一些 类加入到其中。
这个是使用自定义类 进行 筛选 某一个类 ,在上面写了四个实例的类,分别是
StudentDao.class
SchoolDao.class
StudentService.class
StudentControll.class
这个时候 就会用到 SchoolDao,这里会使用自定义类的方法,将其排除掉。
@ComponentScan(value="org.awen",includeFilters= {@ComponentScan.Filter(type=FilterType.CUSTOM,value= {MyFilter.class})})
MyFilter类:
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory arg1) throws IOException {
// TODO 自动生成的方法存根
ClassMetadata classMetadata=metadataReader.getClassMetadata();
//扫描器 扫描“org.awen”包中所有的类,getClassName()而可以拿到 该包中所有的类
String className=classMetadata.getClassName();
//只过滤出 和学生相关的三层组件 把有学生的三层组件纳入到IOC容器中
if(className.contains("Student")) {
return true;
}
return false;
}
再次测试的时候,schoolDao就不会在Bean中出现了。
type=FilterType.CUSTOM然后后面跟你的类名加.class 这个是你自己自定义的类 必须实现一个接口