美文网首页
IOC与生命周期

IOC与生命周期

作者: 神豪VS勇士赢 | 来源:发表于2018-08-01 20:01 被阅读48次

    IOC解决:耦合问题

    耦合问题(分层开发中)
    持久层类:UserDAO
    服务层类:UserService{
    Public void add(){
    UserDAO dao = new UserDAO();//层与层之间的耦合
    Dao.addUser();
    }
    }

    解耦(创建对象的工作交给Spring容器来管理)
    面向接口编程
    持久层类:UserDAO接口 UserDAOImpl
    服务层类:UserService{
    Public void add(){
    UserDAO dao = // Spring的容器注入具体的实现类
    //接口
    dao.addUser();
    }
    }
    未来只需要在依赖其他层对象的地方,仅需要定义接口,然后后Spring容器注入具体的实现。不再需要在多个service创建具体的依赖对象。创建对象的工作交给Spring

    Inverse of Control,控制反转,将对象的创建权反转给Spring

    本质:IOC就是创建对象

    实践
    1,POM引入包
    2,编写接口与实现类
    3,配置Spring核心配置applicationContext.xml
    spring-framework-4.3.6.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html
    4,测试

    开发流程
    第一步:创建Maven项目,导入依赖
    加入Spring的依赖包

    我们把所有spring相关的的依赖全部放到pom.xml


    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.11.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>4.3.11.RELEASE</version>
    </dependency>
    
    <!-- 为了方便进行单元测试,添加spring-test包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>4.3.11.RELEASE</version>
    </dependency>
    <!--  jms -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jms</artifactId>
      <version>4.3.11.RELEASE</version>
    </dependency>
    
    <!--添加aspectjweaver包 -->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.5</version>
    </dependency>
    
    image.png

    第二步:编写持久层的接口和实现类
    public interface IocDao {
    void addUser();
    }

    实现类如下所示:

    public class IocDaoImpl implements IocDao {
    @Override
    public void addUser() {
    Log.debug("我是IocDaoImpl 中的addUser方法");
    }
    public void init(){
    Log.debug("我是初始化");
    }
    public void destory(){
    Log.debug("我是销毁");
    }
    }

    第三步:创建Spring的核心配置文件 applicationContext.xml

    对于常用的模板可以在idea里面加入模板文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    </beans>

    并在 beans 标签内部加入
    <bean id="iocDaoBean" class="com.zyh.dao.impl.IocDaoImpl" init-method="init" destroy-method="destory">

    </bean>

    测试代码如下所示:

    @Test
    public void testIocDaoImpl(){
        ClassPathXmlApplicationContext classPathXmlApplicationContext=new ClassPathXmlApplicationContext("applicationContext2.xml");
        IocDaoImpl iocDao = (IocDaoImpl) classPathXmlApplicationContext.getBean("iocDaoBean");
        iocDao.addUser();
        IocDaoImpl iocDao1= (IocDaoImpl) classPathXmlApplicationContext.getBean("iocDaoBean");
        IocDaoImpl iocDao2= (IocDaoImpl) classPathXmlApplicationContext.getBean("iocDaoBean");
        Log.error(iocDao1);
        Log.error(iocDao2);
        classPathXmlApplicationContext.close();
    }
    

    观察结果输出如下 :


    image.png

    Spring核心配置
    Bean管理与生命周期:

    <bean id="iocDaoBean" class="com.zyh.dao.impl.IocDaoImpl" init-method="init" destroy-method="destory" scope="singleton“ >

    id="iocDaoBean" //当前对象的别名,唯一标示。
    class="com.zyh.dao.impl.IocDaoImpl" //需要创建的实例化对象的类
    init-method="init" // 自定义初始化方法
    destroy-method="destory" //销毁对象的时候会调用自定义销毁方法
    需要特殊注意的是 scope 作用域 :
    scope:范围(作用域)
    prototype 多例对象(销毁由业务方自己管理)
    singleton 单例对象 默认

    生命周期:

    初始化方法:名称自定义
    public void init(){
    Log.debug("我是初始化");
    }

    销毁方法:名称自定义
    public void destory(){
    Log.debug("我是销毁");
    }

    输出结果如下所示: 会发现 初始化 会最先被调用 ,接下来是相应方法 ,最后在关闭容器的时候 对象销毁,所以会调用 相关的销毁方法。

    image.png

    Scope范围:默认就是单例模式,这种方式也是最好的。

    image.png

    打印的地址是一样的。

    这个时候 我们修改 Scope的属性值 ,把属性值修改成为 prototype


    image.png

    这时候观察结果 ,两次打印的地址值是不同的 ,这也就是说明了 此方法生成的对象别不是单例的。
    并且在自己观察发现 ,当我们关闭容器的时候,发现并没有调用相应的销毁方法 所以这也就说明了一个问题,

    这种方式需要手动调用销毁方法:

    image.png
    当我们添加这两行代码之后 观察打印输出 :
    image.png

    相关文章

      网友评论

          本文标题:IOC与生命周期

          本文链接:https://www.haomeiwen.com/subject/jjwlvftx.html