本文将对比着原生Java,帮助透彻的理解spring Bean的生命周期。
Spring bean的生命周期大致可以分为四个阶段:
创建
依赖注入
初始化
销毁
这四个阶段是spring框架内的,下面将对比这理解他们在原生Java中的阶段。
创建(实例化)#
原生Java:就是对象的实例化,主要是通过构造器方法进行实例化。
MyBean myBean = new MyBean(); // 这是原生Java中的对象创建
spring框架中:Spring容器通过反射调用类的构造函数来创建Bean的实例。
依赖注入#
原生Java:通过setDependency
方法,或者obj.feild = xxx
直接赋值的方式,给字段进行赋值,也就是注入依赖。
MyBean myBean = new MyBean();
myBean.setDependency(new Dependency()); // 通过Setter方法注入依赖
spring框架中:Spring容器根据配置或注解,将依赖的Bean注入到目标Bean中。这可以通过@Autowired
、@Resource
、@Inject
等注解,或者通过XML配置中的<property>
标签来实现。
初始化#
原生Java:Java对象实例化后,调用init
之类的方法,进行初始化。
MyBean myBean = new MyBean();
myBean.init(); // 手动调用初始化方法
spring框架中:Spring提供了InitializingBean
接口、@PostConstruct
注解或init-method
XML配置,让Bean可以声明自己想要执行的方法,底层仍然是调用了方法。
销毁#
原生Java:Java对象任务完成后,调用close
或destory
方法来进行资源释放之类的工作。
MyBean myBean = new MyBean();
myBean.destroy(); // 手动调用销毁方法
//额外的提示Java中所有对象的真正销毁和回收都是由GC来决定的 强烈不建议自己调用final方法...
spring框架:Spring提供了DisposableBean
接口、@PreDestroy
注解或destroy-method
XML配置,底层仍然是调用一个销毁方法。
小结#
可以看到由Spring框架管理的Bean可以自动化的实现这些工作,降低了耦合与重复性的代码。