天天看點

Spring的使用(一):IOC與DI

IOC

    IOC(Inversion of Control) 控制反轉,将代碼的控制權轉移,從代碼本身轉移到spring容器中,由spring容器進行控制。

實作步驟:

  1. 擷取spring容器
  2. 在容器中注冊響應的bean
  3. 擷取容器中已經注冊的bean

DI

    IO(Dependency Injection)依賴注入,當容器中的某一個bean對象需要外部另外一個bean對象的時候,我們不需要執行個體化這個對象,隻要依賴容器注入就可以。

注入方式:

  1. 構造器注入
    <!-- 注冊userService -->
    <bean id="userService" class="com.service.UserServiceImpl">
        <constructor-arg ref="userDaoJdbc"></constructor-arg>
    </bean>
    <!-- 注冊jdbc實作的dao -->
    <bean id="userDao" class="com.dao.UserDaoImpl"></bean>
               
    public class UserService implements IUserService {
        private IUserDao userDao;
    
        public UserService(IUserDao userDao) {
            this.userDao = userDao;
        }
    
    }
               
  2. set屬性注入
    <bean id="userService" class="com.service.UserServiceImpl">
        <property name="dao" ref="userDao"></property>
    </bean>
    			
    <bean id="userDao" class="com.dao.UserDaoImpl"></bean>
               
    public class UserServiceImpl implements  IUserService{
        private IUserDao dao;
    
        public void setDao(IUserDao dao) {
            this.dao = dao;
        }
    }
               
    使用命名空間
    <?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">
    <!--使用者service-->
    <bean id="userService" class="com.service.UserServiceImpl" p:dao-ref="userDao"></bean>
    
    <!--User DAO-->
    <bean id="userDao" class="com.dao.UserDaoImpl" p:qr-ref="query"></bean>
    
    <!--queryRunner-->
    <bean id="query" class="org.apache.commons.dbutils.QueryRunner"></bean>
               
  3. 接口注入(使用FactoryBean接口)

Spring工廠

  1. bean的建立不是由代碼開發者去建立,轉由spring容器去建立
  2. 建立好了之後用鍵值對的方式存在容器中 BeanFactory
  3. 拿到的BeanConfig getBean方法通過beanConfig中的className反射生成bean對象

擷取Spring容器

  1. 通過源代碼目錄擷取spring容器 ClassPathXmlApplicationContext 參數是…支援多配置
  2. 通過實際路徑擷取spring容器 FileSystemXmlApplicationContext 參數是…支援多配置
  3. springmvc采用監聽器自動建立存放在ServletContext中

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <!--web容器啟動後 監聽到 立刻調用這個監聽器 -->
        <!--
            1.擷取spring容器
            2.将容器存儲到servletContext中
        -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <!--
            預設監聽的位置是在WEB-INF/applicationContext.xml
            監聽器會監聽 上下文中是否有 contextConfigLocation
        -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>
    </web-app>
               
    //從web容器中擷取spring容器
    //1.通過servletContext中擷取容器
    //ApplicationContext ctx = (ApplicationContext) this.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
    //2.使用工具類擷取spring容器.
    WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
               

Spring裝配bean

  1. 無參構造器裝配(構造器與set屬性注入常使用)

    a.存在這個bean,并且這個bean一定要有無參的構造函數

    b.在spring容器中配置這個bean,配置ID和class屬性即可

  2. 靜态工廠方法裝配
    <bean id="userService" class="com.service.UserServiceImpl">
    	<property name="dao" ref="staticUserDao"></property>
    </bean>
    					
    <bean id="staticUserDao" class="com.entity.DaoFactory" factory-method="getStaticUserDaoImpl"></bean>
               
    public class DaoFactory {  
        //靜态工廠  
        public static final IUserDao getStaticUserDaoImpl(){  
            return new StaticUserDaoImpl();  
        }  
    }  
               
  3. 動态工廠方法注入
    <bean id="userService" class="com.service.UserServiceImpl">
    	<property name="dao" ref="userDao"></property>
    </bean>
    			
    <bean id="userDao" class="com.dao.UserDao" factory-bean="daoFactory" factory-method="getUserDaoImpl"></bean>
    <bean id="daoFactory" class="com.entity.DaoFactory"></bean>
               
    public class DaoFactory {  
        //執行個體工廠  
        public IUserDao getUserDaoImpl(){  
            return new UserDaoImpl();  
        }  
    }  
               
  4. FactoryBean方式(使用接口注入的裝配方式)
    <bean id="testBeanFactory" class="com.igeek.entity.TestBeanFactory"></bean>
               
    public class TestBeanFactory implements FactoryBean<TestBean> {
    
      @Override
      public TestBean getObject() throws Exception {
          return new TestBean();
      }
    
      @Override
      public Class<?> getObjectType() {
          return null;
      }
    
      @Override
      public boolean isSingleton() {
          return false;
      }
    }
               

bean作用域

在配置檔案中設定bean的作用域 scope=“singleton”
  • singleton 單例模式 隻有一個執行個體每次擷取都是同一個(預設)
  • prototype 多例模式 每次擷取都建立一個新的執行個體

bean生命周期

  • init-method 指定bean的初始化方法
  • destroy-method 指定bean的銷毀方法
執行銷毀
  1. 隻有單例的才能手動銷毀
  2. 主動銷毀容器才能執行銷毀方法

特殊類型注入

  1. list set map properties spring自帶4個标簽支援 list set map props

    list set 子标簽是value,map子标簽entry(key value),props子标簽是prop(key,值寫在标簽中)

  2. 注入其他類的屬性 spEl表達式 #{}

多配置檔案開發

  1. 擷取容器的時候參數采用數組的方式,有幾個配置檔案,就傳入幾個參數
  2. 在一個總配置檔案中引入其他的配置檔案
上一篇: IOC和DI解析
下一篇: IoC和DI

繼續閱讀