spring框架 - DI

版权声明:文章由作者本人原创,仅限学习参考。转载请注明出处! https://blog.csdn.net/qq_40414738/article/details/83552219

Spring框架 - DI


  •  一、依赖注入(DI)的四种方式

        1. set注入(常用)

  必须存在setter方法, 声明变量

  通过<property>标签注入, 可以注入对象也可以注入基本数据类型;  

<!-- set注入 -->
<bean id="userDao" class="com.lwx.dao.UserDao"></bean>
<bean id="userService" class="com.lwx.service.UserService">
    <property name="userDao" ref="userDao"></property>
    <property name="name" value="刘文旭"></property>
    <property name="age" value="18"></property>
</bean>

        2. 构造器注入

通过<constructor-arg>标签注入, 必须存在有参构造!

可以注入对象和基本数据类型!

同时可以通过name或者index指定注入顺序

    <!-- 构造器注入 -->
    <!-- index可以写成name属性,两种不同实现方式 -->
    <bean id="userService2" class="com.lwx.service.UserService2">
        <constructor-arg index="0" ref="userDao"></constructor-arg>
        <constructor-arg index="1" value="lwx" />
        <constructor-arg index="2" value="20"/>
    </bean>

        3. 静态工厂注入

    <!-- 静态工厂注入 -->
    <bean id="staticDao" class="com.lwx.factory.StaticFactory" factory-method="creatStaticDao"></bean>
    <bean id="staticService" class="com.lwx.service.StaticService">
        <constructor-arg index="0" ref="staticDao"/>
        <constructor-arg index="1" value="zhangsan"/>
        <constructor-arg index="2" value="88"/>
    </bean>

        4. 实例工厂注入

只是对注入bean的实例产生方式不同的定义!

 

    <!-- 实例工厂注入 -->
    <bean id="instanceFactory" class="com.lwx.factory.InstanceFactory"></bean>
    <bean id="instanceDao" factory-bean="instanceFactory" factory-method="creatInstanceDao"></bean>
    <bean id="instanceService" class="com.lwx.service.InstanceService">
        <constructor-arg ref="instanceDao"/>
    </bean>

        5. p标签和c标签

简化<property> 和 <constructor-arg>

       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
    <!-- p标签-->
    <bean class="com.lwx.dao.UserDao" id="userDao"></bean>
    <bean class="com.lwx.service.UserService" id="userService"
          p:userDao-ref="userDao"
          p:name="LLL"
          p:age="99"
    />

    <!-- c标签 -->
    <bean class="com.lwx.dao.UserDao" id="userDao2"></bean>
    <bean class="com.lwx.service.UserService2" id="userService2"
          c:_0-ref="userDao2"
          c:_1="kkk"
          c:_2="555">

    </bean>

        6. 集合注入

List   Map  Set   Properties

都是set方式下的

    <!-- list集合注入 -->
    <bean id="paramsService" class="com.lwx.service.ParamsService">
        <property name="list">
            <list>
                <value>河南烩面</value>
                <value>南方臊子面</value>
                <value>油泼面</value>
                <value>方便面</value>
            </list>
        </property>


        <property name="set">
            <set>
                <value>快乐小馒头</value>
                <value>北方馒头</value>
                <value>天津麻花</value>
                <value>新疆大饼</value>
            </set>
        </property>



        <property name="map">
            <map>
                <entry>
                    <key><value>1</value></key>
                    <value>11111111</value>
                </entry>
                <entry>
                    <key><value>2</value></key>
                    <value>22222222</value>
                </entry>
                <entry>
                    <key><value>3</value></key>
                    <value>3333333</value>
                </entry>
            </map>
        </property>



        <property name="prop">
            <props>
                <prop key="北京">北京尚学堂</prop>
                <prop key="上海">上海尚学堂</prop>
                <prop key="西安">西安尚学堂</prop>
            </props>
        </property>


  • 二、注解注入

    反射技术实现

        1.@Autowired
            spring框架提供的
                默认通过类型查找
                可以通过名称查找,配合@Qualifier使用


        2.@Resources
            JDK提供的
                默认通过名字查找,然后通过类型
                如果指定名称,找不到就报错

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'userDao1' available


        过程
            1.加入spring-aop jar 包spring-aop-4.3.2.RELEASE.jar
            2.Xml 配置: 加入context 命名空间和xsd 地址
            3. 添加<context:annotation-config/> 配置,否则

 


  • 三、bean自动扫描

    <context:component-scan base-package="com.lwx"/>
    @Repository
        标记Dao层
    @Services
        标记Service层
    @Controller
        标记Controller层
    @Component
        开发中不明确属于那一层,就是用component, 所以可以都是用

<context:component-scan base-package="com.shsxt"/>

  • 四、模拟用户登陆

流程:

传入参数(用户名和密码) -发送请求-> 接收参数 -> 检验参数 -> 数据库查询 -> 返回对象 -> 比对用户名密码是否一致 -> 返回结果


  • 五、bean作用域

    从spring 容器中拿到的对象均是单例的
    1. singleton 单例  lazy-init 如果为true 就是懒加载,默认为false
    2. prototype 原型(非单例)
        scope = “prototype”

    单例的好处:
            1)提前发现潜在的配置问题
            2)Bean 对象存在于缓存中,使用时不用再去实例化bean,加快程序运行效率


  • 六、bean的生命周期

          定义       
             通过配置文档的方式来定义Bean
          初始化
              I.在配置文档中通过指定init-method 属性来完成。
              II.实现org.springframework.beans.factory.InitializingBean 接口
          使用
              I.使用BeanFactory
              II.使用ApplicationContext
           销毁
              AbstractApplicationContext 对象
              调用其close 方法

信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@64b8f8f4: startup date [Tue Oct 30 20:59:18 CST 2018]; root of context hierarchy


猜你喜欢

转载自blog.csdn.net/qq_40414738/article/details/83552219