5.25spring-ioc控制反转

    xiaoxiao2023-11-04  161

    今日内容介绍

    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; /** * 一个创建Bean对象的工厂 * * Bean:在计算机英语中,有可重用组件的含义。 * JavaBean:用java语言编写的可重用组件。 * javabean > 实体类 * * 它就是创建我们的service和dao对象的。 * * 第一个:需要一个配置文件来配置我们的service和dao * 配置的内容:唯一标识=全限定类名(key=value) * 第二个:通过读取配置文件中配置的内容,反射创建对象 * * 我的配置文件可以是xml也可以是properties */ 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; /** * 一个创建Bean对象的工厂 * * Bean:在计算机英语中,有可重用组件的含义。 * JavaBean:用java语言编写的可重用组件。 * javabean > 实体类 * * 它就是创建我们的service和dao对象的。 * * 第一个:需要一个配置文件来配置我们的service和dao * 配置的内容:唯一标识=全限定类名(key=value) * 第二个:通过读取配置文件中配置的内容,反射创建对象 * * 我的配置文件可以是xml也可以是properties */ public class BeanFactory { //定义一个Properties对象 private static Properties props; //使用静态代码块为Properties对象赋值 static { try { //实例化对象 props = new Properties(); //获取properties文件的流对象 InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties"); props.load(in); }catch(Exception e){ throw new ExceptionInInitializerError("初始化properties失败!"); } } /** * 根据Bean的名称获取bean对象 * @param beanName * @return */ public static Object getBean(String beanName){ Object bean = null; try { String beanPath = props.getProperty(beanName); //System.out.println(beanPath); 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(); } }
    最新回复(0)