1、分别创建一个Person类以及controller、service、dao左测试
controller、service、dao分别加上注解
2、在主配置类中使用@ComponentScan指定扫描规则
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.stereotype.Controller; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; import com.atguigu.bean.Person; //配置类==配置文件 @Configuration //告诉Spring这是一个配置类 @ComponentScan(value="com.atguigu", //指定要扫描的包 excludeFilters= {@Filter(type=FilterType.ANNOTATION,classes= {Controller.class})} //指定以某种规则排除扫描哪些组件 ) public class MainConfig { //给容器注册一个Bean;类型为返回值类型(bean的id默认是用方法名作为id) //@Bean("")增加内容后指定bean的id @Bean("person") public Person person() { return new Person("张三", 19); } }
3、创建测试类进行测试
在pom.xml中添加junit依赖
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
测试类中写测试方法
public class IOCTest { @Test public void test01() { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class); //getBeanDefinitionNames获取容器中组件的name(即配置文件中组件的id) String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames(); for (String name : beanDefinitionNames) { System.out.println(name); } } }
获取组件名字打印得到:(因为在主配置类中排除了对@Controller注解的扫描,所以没有BookController组件)
4、再次修改主配置文件进行测试
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.stereotype.Controller; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; import com.atguigu.bean.Person; //配置类==配置文件 @Configuration //告诉Spring这是一个配置类 @ComponentScan(value="com.atguigu", //指定要扫描的包 //excludeFilters= {@Filter(type=FilterType.ANNOTATION,classes= {Controller.class})} //指定以某种规则排除扫描哪些组件 includeFilters= {@Filter(type=FilterType.ANNOTATION,classes= {Controller.class})}, //指定以某种规则只扫描哪些组件 useDefaultFilters = false //includeFilters必须配合useDefaultFilters = false(默认值是true)来使用 ) public class MainConfig { //给容器注册一个Bean;类型为返回值类型(bean的id默认是用方法名作为id) //@Bean("")增加内容后指定bean的id @Bean("person") public Person person() { return new Person("张三", 19); } }
测试类中再次测试得到的结果为:
此例只是以注解扫描规则举例,还有其他扫描规则可百度查询:
/*扫描规则 1、FilterType.ANNOTATION:按照注解 2、FilterType.ASSIGNABLE_TYPE:按照给定类的类型,则该类的子类都会扫描注册 3、FilterType.ASPECTJ:使用ASPECTJ表达式 4、FilterType.REGEX:使用正则表达式 5、FilterType.CUSTOM:使用自定义规则 */