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

枕上诗书闲处好,门前风景雨来佳。这篇文章主要讲述单例模式& 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
【单例模式& BeanFactory与ApplicationContext之间的区别】代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构造器,创建实例对象
 
 
AOP概念:
      AOP面向切面编程,横切关注点
 
2.AOP专业术语
切点:主业务类中能匹配到切点表达式的方法
切面:通知和切点的集合   交叉业务类称为切面
连接点:主业务类中的方法
通知:增强类中的方法
织入:动态的过程,将通知和切点绑定的过程称为织入
 
基于xml的DI(Dependency Injection)
          注入类型:
              1.1设值注入(set方法注入):本质上是调用了Bean的setXXX()进行值的注入
 
              普通属性
                    < property name="name" value="https://www.songbingjia.com/android/微冷的雨"> < /property>
                    < property name="age" value="https://www.songbingjia.com/android/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="https://www.songbingjia.com/android/微冷的雨"> < /constructor-arg>  
                      < constructor-arg index="1" value="https://www.songbingjia.com/android/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
 

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

文章图片
public class User {public User(){System.out.println("实例化User"); }}

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

文章图片
 
2.在创建一个ApplicationContext.xml文件
单例模式&amp;BeanFactory与ApplicationContext之间的区别

文章图片
< ?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>

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

文章图片
 
3.创建测试类
     
单例模式&amp;BeanFactory与ApplicationContext之间的区别

文章图片
public class TestHappy { /** * BeanFactory的测试 */@Testpublic void beanFactoryTest(){BeanFactory beanFactory=new XmlBeanFactory(new ClassPathResource("applicationContext.xml")); } /** * ApplicationContext的测试 */@Testpublic void applicationContextTest(){ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); } }

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

文章图片
 
BeanFactory测试结果:
 
单例模式&amp;BeanFactory与ApplicationContext之间的区别

文章图片

 
ApplicationContext测试结果:
 
             
单例模式&amp;BeanFactory与ApplicationContext之间的区别

文章图片

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

    推荐阅读