一、@Bean注解指定初始化和销毁的方法
1、源码
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) //方法与注解上使用
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
@AliasFor("name")
String[] value() default {}; //注入容器是的id名称
@AliasFor("value")
String[] name() default {}; //同value()
Autowire autowire() default Autowire.NO;
String initMethod() default ""; //对象初始化时调用 //该方法必须定义在类内部
String destroyMethod() default "(inferred)"; //对象销毁时调用//该方法必须定义在类内部
}
2、案例
(1)Color.java
package com.ittzg.bean;
/**
* @email: [email protected]
* @author: ittzg
* @date: 2019/5/5 16:43
*/
public class Color {
private String desc;
public Color() {
System.out.println("------Color创建----------");
}
public void init(){
System.out.println("------init----------");
}
public void destroy(){
System.out.println("------destroy----------");
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "Color{" +
"desc='" + desc + '\'' +
'}';
}
}
=========================================================================================
(2)BeanConfig5.java
@Configuration
public class BeanConfig5 {
@Bean(value="color",initMethod = "init",destroyMethod = "destroy")
public Color getColorBean(){
return new Color();
}
}
=========================================================================================
(3)测试:
@Test
public void test08(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig5.class);
System.out.println("关闭容器");
applicationContext.close();
}
输出:
------Color创建----------
------init----------
关闭容器
------destroy----------
结果:由于IOC容器只会管理单例的bean的初始化和销毁所以IOC注入的bean会以单例作演示;
(1)Color实例的初始化在对象创建之后,并且会调用@Bean中指定的初始化方法
(2)Color实例的销毁在容器关闭之后,并且会调用@Bean中指定的销毁方法
二、InitializingBean,DisposableBean接口实现bean的初始化和销毁的方法
1、源码
(1)InitializingBean.java
package org.springframework.beans.factory;
//spring提供的bean创建后初始化操作
//使用时需要使用者实现InitializingBean
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
=========================================================================================
(2)DisposableBean.java
package org.springframework.beans.factory;
//spring提供的bean销毁时操作
//使用时需要使用者实现InitializingBean
public interface DisposableBean {
void destroy() throws Exception;
}
2、案例
(1)Animal.java
package com.ittzg.bean;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
/**
* @email: [email protected]
* @author: ittzg
* @date: 2019/5/5 16:54
*/
public class Animal implements InitializingBean,DisposableBean {
public Animal() {
System.out.println("-----Animal----Constructor-----");
}
@Override
public void destroy() throws Exception {
System.out.println("-----Animal----destroy-----");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("-----Animal----afterPropertiesSet-----");
}
}
=========================================================================================
(2)BeanConfig6.java
@Configuration
public class BeanConfig6 {
@Bean(value="animal")
public Animal getAnimalBean(){
return new Animal();
}
}
=========================================================================================
(3)测试验证
@Test
public void test09(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig6.class);
System.out.println("关闭容器");
applicationContext.close();
}
结果:
-----Animal----Constructor-----
-----Animal----afterPropertiesSet-----
关闭容器
-----Animal----destroy-----
三、@PostConstruct实现bean的初始化,@PreDestroy实现bean的销毁
1、@PostConstruct与@PreDestroy是jdk提供的对象初始化和创建的两个注解 2、案例
(1)Cat.java
package com.ittzg.bean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
/**
* @email: [email protected]
* @author: ittzg
* @date: 2019/5/6 13:28
*/
public class Cat {
public Cat() {
System.out.println("------Cat创建----------");
}
@PostConstruct
public void init(){
System.out.println("----Cat---@PostConstruct---init----------");
}
@PreDestroy
public void destroy(){
System.out.println("----Cat----@PreDestroy---destroy----------");
}
}
=========================================================================================
(2)BeanConfig7.java
@Configuration
@Import(value = {Cat.class})
public class BeanConfig7 {
}
=========================================================================================
(3)测试验证
@Test
public void test09(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig7.class);
System.out.println("关闭容器");
applicationContext.close();
}
结果:
------Cat创建----------
----Cat---@PostConstruct---init----------
关闭容器
----Cat----@PreDestroy---destroy----------
四、BeanPostProcessor后置处理器
1、BeanPostProcessor是spring提供的后置处理器,先来看一下源码
package org.springframework.beans.factory.config;
import org.springframework.beans.BeansException;
public interface BeanPostProcessor {
//这个方法是在对象初始化之前调用的
Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException;
//这个方法是在对象初始化之后调用的
Object postProcessAfterInitialization(Object var1, String var2) throws BeansException;
}
2、案例
(1)Cat.java
package com.ittzg.bean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
/**
* @email: [email protected]
* @author: ittzg
* @date: 2019/5/6 13:28
*/
public class Cat {
public Cat() {
System.out.println("------Cat创建----------");
}
@PostConstruct
public void init(){
System.out.println("----Cat---@PostConstruct---init----------");
}
@PreDestroy
public void destroy(){
System.out.println("----Cat----@PreDestroy---destroy----------");
}
}
=========================================================================================
(2)BeanConfig8.java
@Configuration
@Import(value = {Cat.class, MyBeanPostProcessor.class})
public class BeanConfig8 {
}
=========================================================================================
(3)测试验证
@Test
public void test09(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig8.class);
System.out.println("关闭容器");
applicationContext.close();
}
结果:
------Cat创建----------
postProcessBeforeInitialization{com.ittzg.bean.Cat---->初始化}
----Cat---@PostConstruct---init----------
postProcessAfterInitialization{com.ittzg.bean.Cat---->初始化之后}
关闭容器
----Cat----@PreDestroy---destroy----------
五、@Value的使用
1、案例(在resource下创建user.properties文件;内容:user.desc="read")
(1)User.class
package com.ittzg.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
/**
* @email: [email protected]
* @author: ittzg
* @date: 2019/5/5 9:36
*/
@PropertySource("classpath:user.properties")
public class User {
@Value("张三") //直接赋值
private String name;
@Value("#{22-1}") //支持SqEL表达式
private int age;
@Value("${user.desc}") //支持外部引入的文件
private String desc;
public User() {
System.out.println("user实例化.......");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", desc='" + desc + '\'' +
'}';
}
}
=========================================================================================
(2)UserBeanConfig.java
@Configuration
@Import(value = {User.class})
public class UserBeanConfig {
}
=========================================================================================
(3)测试验证
@Test
public void test12(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(UserBeanConfig.class);
User bean = applicationContext.getBean(User.class);
System.out.println(bean);
}
结果:
user实例化.......
User{name='张三', age=21, desc='"read"'}