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");
}
}