IOC与生命周期
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.pngScope范围:默认就是单例模式,这种方式也是最好的。
image.png打印的地址是一样的。
这个时候 我们修改 Scope的属性值 ,把属性值修改成为 prototype
image.png
这时候观察结果 ,两次打印的地址值是不同的 ,这也就是说明了 此方法生成的对象别不是单例的。
并且在自己观察发现 ,当我们关闭容器的时候,发现并没有调用相应的销毁方法 所以这也就说明了一个问题,
这种方式需要手动调用销毁方法:
当我们添加这两行代码之后 观察打印输出 :
image.png