3-Spring核心概念

1、SpringIOC容器:
相关概念:
      Spring 容器是 Spring 框架的核心
      容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁
      IOC 容器具有依赖注入功能的容器,它可以创建对象,这些对象被称为 Spring Beans,IOC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
      [通常new一个实例,控制权由程序员控制,而"控制反转"是指new实例工作不由程序员来做而是交给Spring容器来做]
SpringIOC容器的两个代表:

关于BeanFactory:老版本的工厂,当程序调用getBean的时候,才会生成类的实例
关于ApplicationContext:
1)、相关概念:
    ApplicationContext:新版本的工厂,当程序加载配置文件的时候,就会将Spring管理的类都实例化
    ApplicationContext是BeanFactory的子接口,也被称为Spring上下文
    ApplicationContext容器包括 BeanFactory 容器的所有功能,一般情况下,相对于 BeanFactory,ApplicationContext 会更加优秀。当然,BeanFactory 仍可以在轻量级应用中使用,比如移动设备或者基于 applet 的应用程序
2)、ApplicationContext下的两个实现类:
    FileSystemXmlApplicationContext该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径
    ClassPathXmlApplicationContext该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可(IDEA不用配置),因为,容器会从 CLASSPATH 中搜索 bean 配置文件

2、SpringBean
相关概念:
    bean 是一个被实例化,组装,并通过 Spring IOC容器所管理的对象
    Spring容器根据与bean相关的配置信息(元数据)创建bean对象
SpringIOC容器与SpringBean之间的关系:

从上图可看到与Bean配置信息有关的三种方式
Bean的作用域:
     当在 Spring 中定义一个 bean 时,你应该声明该 bean 的作用域的选项。例如,为了强制 Spring 在每次需要时都产生一个新的 bean 实例,你应该声明 bean 的作用域的属性为 prototype。同理,如果你想让 Spring 在每次需要时都返回同一个bean实例,你应该声明 bean 的作用域的属性为 singleton(默认)
     Spring 框架支持以下五个作用域,分别为singleton、prototype、request、session和global session,5种作用域说明如下所示,注意,如果使用 web-aware ApplicationContext 时,其中三个是可用的

注:
    Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象
    当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型(多例)类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象

当类A依赖类B(类A的成员变量为类B的对象),作用域不一致时,取出A/B的情况:

Bean的生命周期:
生命周期只谈其初始化和销毁方法的配置
1、在Spring核心配置文件bean标签上进行配置:
      init-method:bean被初始化后立即执行的方法
     destroy-method:bean被销毁前立即执行的方法
2、让类实现两个接口:InitializingBeanDisposableBean,分别重写其中的各一个方法:afterPropertiesSet()和destroy()
[注:如果上述两种方式都进行了配置,那么优先执行第二种方式指定的方法]
3、使用注解方式(待)

补:全局默认配置:在beans开始标签中添加:default-init-method=“”default-destroy-method=“”

Bean的懒加载:
应用于作用域为单例模式的bean
1、在Spring核心配置文件bean标签上进行配置:lazy-init="true"
2、全局默认配置:default-lazy-init="true"
优点:节省资源空间
缺点:可能会导致某些操作响应时间增加

Bean的属性继承:
Spring Bean 定义的继承与 Java 类的继承无关,但是继承的概念是一样的,可以定义一个父 bean 的定义作为模板和其他子 bean 就可以从父 bean 中继承所需的配置。
1、普通beanA继承普通beanB的相关配置:

  <bean id="helloWorld" class="com.tutorialspoint.HelloWorld">
      <property name="message1" value="Hello World!"/>
      <property name="message2" value="Hello Second World!"/>
   </bean>

   <bean id="hello" class="com.tutorialspoint.Hello" parent="helloWorld">
      <property name="message1" value="Hello India!"/>
      <property name="message3" value="Namaste India!"/>
   </bean>

使用 parent 属性把 “hello” bean 定义为 “helloWorld” bean 的孩子。这个子 bean 继承 message2 的属性,重写 message1 的属性,并且引入一个属性 message3
注:[HelloWorld类必须有message1和message2两个成员变量,Hello类必须有message1,message2,message3三个成员变量]

2、普通beanA继承模板beanB的相关配置:
在定义一个 Bean模板时,不应该指定类的属性,而应该指定带 true 值的抽象属性

   <bean id="beanTeamplate" abstract="true">
      <property name="message1" value="Hello World!"/>
      <property name="message2" value="Hello Second World!"/>
      <property name="message3" value="Namaste India!"/>
   </bean>

   <bean id="hello" class="com.tutorialspoint.Hello" parent="beanTeamplate">
      <property name="message1" value="Hello India!"/>
      <property name="message3" value="Namaste India!"/>
   </bean>

上述beanTemplate bean没有与任何类关联,也不会被实例化

3、模板beanA继承模板beanB的相关配置:

    <bean id="template1" abstract="true" parent="template2">
        <property name="name" value="123"></property>
    </bean>

    <bean id="template2" abstract="true">
        <property name="price" value="30000"></property>
    </bean>

3、依赖注入:
注:若bean属性继承和依赖注入所配置的属性发生冲突,只有属性继承设置的值生效
相关概念:
     Spring框架的核心功能之一就是通过依赖注入(DI Dependency Injection)的方式来管理Bean之间的依赖关系
     每个基于应用程序的 java 都有几个对象,这些对象一起工作来呈现出终端用户所看到的工作的应用程序。当编写一个复杂的 Java 应用程序时,应用程序类应该尽可能独立于其他 Java 类来增加这些类重用的可能性,并且在做单元测试时,测试独立于其他类的独立性。依赖注入(或有时称为布线)有助于把这些类粘合在一起,同时保持他们独立
     当对象与它们的依赖关系被提供时,解耦效果更明显。对象不查找它的依赖关系,也不知道依赖关系的位置或类,而这一切都由 Spring 框架控制
注入的2种方式:
有参构造注入:
[所要注入的类必须要有有参构造方法(可以重载,bean必须与其中一个相对应)]:

可以使用4种方式对name和price属性进行注入:

上述方式,需注意注入顺序与构造方法参数列表一致

上述方法,添加name属性,属性值与参数列表变量名一致

上述方式,添加type属性,属性值为参数列表变量所对应的数据类型。(当数据类型都不一致时才推荐使用)

上述方式,添加index属性,属性值从0开始,代表参数列表的第几个参数

类中set方法注入:
[类中必须要有无参构造方法和所要注入的属性的set()方法]
可以使用两种方式进行set注入:

上述方式:name属性指定要注入的成员变量,value指定注入的值;若成员变量为引用数据类型,则使用ref指定值

上述方式:借助P名称空间,需要在beans开始标签加入约束:xmlns:p="http://www.springframework.org/schema/p"

Spring注入集合:(待)

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值