我们知道spring在整个生命周期之中为我们提供了多次注入和回调方式,比如说
那么执行顺序是咋样的呢?
首先1.构造函数和工厂方法只能二选一,要么使用构造方式,要么选择工厂方法否则报错
不论是构造方式注入还是工厂方法注入,这两种方式是最先执行的,因为spring container 会先创建对象的实例,然后再去调用setter或者init方法,这里还有说一下的就是 配置初始化有4种方式,分别是1.默认全局初始化,配置在beans中的标签中,2,配置在bean中的init-method 3. java code implement InitializingBean 4,基于注解 @PostConstruct,当然还有 很多的初始化或者回调,比如说LifeCycle,BeanPostProcess等等,这里暂且不说,那么他们的执行顺序四怎么样的呢?
我们可以看到构造方式最先执行,其次是setter,@PostConstruct是各种初始化方式最先执行的,其次是实现接口InitializingBean,最后才是配置XML的,而且全局初始化方法并没有执行。
我们来看一下代码
小伙伴们可以将下列代码,验证下!
代码
package com.wangyadong.hobby.front.model; import com.wangyadong.hobby.common.BasicModel; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Required; import org.springframework.beans.factory.config.BeanPostProcessor; import javax.annotation.PostConstruct; import java.beans.ConstructorProperties; import java.util.Date; import java.util.concurrent.atomic.AtomicInteger; /*** * 构造注入,工厂方法,set注入,afterPropertiesSet,global init, @PostConstruct */ public class WuserInfo extends BasicModel implements InitializingBean, DisposableBean { private static final AtomicInteger integer = new AtomicInteger(1); public void init1() { System.out.println(" XML初始化方式>> " + integer.getAndIncrement()); } @PostConstruct public void init2() { System.out.println(" 注解初始化方式 " + integer.getAndIncrement()); } public void init() { System.out.println(" 全局初始化方式 ========================================= " + integer.getAndIncrement()); } @Override public void afterPropertiesSet() throws Exception { System.out.println(" IMPL InitializingBean初始化方式 " + integer.getAndIncrement()); } @ConstructorProperties({"isType", "isUserName"}) public WuserInfo(Byte type, String userName) { this.type = type; this.userName = userName; System.out.println("构造注入 ========================================= " + integer.getAndIncrement()); } public static WuserInfo factoryBeanMethodTestBywyd( ) { System.out.println("工厂注入 ======== " + integer.getAndIncrement() /*+ " type-> " + type + " name" + name*/); return new WuserInfo(); } public void setInnerClass(InnerClass innerClass) { this.innerClass = innerClass; System.out.println("setter注入 ========================================= " + integer.getAndIncrement()); } @Override public void destroy() throws Exception { } public WuserInfo(byte type, String userName) { this.type = type; this.userName = userName; } private WemailRecord record; private InnerClass innerClass; public WuserInfo() { } public InnerClass getInnerClass() { return innerClass; } public void setEmai(String emai) { this.emai = emai == null ? null : emai.trim(); // System.out.println("setter注入 ========================================= " + integer.getAndIncrement()); } public WemailRecord getRecord() { return record; } public void setRecord(WemailRecord record) { this.record = record; } public static class InnerClass { private String name = "inner Class"; public String getName() { return name; } public void setName(String name) { this.name = name; } } private String userName; private String password; private String emai; private Byte type; private Date createDate; private Byte source; private String phone; public WuserInfo(WemailRecord record) { this.record = record; } public String getUserName() { return userName; } // @Required public void setUserName(String userName) { this.userName = userName == null ? null : userName.trim(); } public String getPassword() { return password; } public void setPassword(String password) { this.password = password == null ? null : password.trim(); } public String getEmai() { return emai; } public Byte getType() { return type; } public void setType(Byte type) { this.type = type; } public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } public Byte getSource() { return source; } public void setSource(Byte source) { this.source = source; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone == null ? null : phone.trim(); } } 配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd" default-init-method="init" default-destroy-method="destory"> <!-- services --> <!-- <aop:config proxy-target-class="false"/>--> <!-- more bean definitions for services go here --> <!-- factory-method="factoryBeanMethodTestBywyd" init-method="init1"--> <bean id="userInfo" class="com.wangyadong.hobby.front.model.WuserInfo" init-method="init1"> <constructor-arg index="0" value="1"/> <constructor-arg index="1" value="wangyadong"/> <!-- <constructor-arg name="type" value="1"/> <constructor-arg name="userName" value="wangyadong"/>--> <!-- <constructor-arg name="isType" value="1"/> <constructor-arg name="isUserName" value="wangyadong"/>--> <!-- <constructor-arg name="record" ref="email"/>--> <property name="innerClass"> <bean class="com.wangyadong.hobby.front.model.WuserInfo$InnerClass" scope="prototype"> <property name="name" value="dddd"/> </bean> </property> </bean> <bean id="email" class="com.wangyadong.hobby.front.model.WemailRecord"> <!-- <constructor-arg name="wuserInfo" ref="userInfo"/>--> </bean> <bean id="email1" class="com.wangyadong.hobby.front.model.WemailRecord" autowire="byName"> <!-- <constructor-arg name="wuserInfo" ref="userInfo"/>--> </bean> <context:property-placeholder location="classpath:application.properties"/> <context:annotation-config/> <!-- <context:annotation-config/>--> <!-- <bean class="org.springframework.beans.factory.annotation.C"/>--> </beans>