Spring 如何初始化一个容器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 如何初始化一个容器相关的知识,希望对你有一定的参考价值。
写一个类,实现InitializingBean接口,然后交由spring容器管理
Java代码public class InitDataListener implements InitializingBean, ServletContextAware
private UserService userService;//属性。和配置文件对应property name对应
private Logger log = Logger.getLogger(InitDataListener.class);
public UserService getUserService()
return userService;
public void setUserService(UserService userService)
this.userService = userService;
@Override
public void afterPropertiesSet() throws Exception
//在这个方法里面写 初始化的数据也可以。
@Override
public void setServletContext(ServletContext arg0)
//userMap容器存放 userList(用户数据)
List<User> userList = new ArrayList<User>();
try
userList = userService.queryAllUser();
Map<String, Object> userMap = CachFactory.getInstance().createCach("userMap");
//一个工厂模式和单例模式的使用。文档最后有代码
for(User user:userList)
userMap.put(user.getUserid(), user);
catch (Exception e)
log.error("queryAllUser error系统初始化查询所有用户出错");
System.out.println(userList.size());
Java代码
<!-- spring系统启动以后,加载该类,查询所有数据 -->
<bean class="adtec.init.InitDataListener">
<property name="userService" ref="userService"></property>
</bean> 参考技术A BeanFactory factory = new XmlBeanFactory(resource);3:ApplicationContext context = new ClassPathXmlApplicationContext( new String[] "applicationContext.xml", "applicationContext-part2.xml");BeanFactory factory = (BeanFactory) context;详细展开 :一:org.springframework.core.io包中主要是各样的Resource类1:类名是斜体的表示是抽象类,正体的表示普通类2:3:温昱说图org.springframework.core.io包中主要是各样的Resource类,Spring的 Resource 接口是为了提供更强的访问底层资源能力的抽象。相当巧妙的地方在于,为何AbstractResource的子类有的override了getFile()而有的没有?这是因为在AbstractResource的getFile()方法设计为抛出异常,如果子类没有重写此方法,说明子类不支持通过绝对路径查找资源的方式,而override的子类则提供自己的实现。这里通过类的层次设计,充分利用继承带来的优点,避免了大量的条件语句。二:关于 org.springframework.beans.factory 包和 org.springframework.context 包:1:BeanFactory 是个接口,LifecycleBean 是个类它负责管理bean的生命周期,它实现了4个接口,并且有一个 BeanFactory 类型的变量 owningFactoryorg.springframework.beans.factory包下面的 而是org.springframework.beans.factory.xml下面的2。 ApplicationContext 也是个接口,它继承的 ListableBeanFactory 接口 又 继承 BeanFactory 接口public interface ApplicationContext extends ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver public interface ListableBeanFactory extends BeanFactory Spring的bean包支持通过编码方式管理和操作bean的基本功能,ApplicationContext则以Framework的方式提供BeanFactory的所有功能。使用ApplicationContext,你可以让系统加载你的bean,例如:在Servlet容器初始化ContextLoaderServlet时,通过ContextLoader类加载Spring Framework),而不是使用编码方式来加载。本回答被提问者采纳
spring源码分析IOC容器初始化(总结)
前言:在经过前面十二篇文章的分析,对bean的加载流程大致梳理清楚了。因为内容过多,因此需要进行一个小总结。
经过前面十二篇文章的漫长分析,终于将xml配置文件中的bean,转换成我们实际所需要的真正的bean对象。
总结
【spring源码分析】IOC容器初始化(一):主要分析了Spring是如何解析占位符以及BeanFactory的最终实现类DefaultListableBeanFactory。
【spring源码分析】IOC容器初始化(二):以loadBeanDefinitions函数为切入点,介绍了Resource体系与ResourceLoader体系,以及Spring是如何确定文件的验证模式,着重分析了Spring是如何对注释信息进行消费的。
【spring源码分析】IOC容器初始化(三):主要分析Spring是如何对bean进行解析的,为BeanDefinition的注册做准备。
【spring源码分析】IOC容器初始化(四):分析BeanDefinition注册的核心流程。
以上4篇文章,主要分析了Spring是如何从xml配置文件中加载并解析bean变成BeanDefinition对象的。注意最终BeanDefinition的落脚点为:beanDefinitionMap。bean加载的整个流程如下图:
【spring源码分析】IOC容器初始化(五):本篇文章主要对AbstractApplicationContext#refresh的剩余方法进行粗略介绍,了解其大致流程。
【spring源码分析】IOC容器初始化(六):进入bean的加载流程,主要分析如何从单例缓存中获取bean实例。
【spring源码分析】IOC容器初始化(七):继续分析了从单例缓存中获取bean实例,并且还简要分析了其他scope作用域bean的实例化流程。
【spring源码分析】IOC容器初始化(八):主要介绍AbstractAutowireCapableBeanFactory#createBean方法,关注createBeanInstance、populateBean、initializeBean函数。
【spring源码分析】IOC容器初始化(九):着重分析instantiateUsingFactoryMethod方法的执行流程,方法体较大,其核心点就是确定工厂对象、获取构造函数和构造参数,最后通过反射执行工厂方法创建bean对象。
【spring源码分析】IOC容器初始化(十):分析了AbstractAutowireCapableBeanFactory#createBean的余下流程。
【spring源码分析】IOC容器初始化(十一):主要分析了createBeanInstance方法的余下流程,主要关注populateBean和initializeBean方法。
【spring源码分析】IOC容器初始化(十二):着重分析了Spring中的循环依赖问题,Spring只解决单例模式下的循环依赖问题。
从六到十二篇主要分析了bean的初始化过程,以及Spring中是如何解决循环依赖的。
接下来计划:IOC初始化过程中查漏补缺,Spring AOP的相关源码。
by Shawn Chen,2019.04.29,下午。
以上是关于Spring 如何初始化一个容器的主要内容,如果未能解决你的问题,请参考以下文章