美文网首页
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

相关文章

  • Bean 的后置处理器

    IOC 容器中 Bean 的生命周期方法: Spring IOC 容器可以管理Bean 的生命周期Spring 允...

  • Spring AOP实现原理分析

    Spring的核心是IOC与AOP,IOC主要是依赖关系的管理,依赖查询,依赖注入,在之前bean的生命周期文章中...

  • Spring:Ioc容器中Bean生命周期

    容器的实现是通过Ioc管理Bean的生命周期来实现的。Spring Ioc容器在对Bean的生命周期进行管理时提供...

  • IOC与生命周期

    IOC解决:耦合问题 耦合问题(分层开发中)持久层类:UserDAO服务层类:UserService{Public...

  • Spring框架one

    一、IoC模式 系统中通过引入实现了IoC模式的IoC容器,即可由IoC容器来管理对象的生命周期、依赖关系等,从而...

  • Spring——Bean生命周期

    概念:Bean生命周期归IOC容器管理,IOC容器有两层,Applicationcontext和Beanfacto...

  • 07spring源码分析-从Bean的生命周期分析IOC创建对象

    spring中IOC创建对象过程以及Bean的生命周期 Bean的生命周期 Bean生命周期通过getBean()...

  • IOC容器中Bean的生命周期

    IOC容器中Bean的生命周期 1.SpringIOC管理Bean的生命周期 Spring运行Bean在生命周期的...

  • Spring 创建 Bean 后置处理器

    IOC 容器中 Bean 的生命周期方法 SpringIOC 容器可以管理 Bean 的生命周期,Spring 允...

  • Spring-IOC-2

    IOC基础 Inversion of controller 控制反转, 拥有对象创建的控制权与对象生命周期的管理权...

网友评论

      本文标题:IOC与生命周期

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