Spring的IOC介绍

1. IOC 控制反转 就是将对象创建交给spring,实体类一般不交给spring工厂管理

将原本new的对象转移到配置文件 通过<bean>标签
<bean id="userDAO" class="com.codegzy.dao.UserDAOImpl"></bean>

2. DI 依赖注入

    三种注入方式:
      1. set方式注入(推荐)
      2. 构造注入
      3. 自动注入

2.1 set方式注入

    八种基本类型+String类型 +日期类型的注入
    <property name="name" value="zhagnsan"/>
    <property name="age" value="21"/>
    <property name="id" value="100063"/>
    <property name="birthday" value="2012/12/12"/> 不支持日期2012.12.12这种格式 用/隔开
    <property name="price" value="23.23"/>

    数组类型的注入
      <property name="qqs">
         <array>
             <value>123</value>
             <value>456</value>
             <value>789</value>
          </array>
      </property>

    引用类型的注入
    <property name="userDAO" ref="userDAO"/>

    集合类型注入
      <property name="lists">
        <list>
          <value>aaa</value>
          <value>bbb</value>
          <value>ccc</value>
        </list>
      </property>

      <property name="maps">
        <map>
          <entry key="aa" value="xiaohei"/>
          <entry key="bb" value="xiaoming"/>
          <entry key="cc" value="xiaosan"/>
        </map>
      </property>

      <property name="props">
        <props>
          <prop key="url">jdbc:mysql://localhost:3306/test</prop>
          <prop key="driver">com.mysql.jdbc.Driver</prop>
          <prop key="username">root</prop>
          <prop key="password">123456</prop>
        </props>
      </property>

小总结:引用类型使用ref属性注入,基本类型使用value属性注入

2.2 构造注入

	<constructor-arg index="0" name="id" value="1"/>
	<constructor-arg index="1" name="name" value="xiaohei"/>
	<constructor-arg index="2" name="age" value="12"/>
	<constructor-arg index="3" name="qqs">
          <array>
            <value>xxx</value>
            <value>222</value>
            <value>333</value>
          </array>
	</constructor-arg>
      了解即可

2.3 自动注入

autowire=byName
根据注入的属性名与配置文件中bean的id匹配,一致则注入,不一致报错

autowire=byType
根据注入的属性类型,与配置文件中的类型匹配,类型一致注入(在多个实现类时,会产生歧义)

注意: 无论使用以上那种方式注入都需要为属性提供set方法

3. bean的创建模式

  1.singleton:单例 默认
  2.prototype:多例
  <bean id="" class="xxxx.UserController" scope="prototype|singleton">
  小总结:在项目开发中service,dao组件单例,控制层必须为:多例

4. bean的生产原理

    反射+构造方法
    Class.forName("xxx").newInstance();

5. bean的生命周期

    何时创建?
      随着工厂启动, 所有单例bean随之创建 非单例的bean,每次使用时创建
    何时销毁?
      工厂关闭,所有bean随之销毁 (  注意: spring对多例bean管理松散,不会负责多例bean的销毁)

6. 创建复杂对象(类中没有构造方法,或者构造方法不能调用如接口类型或抽象类实例)

//1.类 implements FactoryBean<创建的类型>

    public class ConnectionFactoryBean implements FactoryBean<Connection> {
    @Override
    public Connection getObject() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");
    }

    @Override
    public Class<?> getObjectType() {
        return Connection.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

// 2.配置工厂管理
	    <bean id="connectionFactoryBean" class="com.codegzy.factorybean.ConnectionFactoryBean"></bean>

// 3.获取复杂对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        Connection conn = (Connection) context.getBean("connectionFactoryBean");
        System.out.println(conn);
posted @ 2021-09-02 13:34  code-G  阅读(48)  评论(0编辑  收藏  举报