欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring4.0(上)

程序员文章站 2022-05-25 17:08:20
...

记录Spring 4.0 上 学习中的知识点

bean的配置方式

  • 通过全类名(反射)
  • 通过工厂方式(静态工厂方法&实例工厂方法)
  • FactoryBean

依赖注入的方式

  • 属性注入
  • 构造器注入
  • 工厂方法注入

通过全类名(反射)配置Bean
要求:Bean中有默认构造器

class:bean的全类名
id:标识容器中的bean,id唯一

示例代码如下:

<!-- 配置bean -->
    <bean id="helloWorld" class="com.wkl.Spring.beans.HelloWorld">
        <property name="name" value="Spring"></property>
    </bean>
ApplicationContext的主要实现类

ClassPathXmlApplictaionContext:从类路径下加载配置文件
FileSystemXmlApplicationContext:从系统文件中加载配置文件

ApplicationConetx ctx = new ClassPathXmlApplictaionContext(XXXX.xml);
Object obj = ctx.getBean("beanId");

使用构造器注入属性,可以设置index或者type区别位置和传值类型来确定构造器:

<!-- 通过构造方法来配置bean 的属性 -->
    <bean id="car" class="com.wkl.Spring.beans.Car">
        <constructor-arg value="Audi" index="0"></constructor-arg>
        <constructor-arg value="上海" index="1"></constructor-arg>
        <constructor-arg value="300000" index="2"></constructor-arg>
    </bean>

引用其他bean:可以用ref属性或者ref元素<ref>

<bean id="person" class="com.wkl.Spring.beans.Person">
        <property name="name" value="越马飞"></property>
        <property name="age" value="23"></property>
        <!-- <property name="car" ref="car2"></property> -->
        <property name="car">
            <ref bean="car2"/>
        </property>
    </bean>

*内部bean
内部bean不能被外部使用,只能内部使用

<!-- 内部bean -->
    <bean id="person2" class="com.wkl.Spring.beans.Person">
        <property name="name" value="剑马飞"></property>
        <property name="age" value="23"></property>
        <!-- <property name="car" ref="car2"></property> -->
        <!-- <property name="car">
            <ref bean="car2"/>
        </property> -->

        <property name="car">
            <bean class="com.wkl.Spring.beans.Car">
                <constructor-arg value="Ford"></constructor-arg>
                <constructor-arg value="长安"></constructor-arg>
                <constructor-arg value="200000" type="double"></constructor-arg>
            </bean>
        </property>
         <!-- 
         <property name="car.maxSpeed" value="260"></property>
         -->
    </bean>

当使用集合bean的时候:
不能将集合作为独立的bean定义,所以其他的bean无法引用该集合,所以无法在不同bean之间共享集合;
可以使用util schema来定义独立的集合bean

<!-- 测试如何配置集合属性 -->
    <bean id="person4" class="com.wkl.Spring.beans.collection.Person">
        <property name="name" value="Mike"></property>
        <property name="age" value="25"></property>
        <property name="cars">
            <!-- 使用list属性给集合赋值 -->
            <list>
                <ref bean="car"/>
                <ref bean="car2"/>
            </list>
        </property>
    </bean>

    <!-- 配置map属性值 -->
    <bean id="newPerson" class="com.wkl.Spring.beans.collection.NewPerson">
        <property name="name" value="Rose"></property>
        <property name="age" value="28"></property>
        <property name="cars">
            <map>
                <entry key="AA" value-ref="car"></entry>
                <entry key="BB" value-ref="car2"></entry>
            </map>
        </property>
    </bean>

    <!-- 配置Properties属性值 -->
    <bean id="dataSource" class="com.wkl.Spring.beans.collection.DataSource">
        <property name="properties">
            <props>
                <prop key="user">root</prop>
                <prop key="password">123456</prop>
                <prop key="jdbcUrl">jdbc:mysql:///test</prop>
                <prop key="driverClass">com.mysql.jdbc.Driver</prop>
            </props>
        </property>
    </bean>

    <!-- 配置单例集合bean,以供多个bean进行引用,需要导入util命名空间 -->
    <util:list id="cars">
        <ref bean="car"/>
        <ref bean="car2"/>
    </util:list>

    <bean id="person5" class="com.wkl.Spring.beans.collection.Person">
        <property name="name" value="Jack"></property>
        <property name="age" value="29"></property>
        <property name="cars" ref="cars"></property>
    </bean>

Xml配置里的Bean自动装配

可以使用auto-wire属性指定自动装配的方式
ByType(根据类型自动装配):根据bean的类型,若IoC容器中有一个以上的类型匹配bean,则报异常
ByName(根据名称自动装配):根据名字和当前bean的setter风格属性进行自动装配
Constructor(根据构造器自动装配)

<!-- 通过名称自动装配示例 -->
<bean id="person" class="com.wkl.Spring.beans.autowire.Person"
        p:name="Tom" autowire="byName"></bean>

bean之间的关系

  • 继承:
    使用bean的parent属性指定继承哪个bean的配置
    注:使用abstruct属性把bean定义为抽象bean(模版bean),则该bean不能实例化;
<!-- bean的 abstract属性为true,这样的bean不能被ioc容器实例化,只能用来被继承配置
    若某一个bean的class属性没有指定,则该bean必须是一个抽象bean
     -->
    <bean id="address"
        p:city="BeiJing" p:street="WuDaoKou" abstract="true"></bean>

    <!-- 使用bean的parent属性指定继承哪个bean的配置 -->
    <bean id="address2"  class="com.wkl.Spring.beans.autowire.Address" parent="address" p:street="WangFuJing"></bean>

    <bean id="address3"  class="com.wkl.Spring.beans.autowire.Address" parent="address2" p:street="DaZhongSi"></bean>
  • 依赖
    使用depends-on属性配置依赖属性,依赖的bean会在本bean实例前创建好;
    依赖多个bean,可以通过逗号、空格的方式配置bean名称
<bean id="address"
        p:city="BeiJing" p:street="WuDaoKou" abstract="true"></bean>

    <!-- 使用bean的parent属性指定继承哪个bean的配置 -->
    <bean id="address2"  class="com.wkl.Spring.beans.autowire.Address" parent="address" p:street="WangFuJing"></bean>
    <bean id="car" class="com.wkl.Spring.beans.autowire.Car" p:brand="Audi"
        p:price="300000"></bean>

    <!-- 要求在配置Person时必须有一个关联的car  ! 换句话说就是person依赖于car这个bean -->
    <bean id="person" class="com.wkl.Spring.beans.autowire.Person"
        p:name="Tom" p:address-ref="address2" depends-on="car"></bean>

bean的作用域

scope属性:
prototype:原型的。容器初始化的时候不创建bean的实例,而是在每次请求时都创建一个新的bean实例,并返回;
singleton:默认的;单例的;在整个容器生命周期中只创建这一个bean(在容器初始化时创建);
不常用的属性:request、session

<bean id="car" class="com.wkl.Spring.beans.autowire.Car"
        scope="">
        <property name="brand" value="Audi"></property>
        <property name="price" value="300000"></property>
    </bean>

使用外部属性文件

需要C3P0.jar;mysql需要mysql相应的jar
配置方式:<context:property-placeholder location="classpath:db.properties"/>
使用${name} 的形式导入数据

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 使用外部属性文件的属性 -->
        <property name="user" value="${user}"></property>
        <property name="password" value="${password}"></property>
        <property name="driverClass" value="${driverClass}"></property>
        <property name="jdbcUrl" value="${jdbcUrl}"></property>
    </bean>

SpEL

使用#{}作为界定,大括号里的都为SpEL

  • 整数:#{5}
  • 小数:#{1.1}
  • 科学计数法:#{1e4}
  • 字符串用单、双引号为界定符号:#{'char'},#{"char"}
  • Boolean:#{false}

    引用bean属性和方法:
  • 引用其他对象:#{beanName}

  • 引用属性:#{beanName.suffix}
  • 引用方法:#{beanName.method()} 或者方法调用方法#{beanName.method().otherMethod()}

    SpEL支持
  • 支持:+,-,*,/,%,^
  • 支持:"String" + "String"
  • 支持:<(lt),>(gt),==(eq),<=(le),>=(ge);
  • 支持:and,or,not,|
  • 支持:if-else:a > b ? c : d
  • 支持:正则表达式;
  • 支持:静态方法、属性:T() 调用一个类,然后调用相应的静态属性和方法:#{T().PI}

IoC管理Bean的生命周期

未加后置处理
  1. 通过构造器或工厂方法创建Bean实例;
  2. 为Bean的属性设置值和对其他Bean引用;
  3. 调用Bean的初始化方法;
  4. 使用Bean;
  5. 当容器关闭时xx.close() ,调用Bean的销毁方法。

    暂时没有,稍后补充。。。
Bean声明中设置:

初始化方法:init-method
销毁方法:destroy-method

 暂时没有,稍后补充。。。
创建Bean后置处理器
  • 在调用初始化方法前后对Bean进行额外的处理
  • 对IoC容器中所有Bean实例逐一处理
  • 需要实现BeanPostProcessor借口

    1. 通过构造器或工厂方法创建Bean实例
    2. 为Bean的属性设置值和对其他Bean的引用
      2.5 将Bean实例传递给Bean后置处理器的postProcessBeforeInitialzation方法
    3. 调用Bean的初始化方法
      3.5 将Bean实例传递给Bean后置处理器的postProcessAfterInitialzation方法
    4. 使用Bean
    5. 当容器关闭时xx.close() ,调用Bean的销毁方法

使用方法:
<bean class="XXXX.XXXXX.XXXXX.PostP....."></bean>

注意:在After和Before时,可以换掉或修改Bean

 暂时没有,稍后补充。。。
相关标签: Spring