Spring的Bean标签配置IOC和依赖注入详解

spring配置文件详解

spring的依赖注入和控制反转梳理总结,仅供参考

/**
     * Bean的依赖注入:
     * ① 创建 UserService,UserService 内部在调用 UserDao的save() 方法
     * ② 将 UserServiceImpl 的创建权交给 Spring
     * ③ 从 Spring 容器中获得 UserService 进行操作
     *
     * Bean的依赖注入分析:
     * ① 目前UserService实例和UserDao实例都存在与Spring容器中,
     *   当前的做法是在容器外部获得UserService实例和UserDao实例,然后在程序中进行结合。
     * ② getBean(name:"userService")获得UserService实例,
     *   发现UserSrvice实例内部需要UserDao实例的save()方法,
     *   其内部已经存在UserDao实例了,直接调用UserDao的save()方法即可
     * ③ 所以在UserService内部获得UserDao实例getBean(name:"userDao"),
     *   相当于是在Spring容器外将Dao组装到Service内部完成的操作
     *
     * Bean的依赖注入概念:
     *   依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现。
     *   在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。
     *   IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。
     *   那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。
     *   简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取
     *
     * Bean的依赖注入方式:
     * 怎么将UserDao怎样注入到UserService内部呢?
     *  构造方法
     *  set方法
     *
     * Bean的依赖注入的三种数据类型:
     *  普通数据类型
     *  引用数据类型
     *  集合数据类型
     * 除了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入。下面在dao中演示普通数据类型和集合数据类型的注入
     * @param args
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       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标签基本配置  用于配置对象交由Spring 来创建。默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。
            基本属性:
                id:Bean实例在Spring容器中的唯一标识,不允许重复
                class:Bean的全限定名称
                scope:Bean标签范围配置,指对象的作用范围,取值如下:
                    singleton 默认值,单例的
                        当scope的取值为singleton时
                        Bean的实例化个数:1个
                        Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例
                        Bean的生命周期:
                             对象创建:当应用加载,创建容器时,对象就被创建了
                             对象运行:只要容器在,对象一直活着
                             对象销毁:当应用卸载,销毁容器时,对象就被销毁了
                    prototype 多例的
                        当scope的取值为prototype时
                        Bean的实例化个数:多个
                        Bean的实例化时机:当调用getBean()方法时实例化Bean
                             对象创建:当使用对象时,创建新的对象实例
                             对象运行:只要对象在使用中,就一直活着
                             对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了
                    request WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中
                    session WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中
                    global session WEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当于 session
                init-method:指定类中的初始化方法名称
                destroy-method:指定类中销毁方法名称
                factory-method:指定类中工厂方法名称
                    property
                        name:属性名称
                        value:注入的普通属性值
                        ref:注入的对象引用值
                    constructor-arg
            Bean实例化三种方式:
                 无参构造方法实例化(最常用)
                 工厂静态方法实例化
                 工厂实例方法实例化
    -->
    <!--在Spring配置文件中配置UserDaoImpl-->
    <!--1.无参构造方法实例化 它会根据默认无参构造方法来创建类对象,如果bean中没有默认无参构造函数,将会创建失败-->
    <!--<bean id="userDao" class="com.example.ioc.dao.impl.UserDaoImpl" init-method="init" destroy-method="destory"/>-->
    <!--2.工厂静态方法实例化,工厂的静态方法返回Bean实例-->
    <!--<bean id="userDao" class="com.example.ioc.factory.StaticFactory" factory-method="getUserDao"/>-->
    <!--3.工厂实例方法实例化,工厂的非静态方法返回Bean实例
            spring创建factory工厂对象
            从factory工厂对象中的getUserDao方法获取指定的userDao返回的UserDaoImpl对象-->
    <!--<bean id="factory" class="com.example.ioc.factory.DynamicFactory"></bean>
    <bean id="userDao" factory-bean="factory" factory-method="getUserDao"/>-->

    <!--Bean依赖注入操作:
        Bean的依赖注入的三种数据类型:
         普通数据类型
         引用数据类型
            ① set方法注入
                方式1:配置Spring容器调用set方法进行注入
                    property属性标签
                        name:属性名称
                        value:注入的普通属性值
                        ref:注入的对象引用值
                            list
                            map
                            props
                方式2:p命名空间注入 引入p命名空间
            ② 构造方法注入
         集合数据类型
        -->
    <bean id="userDao" class="com.example.ioc.dao.impl.UserDaoImpl">
        <!--普通数据类型注入-->
        <property name="username" value="zhangsan"/>
        <property name="age" value="20"/>
        <!--集合数据类型注入-->
        <property name="strList">
            <list>
                <value>aaa</value>
                <value>bbb</value>
                <value>ccc</value>
            </list>
        </property>
        <property name="userMap">
            <map>
                <entry key="u1" value-ref="user1"></entry>
                <entry key="u2" value-ref="user2"></entry>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="p1">ppp1</prop>
                <prop key="p2">ppp2</prop>
                <prop key="p3">ppp3</prop>
            </props>
        </property>
    </bean>

    <bean id="user1" class="com.example.ioc.domain.User">
        <property name="name" value="tom"/>
        <property name="addr" value="beijing"/>
    </bean>
    <bean id="user2" class="com.example.ioc.domain.User">
        <property name="name" value="lucy"/>
        <property name="addr" value="tianjin"/>
    </bean>
    <!--② 将 UserServiceImpl 的创建权交给 Spring-->
    <!--<bean id="userService" class="com.example.ioc.service.impl.UserServiceImpl"/>-->
    <!--set方法注入
            配置Spring容器调用set方法进行注入
            把userDao通过userService中的setUserDao方法注入给userService
            name指的的是setUserDao中UserDao,只是要小写
            ref引用:指的是容器中的id-->
    <!--<bean id="userService" class="com.example.ioc.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"/>
    </bean>-->
    <!--set方法注入 方式2 p命名空间注入 引入p命名空间-->
    <!--<bean id="userService" class="com.example.ioc.service.impl.UserServiceImpl" p:userDao-ref="userDao"/>-->
    <!--构造方法注入-->
    <bean id="userService" class="com.example.ioc.service.impl.UserServiceImpl">
        <constructor-arg name="userDao" ref="userDao"></constructor-arg>
    </bean>
    

	<!--Spring容器加载外部jdbc.properties文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!--数据源配置-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
	
	<!--import标签:导入其他的Spring的分文件 分模块开发
        实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,
        所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载-->
    <import resource="applicationContext-ioc.xml"/>
    <import resource="applicationContext-jdbc.xml"/>


</beans>
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值