今日内容介绍
1、spring框架的简介
2、耦合与解耦
3、spring中IOC的使用
一.spring框架简介
1.spring概述
Spring是分层的Java SE/EE应用 full-stack(全栈式)轻量级开源框架,以IoC(Inverse Of Control:控制反转)和AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层Spring MVC和持久层Spring JDBC以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架。
简述:spring是一个全栈式(表现层、业务层、持久层)、轻量级、开源的框架
2.spring的两大核心
IoC:控制反转,由spring容器来管理对象;比如单身时,钱由自己管,结婚了,钱由老婆管
AOP:面向切面编程,开发者只需要关系核心业务功能,其他(如日志,事务,权限等)交给spring统一处理
3.spring的优势
1.方便解耦,简化开发
通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
AOP编程的支持
通过Spring的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
2.声明式事务的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,提高开发效率和质量。
3.方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。
4.方便集成各种优秀框架
Spring可以降低各种框架的使用难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的直接支持。
5.降低JavaEE API的使用难度
Spring对JavaEE API(如JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些API的使用难度大为降低。
6.Java源码是经典学习范例
Spring的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。它的源代码无意是Java技术的最佳实践的范例。
4.spring的体系结构
二.耦合与解耦
1.jdbc代码分析程序的耦合
创建数据库,新建account表
create table account
(
id
int primary key auto_increment,
name
varchar(40),
money
float
)character set utf8
collate utf8_general_ci
;
insert into account
(name
,money
) values('aaa',1000);
insert into account
(name
,money
) values('bbb',1000);
insert into account
(name
,money
) values('ccc',1000);
创建工程导入mysql坐标
<dependencies>
<dependency>
<groupId>mysql
</groupId>
<artifactId>mysql-connector-java
</artifactId>
<version>5.1.6
</version>
</dependency>
</dependencies>
编写jdbc代码
package com.iteima.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* 程序的耦合
* 耦合:程序间的依赖关系
* 包括:
* 类之间的依赖
* 方法间的依赖
* 解耦:
* 降低程序间的依赖关系
* 实际开发中:
* 应该做到:编译期不依赖,运行时才依赖。
* 解耦的思路:
* 第一步:使用反射来创建对象,而避免使用new关键字。
* 第二步:通过读取配置文件来获取要创建的对象全限定类名
*
*/
public class JdbcDemo1 {
public static void main(String[] args) throws Exception{
//1.注册驱动
// DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ee_spring","root","root");
//3.获取操作数据库的预处理对象
PreparedStatement pstm = conn.prepareStatement("select * from account");
//4.执行SQL,得到结果集
ResultSet rs = pstm.executeQuery();
//5.遍历结果集
while(rs.next()){
System.out.println(rs.getString("name"));
}
//6.释放资源
rs.close();
pstm.close();
conn.close();
}
}
2.编译期依赖
编译期:
是指把源码交给编译器编译成计算机可以执行的文件的过程
在Java中也就是把Java代码编成class文件的过程
编译期依赖:
如果jdbc案例中的mysql驱动包没有导入,代码直接报错无法编译
3.程序的耦合和解耦思路分析
1.什么是耦合
程序之间的依赖关系,包括类之间的依赖,方法之间的依赖
2.解耦思路
1.通过反射来创建对象,避免使用new关键字
2.通过读取配置文件加载类的全限定名
程序开发提倡:高内聚,低耦合
高内聚:简单的理解就是相关度比较高的部分尽可能的集中,不要分散
低耦合:耦合度越低,类之间的依赖性越低
4.曾经代码中的问题分析
表现层依赖业务层,业务层依赖持久层
创建业务层接口和实现类
package com
.vp
.service
;
public interface IAccountService {
void saveAccount();
}
package com
.vp
.service
.impl
;
import com
.vp
.dao
.IAccountDao
;
import com
.vp
.dao
.impl
.AccountDaoImpl
;
import com
.vp
.factory
.BeanFactory
;
import com
.vp
.service
.IAccountService
;
public class AccountServiceImpl implements IAccountService {
private IAccountDao accountDao
= new AccountDaoImpl();
public void saveAccount(){
accountDao
.saveAccount();
}
}
创建持久层接口与实现类
package com
.vp
.dao
;
public interface IAccountDao {
void saveAccount();
}
package com
.vp
.dao
.impl
;
import com
.vp
.dao
.IAccountDao
;
public class AccountDaoImpl implements IAccountDao {
public void saveAccount(){
System
.out
.println("保存了账户");
}
}
模拟表现层
package com
.vp
.ui
;
import com
.vp
.service
.IAccountService
;
import com
.vp
.service
.impl
.AccountServiceImpl
;
public class Client {
public static void main(String
[] args
) {
IAccountService as
= new AccountServiceImpl();
as
.saveAccount();
}
}
5.编写工厂类和配置文件
创建工厂类
package com
.vp
.factory
;
public class BeanFactory {
}
配置文件bean.properties
accountService=com.vp.service.impl.AccountServiceImpl
accountDao=com.vp.dao.impl.AccountDaoImpl
6.工厂模式解耦
在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的方法通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时候,直接拿过来用就好了。 那么,这个读取配置文件,创建和获取三层对象的类就是工厂。
编写工厂类
package com
.vp
.factory
;
import java
.io
.InputStream
;
import java
.util
.Properties
;
public class BeanFactory {
private static Properties props
;
static {
try {
props
= new Properties();
InputStream in
= BeanFactory
.class.getClassLoader().getResourceAsStream("bean.properties");
props
.load(in
);
}catch(Exception e
){
throw new ExceptionInInitializerError("初始化properties失败!");
}
}
public static Object
getBean(String beanName
){
Object bean
= null
;
try {
String beanPath
= props
.getProperty(beanName
);
bean
= Class
.forName(beanPath
).newInstance();
}catch (Exception e
){
e
.printStackTrace();
}
return bean
;
}
}
修改Client依赖
package com
.vp
.ui
;
import com
.vp
.factory
.BeanFactory
;
import com
.vp
.service
.IAccountService
;
public class BeanFactoryClient {
public static void main(String
[] args
) {
IAccountService as
= (IAccountService
) BeanFactory
.getBean("accountService");
as
.saveAccount();
}
}
修改service依赖
package com
.vp
.service
.impl
;
import com
.vp
.dao
.IAccountDao
;
import com
.vp
.dao
.impl
.AccountDaoImpl
;
import com
.vp
.factory
.BeanFactory
;
import com
.vp
.service
.IAccountService
;
public class AccountServiceImpl implements IAccountService {
private IAccountDao accountDao
= (IAccountDao
)BeanFactory
.getBean("accountDao");
public void saveAccount(){
accountDao
.saveAccount();
}
}