spring 之(IOC)入门(xml配置文件)(01)

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/yjy91913/article/details/76223276

IOC

概述:spring的核心之一
控制反转:就是将bean的创建权交给spring容器管理.解决高耦合性问题
底层:配置文件+反射+工厂模式

入门案例:

步骤:

1.下载spring

去官网下就可以了 https://spring.io/

2.新建一个项目

导入jar:核心jar包
spring解压目录下:core,beans,context,expression
spring日志(spring的依赖包):
org.apache.log4j
org.apache.commons.logging

3.编写配置文件

        名称:自定义 建议:applicationContext.xml 
        位置:自定义 建议:放在src下
        导入约束:去文件中spring-framework-4.2.4.RELEASE/docs/spring-framework-reference/html/xsd-configuration.html中找
<beans xmlns="http://www.springframework.org/schema/beans"
                    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">

</beans>

4.编写接口和类 UserDao和UserDaoImpl

public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("userDao中的save方法执行了!!");
    }

}

5.在配置文件配置bean

<!-- 
                配置bean:
                    id:就是给bean起个名字,项目中唯一
                    class:具体类的全限定名
             -->
            <bean id="userDao" class="com.xx.a_hello.UserDaoImpl"></bean>

6.测试代码

    //获取工厂类
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

    //获取bean
    UserDao userDao = (UserDao) context.getBean("userDao");

api:bean工厂类

BeanFactory:接口

★ApplicationContext:接口 是BeanFactory的子接口

主要区别:

子接口具有更多的方法
bean的初始化时机不同.
BeanFactory中的bean是在调用getBean方法的时候完成初始化
ApplicationContext中的bean一般是在工厂类初始化的时候完成初始化(多例的不是)

ApplicationContext接口的实现类

ClassPathXmlApplicationContext:从类路径下加载配置文件
FileSystemXmlApplicationContext:从磁盘路径下加载配置文件
spring容器认为是一个map:key是bean的id value是:bean对象

配置文件提示

配置文件中的bean标签配置:

bean的属性
id:就是给bean起个名字,项目中唯一,不能出现特殊符号
class:具体类的全限定名
scope:声明bean的作用范围
常用值:
singleton:单例 默认值
prototype:多例 (action是多实例的)

了解的属性:

init-method:spring容器初始化bean的时候要调用的方法
destroy-method:spring容器销毁bean的时候要调用的方法(只能bean是单例的时候才可以调用)

bean的实例化方式

方式1:无参构造器方式

<bean id="" class=""/>

(了解)方式2:静态工厂实例化

  需要创建一个产生指定bean工厂类
  在类中提供一个静态获取bean的方法
  在配置文件中配置工厂和方法即可

<bean id="" class="工厂的全限定名" factory-method="静态方法的名称">
<!-- 静态工厂实例化 -->
    <bean id="user2" class="com.itheima.c_instance.User2Factory" factory-method="createUser2"></bean>

(了解)方式3:实例工厂实例化

  需要创建一个产生指定bean工厂类
  在类中提供一个方法获取bean的方法
  先配置工厂类(先实例化工厂)
  在配置需要的bean对象(再实例化bean对象)

<!-- 配置工厂类 -->
            <bean id="user3factory" class="com.itheima.c_instance.User3Factory"></bean>
            <!-- 配置bean对象 -->
            <bean id="user3" factory-bean="user3factory" factory-method="createUser3"></bean>

DI:依赖注入

ioc的一个核心,在spring创建bean对象的时候,将bean的属性给设置进去.
依赖注入方式:★

方式1:构造器注入(理解)

通过bean标签的construct-arg子标签注入
 constructor-arg:
   name属性:构造器参数的名称
   value属性:设置参数值(类型为基本类型和String类型)
   ref属性:设置参数值(bean类型)
例如:

<!-- 注入方式1:构造器注入  
            constructor-arg:
                name属性:构造器参数的名称
                value属性:设置参数值(类型为基本类型和String类型)
                ref属性:设置参数值(bean类型)
    -->
    <bean id="bus1" class="com.itheima.e_di.Bus1">
        <constructor-arg name="brand" value="byd"/>
        <constructor-arg name="price" value="5000000"/>
    </bean>

方式2:属性注入★★

前提:bean中需要有属性(set和get方法)
通过bean标签的property标签:
  name属性:构造器参数的名称
  value属性:设置参数值(类型为基本类型和String类型)
  ref属性:设置参数值(bean类型)子标签注入

<!-- 方式2:属性注入  
            property标签:
                name属性:构造器参数的名称
                value属性:设置参数值(类型为基本类型和String类型)
                ref属性:设置参数值(bean类型) bean的id或者name属性值
        -->
    <bean id="bus2" class="com.xx.e_di.Bus2">
        <property name="brand" value="金龙"/>
        <property name="price" value="700000"></property>
    </bean>
    <bean id="person" class="com.xx.e_di.Person">
        <property name="name" value="小青"/>
        <property name="bus" ref="bus2"></property>
    </bean>

方式3:p名称空间注入(有可能见到,底层也是属性注入)

在约束文件导入p名称空间
xmlns:p=”http://www.springframework.org/schema/p”
 注入属性的时候直接通过bean标签就可以完成

<bean id="" class="" p:属性名="值" p:属性名2-ref="值"/>
 <!-- 方式3:p名称空间方式注入 -->
     <bean id="person" class="com.itheima.e_di.Person" p:name="小花" p:bus-ref="bus2"></bean>

方式4:复杂类型注入

        list和数组 使用list标签
            <list>
                <value>ss</value>
            </list>
        map 使用map标签
            <map>
                <entry key="" value=""/>
            </map>

        properties 使用props标签
            <props>
                <prop key="">...</prop>
            </props>

例如:

<bean id="collectionBean" class="com.itheima.e_di.CollectionBean">
        <!-- 注入数组 -->
        <property name="ss">
            <list>
                <value>aa</value>
                <value>bb</value>
                <value>cc</value>
            </list>
        </property>

        <!-- 注入list -->
        <property name="ll">
            <list>
                <value>11</value>
                <value>22</value>
                <value>33</value>
            </list>
        </property>

        <!-- 注入map -->
        <property name="mm">
            <map>
                <!--
                     key:键名 基本类型或string 
                     value:值  基本类型或string
                     key-ref:键名 bean类型
                     value-ref:值 bean类型
                -->
                <entry key="aa" value="11"></entry>
                <entry key="bb" value="22"></entry>
                <entry key="cc" value-ref="bus2"></entry>
            </map>
        </property>

        <!-- 注入properties -->
        <property name="pp">
            <props>
                <prop key="username">root</prop>
                <prop key="password">1234</prop>
            </props>
        </property>
    </bean>

导入其他的spring配置文件★★

<import resource="applicationContext2.xml"/>

猜你喜欢

转载自blog.csdn.net/yjy91913/article/details/76223276