这里拿两个类进行举例
app.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="com.java12.spring.life.UserLife.User" lazy-init="true">
<property name="beanName" value="guozhibo"></property>
</bean>
<bean id="admin" class="com.java12.spring.life.admin.Admin" init-method="init" destroy-method="aa"></bean>
</beans>
User
public class User implements BeanNameAware{
private String beanName;
private String name;
public void setName(String name) {
System.out.println("给属性赋值");
this.name = name;
}
public User() {
System.out.println("对象被实例化");
}
public User(String beanName) {
this.beanName = beanName;
}
public String getBeanName() {
return beanName;
}
@Override
public void setBeanName(String s) {
this.beanName = s;
}
@Override
public String toString() {
return "User{" +
"beanName='" + beanName + '\'' +
'}';
}
}public class User implements BeanNameAware{
private String beanName;
private String name;
public void setName(String name) {
System.out.println("给属性赋值");
this.name = name;
}
public User() {
System.out.println("对象被实例化");
}
public User(String beanName) {
this.beanName = beanName;
}
public String getBeanName() {
return beanName;
}
@Override
public void setBeanName(String s) {
this.beanName = s;
}
@Override
public String toString() {
return "User{" +
"beanName='" + beanName + '\'' +
'}';
}
}
BeanNameAware实现这个接口,可以用于测试执行过程
spring在执行过程中,首先会实例化这个类,然后去给属性赋值,紧接着调用BeanNameAware下的setBeanName这个方法
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Admin
public class Admin implements BeanFactoryAware{
private BeanFactory beanFactory;
private ApplicationContext applicationContext;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
System.out.println("这是第二步通过BeanFactoryAware获取容器");
}
}
实现BeanFactoryAware这个接口,就回调用setBeanFactory这个方法,这里可以拿到spring容器中的实例,可以对之就行加工
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
public class Admin implements BeanFactoryAware,ApplicationContextAware{
private BeanFactory beanFactory;
private ApplicationContext applicationContext;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
System.out.println("这是第二步通过BeanFactoryAware获取容器");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
int beanDefinitionCount = applicationContext.getBeanDefinitionCount();
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String str:beanDefinitionNames) {
System.out.println(str);
}
System.out.println("第三步获取所有id:"+beanDefinitionCount);
}
实现了ApplicationContextAware这个接口,就会调用setApplicationContext这个方法,这里可以获取到容器中所有的bean,我们可以对其进行修饰
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
public class Admin1 implements InitializingBean,BeanPostProcessor{
@Override
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
System.out.println("预------------------------"+o);
return o;
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("aaaaaaaaaaaaaaaaaaaa");
}
@Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
System.out.println("初始化");
return o;
} }
}
实现InitializingBean接口,就回调用他自己的初始化方法,对于整个容器而言,谁实现了这个接口,就在实现的那个地方进行初始化 这一步在预初始化之前的后面执行 执行顺序如图所示
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用。如果既采用init-method属性指定初始化方法,又实现InitializingBean接口来指定初始化方法的话,Spring会先执行InitializingBean接口中定义的方法,然后执行init-method属性指定的方法。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
bean完成一系列初始化工作可以被使用了
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
最后
public class Admin implements DisposableBean{
@Override
public void destroy() throws Exception {
System.out.println("默认销毁");
}
private void aa() {
System.out.println("手动销毁");
}
}
如果bean实现了DisposableBean这个接口,spring将调用destroy方法,如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法,同样,如果bean使用了destroy-method声明了销毁方法,该方法也会被调用。