SpringBoot之IOC

IOC 即为(Inversion of Control),控制反转。SpringBoot支持XML方式,推荐使用注解方式。

实现一个简单的IOC实例

新建一个spring 项目。

  1. 实现一个简单的Bean对象。
@Data
public class Student {
    
    
    private Long id;
    private String username;
    private String password;
}
  1. 实现一个配置文件
@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容器

  1. 测试
@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

  1. 配置文件中加入注解
@Configuration
@ComponentScan(value = "com.boot.bootioc.pojo")
public class MySpringBootConfig {
    
    
  1. 在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,默认将是类名首字母小写。

  1. 测试
@RestController
public class MyController {
    
    
    @Autowired
    private Car car;

    @GetMapping("/getcar")
    public Car car(){
    
    
        return car;
}
  1. 查看运行结果
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Zhangxg0206/article/details/113116187
今日推荐