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

来源:互联网 发布:化妆软件哪个好 编辑:程序博客网 时间:2024/05/22 00:34

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"/>