IOC与生命周期

2018-08-01  本文已影响48人  神豪VS勇士赢

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
上一篇下一篇

猜你喜欢

热点阅读