Bean 的生命周期
执行顺序:
- 无参构造函数
- 依赖注入(包括属性注入)
- 初始化方法
- 销毁方法
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Component
public class ComponentBean {
private static final Logger logger = LoggerFactory.getLogger(ComponentBean.class);
private static int i = 0;
private String name;
/**
* 由于没有进行日志设置的配置, 因此默认情况下logger.debug()并不会被输出
*/
public ComponentBean() {
logger.error("无参构造函数:{}", i++);
}
/**
* @Autowired注解添加在方法上, 和@Bean的效果类似, 会从Spring容器中按类型查找形参对象,
* 但是如果形参是String类型, 则需要额外使用@Value进行注入. 暂且将其当作@Value为成员变量进行依赖注入
*/
@Autowired
public void setAutowired(@Value("${JAVA_HOME}") String path) {
logger.error("Autowired方法:{}", i++);
}
public void setName(String name) {
this.name = name;
logger.error("set方法进行属性注入:{}", i++);
}
@PostConstruct
public void init() {
logger.error("postConstruct注解:{}", i++);
}
@PreDestroy
public void destroy() {
logger.error("preDestroy注解:{}", i++);
}
}
BeanPostProcessor Bean后置处理器
模板方法设计模式
模板方法中的某个位置:对应一个函数式接口
一种增强:对应函数式接口的一个实现(或者称为一个lambda表达式)
import java.util.ArrayList;
import java.util.List;
public class TemplateMethodMain {
List<MyPostProcessor> postProcessors = new ArrayList<>();
public void addPostProcessor(MyPostProcessor myPostProcessor) {
postProcessors.add(myPostProcessor);
}
public void runV1() {
System.out.println("构造器");
System.out.println("依赖注入");
System.out.println("初始化");
}
public void runV2() {
System.out.println("构造器");
System.out.println("依赖注入");
// 处理每一个的增强功能
for (MyPostProcessor postProcessor : postProcessors) {
postProcessor.deal();
}
System.out.println("初始化");
}
public static void main(String[] args) {
TemplateMethodMain templateMethodMain = new TemplateMethodMain();
// 使用者添加功能即可, 不需要修改原有的类
templateMethodMain.addPostProcessor(() -> System.out.println("解析@MyAutowired注解"));
templateMethodMain.addPostProcessor(() -> System.out.println("解析@MyResource注解"));
templateMethodMain.runV2();
}
}
interface MyPostProcessor {
void deal();
}