Spring

在将要被加入到spring容器中的service中,添加static静态代码块(加载类时被调用),用于判断spring中新旧bean工厂的加载性质。

package com.witwicky.service.impl;

import com.witwicky.service.UserService;

public class UserServiceImpl implements UserService {

	static{
		System.out.println("init...");
	}
	
	@Override
	public void hello() {
		System.out.println("hello");
	}

}
package spring;

import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

import com.witwicky.service.UserService;
import com.witwicky.service.impl.UserServiceImpl;

public class Demo1 {
	@Test
	public void run1() {
		UserService us = new UserServiceImpl();
		us.hello();
	}
	
	/**
	 * 新工厂,当spring核心配置文件被加载完成时,其中配置的bean就已经被实例化
	 */
	@Test
	public void run2() {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//		UserService us = (UserService) ctx.getBean("userService");
//		us.hello();
	}
	
	/**
	 * 旧工厂,延迟加载,只有在获取bean工厂里的对象时,才会被实例化。
	 */
	@Test
	public void run3() {
		BeanFactory bf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
//		UserService us = (UserService) bf.getBean("userService");
//		us.hello();
	}
}

当run2执行时(注释掉后两行代码),控制台会打印初始化信息。

当run3执行时(注释掉后两行代码),控制台并不会打印初始化信息,而将后两行代码开启时,则初始化信息与打印信息一同输出。

原文地址:https://www.cnblogs.com/hfultrastrong/p/7834643.html