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 如何初始化一个容器的主要内容,如果未能解决你的问题,请参考以下文章

Spring源码解读——容器是如何初始化的

Spring源码解读——容器是如何初始化的

Spring学习---SpringIOC容器的初始化过程

如何获取容器中的bean对象

“java 程序 ,将所有的bean初始化后放到某个容器中,取的时候从容器里面取”,请问下 这个容器都是啥?

Spring源码剖析1:初探Spring IOC核心流程