IOC - 基于注解管理Bean

IOC - 基于注解管理Bean

一、开启组件扫描

         spring默认不使用注解装配Bean,我们需要在启动类上添加注解@ComponentScan开启SpringBeans 的自动扫描功能。开启此功能后,spring会自动扫描指定的包及其子包下的所有类,如果类上使用了@Component注解,就将该类装配到容器中。

       组件扫描使得spring可以使用注解方式完成bean管理,包括创建对象,包括注入属性。

// basePackages:指定扫描的包
@ComponentScan(basePackages = {"com.vaasplus"})

二、依赖注入List数据类型

       在spring中,我们在注入list集合的时候,如果只加了@Autowired注解,那就会把集合元素的所有实现类都注入进来,如果想只注入指定的类,那就使用@Qualifier注解。
例如:

// 学生任务接口
public interface StudentTask {

    /**
     * 学生类型
     *
     * @return
     */
    StudentType getType();

    /**
     * 学生做作业
     *
     * @param businessId 作业id
     */
    boolean doTask(String businessId);

}

// 学生类型
public enum StudentTaskType {

    /**
     * 艺术
     */
    ART_STUDENT,
    /**
     * 文科
     */
    LIBERAL_ARTS_MAJOR,
    /**
     * 理科
     */
    SCIENCE_DEPARTMENT
    }

public class ArtStudentTask implements StudentTask {

    @Override
    public StudentType getType() {
        return StudentType.ART_STUDENT;
    }

    @Override
    public boolean doTask(String branchId) {
         System.out.println("画画");
    }
}
public interface StudentTaskService {

    /**
     * 任务批量入队
     *
     * @param businessIds
     * @param type
     */
    void pushTask(StudentTaskType type, List<String> businessIds);
    /**
     * 任务出队
     */
    int popTask();
}
    
public class DirtyTaskServiceImpl implements StudentTaskService, InitializingBean {
	@Resource
	private List<StudentTaskType> students;
	private Map<StudentTaskType, StudentTask> taskMap = Maps.newHashMap();
	@PostConstruct
    public void init() {
        tasks.stream().forEach(v -> taskMap.put(v.getType(), v));
    }
    // 当spring初始化该实体类初始化的时候就开始执行该方法
    @Override
    public void afterPropertiesSet() {
    while (true) {
    	int task = popTask();
    }
    }
}

三、SpringBoot 扩展接口

学习链接:https://juejin.cn/post/7271924341734228023?searchId=20231110163857244DDE55349F0527C2C6

3.1、InitializingBean

org.springframework.beans.factory.InitializingBean

这个类。顾名思义,也是来初始化bean的。InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。这个扩展点的触发时机在postProcessAfterInitialization之前。

使用场景:用户实现此接口,来进行系统启动的时候一些业务指标的初始化工作。
扩展方式为:

public class NormalBeanA implements InitializingBean{      
    @Override      
    public void afterPropertiesSet() throws Exception {      
        System.out.println("[InitializingBean] NormalBeanA");      
    }      
}  

你可能感兴趣的:(spring)