spring简单小笔记

spring的xml文件中 定义一个bean:

<bean id="bean的唯一标识"  class="Bean的类全名"  scope="Bean的作用范围 (singleton单例/prototype多例)"  name="别名"  >

bean实例化
    构造方法   无参构造方法 暴力反射
    静态工厂   使用静态方法创建一个对应的对象
    <bean id="bean的唯一标识" class="静态工厂类全名" factory-method="创建的方法"/>
        主要是还能做其他的业务操作 这种方式一般是用来兼容早期的一些老系统,所以==了解为主==。
    实例工厂
    1 创建对应的工厂类 和普通方法
    <bean id="工厂bean的唯一标识" class="工厂全类名"/>
    <bean id="bean的唯一标识" factory-method="工厂类方法" factory-bean="工厂bean的唯一标识"/>
    2 Spring为了简化这种配置方式就提供了一种叫`FactoryBean`的方式来简化开发。
    这种方式在Spring去整合其他框架的时候会被用到,所以这种方式需要大家理解掌握。
    创建bean工厂 实现FactoryBean<对象类>
    重写 getObject()  返回new 类对象
    重写getObjectType() 返回 类对象class
    重写isSingleton() 返回 boolean false是多例
    <bean id="bean的唯一标识(new的)" class="工厂全类名"/>

bean的生命周期
        (1)关于Spring中对bean生命周期控制提供了两种方式:

    * 在配置文件中的bean标签中添加`init-method`和`destroy-method`属性
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/> 并在类中添加对应的方法
    * 类实现`InitializingBean`与`DisposableBean`接口重写destroy(销毁)和afterPropertiesset方法,这种方式了解下即可。初始化方法会在类中属性设置之后执行。

        (2)对于bean的生命周期控制在bean的整个生命周期中所处的位置如下:

        * 初始化容器
          * 1.创建对象(内存分配)
          * 2.执行构造方法
          * 3.执行属性注入(set操作)
          * ==4.执行bean初始化方法==
        * 使用bean
          * 1.执行业务操作
        * 关闭/销毁容器
          * ==1.执行bean销毁方法==

        (3)关闭容器的两种方式:

        * ConfigurableApplicationContext是ApplicationContext的子类
          * close()方法 调用的时候关闭
          * registerShutdownHook()方法 在JVM退出前调用关闭。
DI相关内容
    为我们提供了两种注入方式,分别是:

    * setter注入
          * 简单类型
          * ==引用类型==
    * 构造器注入
          * 简单类型
          * 引用类型
    使用set方法将要引用的放入并在配置文件
public class BookServiceImpl implements BookService {
     private BookDao bookDao;
            public void setBookDao(BookDao bookDao) {
            this.bookDao = bookDao;
        }
}
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
            <property name="bookDao" ref="bookDao"/>
    </bean>

    <bean id="bookDao" class="com.itheima.dao.imipl.BookDaoImpl"/>

    注入简单数据类型
    1:声明属性并提供setter方法
    2:配置文件中进行注入配置
     <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
               <property name="databaseName" value="mysql"/>
             <property name="connectionNum" value="10"/>
        </bean>
        <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
        <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
            <property name="bookDao" ref="bookDao"/>
            <property name="userDao" ref="userDao"/>
        </bean>
    
        对于setter注入方式的基本使用就已经介绍完了,

        * 对于引用数据类型使用的是`<property name="" ref=""/>`
        * 对于简单数据类型使用的是`<property name="" value=""/>`

    构造器注入
        步骤1:删除setter方法并提供构造方法
        步骤2:配置文件中进行配置构造方式注入
        <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
            <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
            <constructor-arg name="bookDao" ref="bookDao"/>
            </bean>

        标签<constructor-arg>中

        * name属性对应的值为构造函数中方法形参的参数名,必须要保持一致。
 
        * ref属性指向的是spring的IOC容器中其他bean对象。

    构造器注入多个引用数据类型 和上面相同
    构造器注入多个简单数据类型
        1添加多个简单属性并提供构造方法
        2配置完成多个属性构造器注入
     <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
            <constructor-arg name="databaseName" value="mysql"/>
            <constructor-arg name="connectionNum" value="666"/>
        </bean>
        <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
        <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
            <constructor-arg name="bookDao" ref="bookDao"/>
            <constructor-arg name="userDao" ref="userDao"/>
        </bean>
        这个方法如果构造参数的参数名变化的话可以将name -->type 值是参数的类型
        或替换成index属性  注入参数的相对应的下角标
    
介绍完两种参数的注入方式,具体我们该如何选择呢?

1. 强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
  * 强制依赖指对象在创建的过程中必须要注入指定的参数
2. 可选依赖使用setter注入进行,灵活性强
  * 可选依赖指对象在创建过程中注入的参数可有可无
3. Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
4. 如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
5. 实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
6. **==自己开发的模块推荐使用setter注入==

自动配置  IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配

自动装配方式有哪些?

* ==按类型(常用)==
* 按名称
* 按构造方法
* 不启用自动装配
自动装配只需要修改applicationContext.xml配置文件即可:
(1)将`<property>`标签删除

(2)在`<bean>`标签中添加autowire属性

 <bean class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byName(或者是byType)"/>
==注意事项:== 按照type类型装配的问题:

* 需要注入属性的类中对应属性的setter方法不能省略
* 被注入的对象必须要被Spring的IOC容器管理
* 按照类型在Spring的IOC容器中如果找到多个对象,会报`NoUniqueBeanDefinitionException`

==注意事项:== 按照名称注入中的名称指的是什么?

* bookDao是private修饰的,外部类无法直接方法
* 外部类只能通过属性的set方法进行访问
* 对外部类来说,setBookDao方法名,去掉set后首字母小写是其属性名
  * 为什么是去掉set首字母小写?
  * 这个规则是set方法生成的默认规则,set方法的生成是把属性名首字母大写前面加set形成的方法名
* 所以按照名称注入,其实是和对应的set方法有关,但是如果按照标准起名称,属性名和set对应的名是一致的
* 如果按照名称去找对应的bean对象,找不到则注入Null
 
* 当某一个类型在IOC容器中有多个对象,按照名称注入只找其指定名称对应的bean对象,不会报错
两种方式介绍完后,以后用的更多的是==按照类型==注入。

最后对于依赖注入,需要注意一些其他的配置特征:

1. 自动装配用于引用类型依赖注入,不能对简单类型进行操作
2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

集合注入
注入数组类型数据
<property name="array">
    <array>
        <value>100</value>
        <value>200</value>
        <value>300</value>
    </array>
</property>
注入List类型数据
<property name="list">
    <list>
        <value>itcast</value>
        <value>itheima</value>
        <value>boxuegu</value>
        <value>chuanzhihui</value>
    </list>
</property>
注入Set类型数据
<property name="set">
    <set>
        <value>itcast</value>
        <value>itheima</value>
        <value>boxuegu</value>
        <value>boxuegu</value>
    </set>
</property>
注入Map类型数据
<property name="map">
    <map>
        <entry key="country" value="china"/>
        <entry key="province" value="henan"/>
        <entry key="city" value="kaifeng"/>
    </map>
</property>

注入Properties类型数据
<property name="properties">
    <props>
        <prop key="country">china</prop>
        <prop key="province">henan</prop>
        <prop key="city">kaifeng</prop>
    </props>
</property>
说明:**

* property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写`<array>`、`<list>`、`<set>`、`<map>`、`<props>`标签
* List的底层也是通过数组实现的,所以`<list>`和`<array>`标签是可以混用
* 集合中要添加引用类型,只需要把`<value>`标签改成`<ref>`标签,这种方式用的比较少

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值