单例模式&BeanFactory与 ApplicationContext之间的区别

Posted liuzhe01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式&BeanFactory与 ApplicationContext之间的区别相关的知识,希望对你有一定的参考价值。

BeanFactory博客书写 使用对象的时候创建,这是和ApplicationContext的区别

        Resource resource=new ClassPathResource("applicationContext.xml");

BeanFactory ctx=new XmlBeanFactory(resource);

        获取到上下文,并没有初始化bean,等待使用bean的时候才初始化

  ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");

 

  所有的bean已经初始化了

 

  http://www.yesky.com/imagesnew/software/spring/beans.html

代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构造器,创建实例对象

 

 

AOP概念:

   AOP面向切面编程,横切关注点

 

2.AOP专业术语

切点:主业务类中能匹配到切点表达式的方法

切面:通知和切点的集合  交叉业务类称为切面

连接点:主业务类中的方法

通知:增强类中的方法

织入:动态的过程,将通知和切点绑定的过程称为织入

 

基于xml的DI(Dependency Injection)

     注入类型:

       1.1设值注入(set方法注入):本质上是调用了Bean的setXXX()进行值的注入

 

       普通属性

          <property name="name" value="微冷的雨"></property>

          <property name="age" value="18"></property>

 

       域属性(JavaBean属性)

       <property name="myCar" ref="mmCar"></property>

 

接下来到我们昨天学的了

构造注入,开始以为很难,其实也不过如此

12.  *构造注入:

         <bean id="stu2" class="cn.happy.day01.entity.Student">

<constructorb-arg> 是构造标签

           <constructor-arg index="0" value="微冷的雨"></constructor-arg>  

           <constructor-arg index="1" value="18"></constructor-arg>  

           <constructor-arg index="2"  ref="mmCar"></constructor-arg>  

        </bean>

13.命名空间p注入 (2个步骤)

 

13.命名空间p注入 (2个步骤)

*********************************************************

      1.1 使用前要先要在Spring配置文件中引入p命名空间

       xmlns:p="http://www.springframework.org/schema/p"

 

      1.2.本质上还是set方法注入   

      <!--02.p命名空间注入 -->

      <bean id="stu3" class="cn.happy.day01.entity.Student"

      p:name="国庆放假买手机" p:age="18" p:myCar-ref="mmCar">

 

集合属性注入

 

<bean id="array" class="cn.happy.spring04collection.MyCollection">

       <property name="array">

          <array>

             <value>zly</value>

             <value>lxl</value>

          </array>

       </property>

    </bean>

 

List

   配置文件

     <bean id="listCollection" class="cn.day00di_xml.BeanCollection">

        <property name="list">

            <list>

                <ref bean="car"></ref>

                <ref bean="car2"></ref>

            </list>

        </property>

       </bean>

 

 Map

       <!--集合属性注入之           Map-->

      <bean id="mapCollection" class="cn.day00di_xml.BeanCollection">

          <property name="map">

              <map>

                  <entry key="Green">

                      <ref bean="car2"></ref>

                  </entry>

                  <entry key="Pink">

 

  

     <!-- properties -->

    <bean id="properties" class="cn.happy.spring04collection.MyCollection">

       <property name="properties">

和Map集合属性打出来的效果是一样的

          <props>

            <prop key="001">001</prop>

            <prop key="002">002</prop>

          </props>

       </property>

    </bean>

 

1.1引入

    spring-aop-4.2.0.RELEASE.jar

     引入aopjar包是因为注解用到了aop的内容

    相同点:

    两者都是通过xml配置文件加载bean,ApplicationContext和BeanFacotry相比,提供了更多的扩展功能。

   不同点:

    BeanFactory是延迟加载,如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常;而ApplicationContext则在初始化自身是检验,这样有利于检查所依赖属性是否注入;所以通常情况下我们选择使用ApplicationContext

component:组件

     一个bean,就是一个组件

     scan:浏览

开启包扫描器

cn.happy.entity

 <context:component-scan base-package="路径名"></context:component-scan>

作业:

 

  3.BeanFactory 和ApplicationContext区别

 

   3.一个简单的例子来证明BeanFactory和ApplicationContext主要区别

    搭建工程的环境就不说了,直接上代码。

1.首先创建一个实体类:User

 

复制代码
public class User {

     public User(){

      System.out.println("实例化User");

     }

}
复制代码

 

2.在创建一个ApplicationContext.xml文件

复制代码
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="

        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" class="cn.test.User"></bean>

</beans>
复制代码

 

3.创建测试类

   

复制代码
public class TestHappy {

 

/**

 * BeanFactory的测试

 */

@Test

public void beanFactoryTest(){

BeanFactory beanFactory=new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));

}

 

 

/**

 * ApplicationContext的测试

 */

@Test

public void applicationContextTest(){

ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

}

 

}
复制代码

 

BeanFactory测试结果:

 

 

ApplicationContext测试结果:

 

       

 

  总结:

   BeanFactory当需要调用时读取配置信息,生成某个类的实例。如果读入的Bean配置正确,则其他的配置中有错误也不会影响程序的运行。而ApplicationContext 在初始化时就把 xml 的配置信息读入内存,对 XML 文件进行检验,如果配置文件没有错误,就创建所有的Bean ,直接为应用程序服务。相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。

以上是关于单例模式&BeanFactory与 ApplicationContext之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

使用beanFactory工厂实例化容器的方式实现单例模式

设计模式 创建者模式 -- 创建者模式概述 & 单例设计模式的介绍和实现(饿汉式 & 懒汉式)

&-JAVA基础学习-单例模式

Spring源码解析 - BeanFactory

Spring 设计模式总结

单例模式——使用GCD实现单例模式 & 非ARC单例模式 &使用GCD和线程锁实现单例模式-b