IOC 即为(Inversion of Control),控制反转。SpringBoot支持XML方式,推荐使用注解方式。
实现一个简单的IOC实例
新建一个spring 项目。
- 实现一个简单的Bean对象。
@Data
public class Student {
private Long id;
private String username;
private String password;
}
- 实现一个配置文件
@Configuration
public class MySpringBootConfig {
/**
* Bean 注解用来装配Bean,注解下方的Bean会被装配到IOC容器中。
* @return
*/
@Bean(name = "student")
public Student getStu(){
Student student = new Student();
student.setId(1L);
student.setUsername("www");
student.setPassword("123456");
return student;
}
}
@Controller 注解用来说明这是一个配置文件,SpringBoot 会根据这个注解生成IOC容器,以便装配Bean。
@Bean 注解用来装配Bean,在注解下方生成的Bean会被装配到IOC容器
- 测试
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class IoCTest {
private static final Logger log = LoggerFactory.getLogger(IoCTest.class);
@Test
public void test(){
//读取配置文件
ApplicationContext context = new AnnotationConfigApplicationContext(MySpringBootConfig.class);
Student stu = context.getBean(Student.class);
log.info("id = "+stu.getId());
log.info("username = "+stu.getUsername());
log.info("password = "+stu.getPassword());
}
}
运行结果
4. 测试一下自动注入
@RestController
public class MyController {
@Autowired
private Student student;
/**
* 测试配置的Bean
* @return student
*/
@RequestMapping("/hello")
public Student hello(){
System.out.println("hello");
return student;
}
}
查看运行结果
装配Bean
@ComponentScan 注解
@Component 指定要被扫描的类,@ComponentScan 则把标明@Component的类作为Bean装配到IOC容器。
查看ComponentScan的源码,查看他的如下属性:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
//定义扫描的包,对应的包扫描路径,可以是单个路径,也可以时扫描的路径数组
@AliasFor("basePackages")
String[] value() default {
};
//定义扫描的包
@AliasFor("value")
String[] basePackages() default {
};
//定义扫描的类
Class<?>[] basePackageClasses() default {
};
// bean bane 生成器
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
// 处理检测到bean 的scope范围
Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;
//作用域代理
ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
// 资源匹配
String resourcePattern() default ClassPathScanningCandidateComponentProvider.DEFAULT_RESOURCE_PATTERN;
// 是否启用默认的过滤器
boolean useDefaultFilters() default true;
//过滤满足条件的
Filter[] includeFilters() default {
};
// 过滤不满足条件的
Filter[] excludeFilters() default {
};
// 是否延迟初始化,懒加载
boolean lazyInit() default false;
//定义过滤器
@Retention(RetentionPolicy.RUNTIME)
@Target({
})
@interface Filter {
// 过滤器类型
FilterType type() default FilterType.ANNOTATION;
// 过滤器的类
@AliasFor("classes")
Class<?>[] value() default {
};
// 过滤器的类
@AliasFor("value")
Class<?>[] classes() default {
};
// 匹配方式
String[] pattern() default {
};
}
}
basePackages
,如果不配置,默认扫描当前的包以及其子包被标注的类。
value
, 和basePackages一样,可以扫描单个包路径,也可以扫描多个包路径。
basePackageClasses
可以定义具体要扫描的类。
includeFilters
定义符合条件的包才会扫描。
excludeFilter
不会扫描定义中的包的类,需要@interface Filter 配合使用。
除了可以使用Component注解,还有其他注解@Repository、@Service、@Controller等注解也注入了Component,在默认情况下会被注入IOC容器。
使用ComponentScan
- 配置文件中加入注解
@Configuration
@ComponentScan(value = "com.boot.bootioc.pojo")
public class MySpringBootConfig {
- 在com.boot.bootioc.pojo下创建一个bean
@Data
@Component("car")
public class Car {
@Value("陕A 2756A")
private String id;
@Value("ww")
private String owner;
}
@Component 注解如果不指定bean的name,默认将是类名首字母小写。
- 测试
@RestController
public class MyController {
@Autowired
private Car car;
@GetMapping("/getcar")
public Car car(){
return car;
}
- 查看运行结果