Spring系列(二)——Bean的生命周期及属性赋值

一、@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: tazhigang095@163.com
	 * @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: tazhigang095@163.com
	 * @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: tazhigang095@163.com
	 * @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: tazhigang095@163.com
	 * @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: tazhigang095@163.com
	 * @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"'}

转载于:https://my.oschina.net/ittzg/blog/3046051

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值