在AbstractBeanDefinition中有两个属性
private String initMethodName; private String destroyMethodName;xml的相关配置
他们对应的是xml配置文件中bean标签的如下两个属性:
-
destroy-method
它的作用是在销毁bean之前可以执行指定的方法。注意:必须满足scope=“singleton”,并且destroy方法参数个数不能超过1,并且参数类型只能为boolean。
-
init-method
它的作用是在创建一个bean之后调用该方法,对bean进行一些初始化,初始化方法必须是一个无参方法。
public interface Fruit {
void showFruitName();
}
public class Apple implements Fruit {
@Override
public void showFruitName() {
System.out.println("fruit Name is apple");
}
public void testInit() {
System.out.println("testInit");
}
public void testDestroy() {
System.out.println("testDestroy");
}
}
public class FruitPlant {
Fruit fruit;
public void showFruit() {
System.out.println(fruit);
fruit.showFruitName();
}
public void setFruit(Fruit fruit) {
this.fruit = fruit;
}
}
public class ProcessorMain {
public static void main(String[] args) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext("TestOverrideMethod.xml");
//从上下文中获取FruitPlant对象
FruitPlant fruitPlant = (FruitPlant) context.getBean(FruitPlant.class);
//显示FruitPlant里的Fruit
fruitPlant.showFruit();
context.close();
}
}
输出结果
testInit com.modules.test.Apple@1fb19a0 fruit Name is apple testDestroy属性截图 注解版一 示例代码
public interface Fruit {
void showFruitName();
void testInit();
void testDestroy();
}
public class Apple implements Fruit {
@Override
public void showFruitName() {
System.out.println("fruit Name is apple");
}
public void testInit() {
System.out.println("testInit");
}
public void testDestroy() {
System.out.println("testDestroy");
}
}
@Component
public class FruitPlant {
@Autowired
Fruit fruit;
public void showFruit() {
System.out.println(fruit);
fruit.showFruitName();
}
public void setFruit(Fruit fruit) {
this.fruit = fruit;
}
}
@Configuration
@ComponentScan("com.modules.test")
public class TestConfig {
@Bean(initMethod = "testInit", destroyMethod = "testDestroy")
Fruit fruit() {
return new Apple();
}
}
public class ProcessorMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(TestConfig.class);
//从上下文中获取FruitPlant对象
FruitPlant fruitPlant = (FruitPlant) context.getBean(FruitPlant.class);
//显示FruitPlant里的Fruit
fruitPlant.showFruit();
context.close();
}
}
输出结果同上
属性截图
注解版二
第二种注解版方式是@PostConstruct和@PreDestroy这两个注解,这两个是java的注解,Spring使用这两个注解完成上面相同的功能。
注意:通过这种方式,AbstractBeanDefinition中initMethodName,destroyMethodName是没有相应的值的,是通过解析方法中的注解来执行的。
关于@PostConstruct的实现,可以参考PostConstruct
示例代码//除该类进行了修改,其他的同上
public class Apple implements Fruit {
@Override
public void showFruitName() {
System.out.println("fruit Name is apple");
}
@PostConstruct
public void testInit() {
System.out.println("testInit");
}
@PreDestroy
public void testDestroy() {
System.out.println("testDestroy");
}
}
输出结果同上
属性截图



