目录

一:引言

1.1企业级系统:

1.2那么如何去应对企业级应用开发

1.3 Spring的绿草丛

二:Spring的绿草丛

2.1 Spring 介绍

2.2   Spring两大核心技术

a.控制反转(IoC(Inversion of Control) / 依赖注入(DI))

b.面向切面编程(AoP)

2.3 Spring 优点

2.4 Spring工程构建

2.4.1Maven Spring依赖

2.4.2 Spring核心配置文件编写

2.4.3 完成控制反转及依赖注入的实例

2.4.4 Spring中的IoC产生的对象是否是单例模式 (是)

2.4.5延迟实例化

2.5 Bean的三种实例化方式

2.5.1构造方法方式【重点】

2.5.2静态工厂方式(了解)

2.5.3实例工厂方式(了解)

2.6 Bean的生命周期

2.7 Bean的销毁时机

三:应用XML编程实现AOP

3.1AOP的代理实现形式(一共有三种)

3.1.1 通过JDK动态代理实现

优点

术语概念

3.1.2通过CGLib动态代理实现

3.1.3 AOP术语

3.2 通过编程形式基于XML实现AOP

3.2 AOP使用场景



一:引言

1.1企业级系统:

  • 大规模:用户数量多,数据规模大,功能众多
  • 性能和安全要求高。
  • 业务复杂
  • 灵活多变(指的是用户的需求)

1.2那么如何去应对企业级应用开发

1.3 Spring的绿草丛

Spring : 轻量级框架(相比于EJB),JavaEE的春天,当前主流框架。

目标:使现有技术更加易用,实现代码最佳实践。

内容:IoC容器 ,AoP实现(俩大核心内容)

数据访问支持(简化JDBC/ORM框架 ,声明式事务)

web集成(核心框架SpringMVC)

二:Spring的绿草丛

2.1 Spring 介绍

Spring是一个企业级应用框架。其中包含了大量的各种应用组件。Spring框架为现代基于Java的企业应用程序提供了一个全面的编程和配置模型,能够在任何类型的部署平台上进行部署。其核心是IoC及AOP。 设计理念是面向Bean编程

2.2   Spring两大核心技术

a.控制反转(IoC(Inversion of Control) / 依赖注入(DI))

控制反转(Inversion of Control),将原来有我们来完成的实例化过程,交给容器来完成。将组件对象的控制权从代码本身转移到外部容器。

依赖注入。依赖于某一种媒介完成对某一个对象的初始化或者是赋值。

b.面向切面编程(AoP)

面向切面编程(Aspect Oriented Programming)

2.3 Spring 优点

  1. 低侵入式设计
  2. 独立于各种应用服务器
  3. 依赖注入特性将组件关系透明化,降低了耦合度
  4. 面向切面编程特性允许将通用任务进行集中式处理
  5. 与第三方框架的良好整合

2.4 Spring工程构建

2.4.1Maven Spring依赖

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.22</version>
</dependency>

2.4.2 Spring核心配置文件编写

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans                             http://www.springframework.org/schema/beans/spring-beans.xsd"></beans>

2.4.3 完成控制反转及依赖注入的实例

<!-- 控制反转 -->
<bean id="userInfo" class="com.domain.UserInfo">
</bean>
<!--完成依赖注入 DI-->
<property name="username" value="张三" />
<property name="content" value="刘家豪大笨蛋!" />
<bean id="userInfo" class="com.domain.UserInfo">
        <!--完成依赖注入 DI-->
        <property name="username" value="张三" />
        <property name="content" value="刘家豪大笨蛋!" />
</bean>

bean的id名称,在同一个配置文件下,是只能拥有一个,不能够出现重复的id名称!如果出现相同的id,则会报如下错误:

测试:

@Test
public void testInit() {
//步骤1:获取到ApplicationContext对象
//ClassPathXmlApplicationContext:代表从类路径下加载xml配置文件,返回
ApplicationContext的对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml") ;
//步骤2:从ApplicationContext容器中获取到userInfo的对象
UserInfo userInfo = (UserInfo) ctx.getBean("userInfo") ;
userInfo.say();
}

2.4.4 Spring中的IoC产生的对象是否是单例模式 (是)

scope属性代表设置当前当前bean的作用域。
        singleton:单例
        prototype:每次调用时都会创建一个新的对象。

<bean name="helloSpring" class="com.csi.bean.HelloSpring" scope="singleton">
        <!--DI-->
        <property name="hello" value="今天天气好晴朗" />
</bean>
//ClassPathXmlApplicationContext:代表从类路径下加载xml配置文件,返回ApplicationContext
的对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml") ;
//步骤2:从ApplicationContext容器中获取到userInfo的对象
UserInfo userInfo = (UserInfo) ctx.getBean("userInfo1") ;
userInfo.say();
System.out.println(userInfo);
userInfo = (UserInfo) ctx.getBean("userInfo1") ;
userInfo.say();
System.out.println(userInfo);
以上代码,对同一个bean进行两次调用,得到对象是同一个对象,说明在Spring的设计当中,所使用的是单例设计模式!每一个调用的bean,都会生成一个新的对象。

2.4.5延迟实例化

<bean id="userInfo1" class="com.domain.UserInfo">
        <!--完成依赖注入 DI-->
        <property name="username" value="张三" />
        <property name="content" value="刘家豪大笨蛋!" />
</bean>
<bean id="userInfo2" class="com.domain.UserInfo">
        <!--完成依赖注入 DI-->
        <property name="username" value="李四" />
        <property name="content" value="翟雪松大帅哥!" />
</bean>

虽然都是对同一个类进行实例化,但是每一个bean就代表着一个对象。

        当Spring加载配置文件时,默认情况下,就会将所有配置的bean全部实例化。
        如果在Spring的bean节点中,配置了lazy-init的属性,就会实现延迟初始化的效果,即在spring容器启动时,并不会立刻初始化该对象,直到获取该对象的id或者是name时,才会初始化对象。
<bean name="helloSpring" class="com.csi.bean.HelloSpring" scope="singleton"
lazy-init="true">
        <!--DI-->
        <property name="hello" value="今天天气好晴朗" />
</bean>
//需要先加载Spring核心配置文件,如果设置了lazy-init,调用该语句时不会初始化对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml") ;
//调用时才会初始化对象
HelloSpring helloSpring = (HelloSpring) ctx.getBean("helloSpring");

2.5 Bean的三种实例化方式

2.5.1构造方法方式【重点】

  • BookDaoImpl实现类
public class BookDaoImpl implements BookDao {
        public BookDaoImpl() {
                System.out.println("book dao constructor is running ....");
        }
        public void save() {
                System.out.println("book dao save ...");
        }
}
  • applicationContext.xml配置
<!--方式一:构造方法实例化bean-->
<bean id="bookDao" class="com.csi.dao.impl.BookDaoImpl"/>
  • AppForInstanceBook测试类
public class AppForInstanceBook {
        public static void main(String[] args) {
                ApplicationContext ctx = new
                ClassPathXmlApplicationContext("applicationContext.xml");
                BookDao bookDao = (BookDao) ctx.getBean("bookDao");
                bookDao.save();
        }
}

2.5.2静态工厂方式(了解)

  • orderDao接口和orderDaoImpl实现类
public interface OrderDao {
        public void save();
        }
public class OrderDaoImpl implements OrderDao {
        public void save() {
                System.out.println("order dao save ...");
        }
}
  • OrderDaoFatory工厂类
//静态工厂创建对象
public class OrderDaoFactory {
public static OrderDao getOrderDao(){
        System.out.println("factory setup....");
        return new OrderDaoImpl();
        }
}
  • applicationContext.xml配置
<!--方式二:使用静态工厂实例化bean-->
<bean id="orderDao" class="com.csi.factory.OrderDaoFactory" factory
method="getOrderDao"/>
  • AppForInstanceOrder测试类
public class AppForInstanceOrder {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");
        orderDao.save();
        }
}

2.5.3实例工厂方式(了解)

  • UserDao接口和UserImpl实现类

  • UserDaoFactory工厂类

  • applicationContext.xml配置

  • AppForInstanceUser测试类

2.6 Bean的生命周期

  • 使用init-method及destroy-method

测试类(使用实现类类型,接口类型没有close方法)

  • 实现InitializingBean, DisposableBean接口

心得:如果既实现了这俩个接口,又手写了初始化和销毁方法。经过测试得知,实现接口的初始化和注销方法优先执行。

2.7 Bean的销毁时机

  • 容器关闭前触发bean的销毁
  • 关闭容器方式:
        手工关闭容器
                        ConfigurableApplicationContext 接口 close() 操作
        注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机
                        ConfigurableApplicationContext 接口 registerShutdownHook() 操作 。
关闭钩子比较合情,当调用后不会立即关闭,方法执行完毕后才进行关闭。

三:应用XML编程实现AOP

        面向切面编程(Aspect Oriented Programming)。其目的是为了拦截某些类下的某些方法、参数、返回值内容。在此基础之上,通过增强形式,使用代理设计模式显示AOP编程。

3.1AOP的代理实现形式(一共有三种)

3.1.1 通过JDK动态代理实现

        动态代理是指:代理类对象是在运行时,由JVM根据反射机制动态生成的。动态代理不需要定义代理类的.java源文件。动态代理其实就是JDK运行期间,动态创建class字节码文件并加载到JVM。

优点

  1. 不用创建类文件
  2. 当修改了接口中的方法时,不会影响代理类
  3. 不用给不同的目标随时创建代理

术语概念

  1. 1目标类:实现了功能接口的实现类对象
  2. 代理类:作为调用类和目标类之间的桥接
  3. 调用类:需要调用目标类方法来完成值的获取
  4. OCP原则:程序设计的一个考虑,类设计的时候尽量避免方法当中代码的二次修改,但是欢迎类设计者扩展一个类的功能(方法)
  5. 耦合度:一个类过于依赖于另一个类,就会产生耦合性

注意:JDK的动态代理,是要求必须拥有接口的。Spring能够对任何的一个对象都进行代理设计,此时如果某个对象没有对应的接口,只是单单的利用JDK动态代理,则无法创建对应的代理对象。Spring AOP就会采用CGLib生成。

例子:

3.1.2通过CGLib动态代理实现

        CGLib是通过继承目标类实现的一种代理方式,因此不需要提前准备目标对应的接口。在Spring生成代理对象时,实际上是生成代理目标的一个子类。

3.1.3 AOP术语

  • 连接点(JoinPoint):正在执行的方法,例如:update()、delete()、select()等都是连接点。 每个方法不仅仅只有一个连接点,方法前中后都可能成为一个连接点。
  • 切入点(Pointcut):进行功能增强了的方法,例如:update()、delete()方法,select()方法没有被增强所以不是切入点,但是是连接点。

  • 通知(Advice):在切入点前后执行的操作,也就是增强的共性功能

在SpringAOP中,功能最终以方法的形式呈现

  • 通知类:通知方法所在的类叫做通知类
  • 切面(Aspect):描述通知与切入点的对应关系,也就是哪些通知方法对应哪些切入点方法。

3.2 通过编程形式基于XML实现AOP

  • 引入aspectjwarver环境
        <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.9.1</version></dependency>
  • 修改核心配置文件

  • 编写增强通知类
package com.csi.proxy;import org.aopalliance.intercept.Joinpoint;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;import java.util.Arrays;public class LogManagerAdvice {//构造public LogManagerAdvice(){System.out.println("建立数据库连接.....");}//前置增强public void before(JoinPoint joinpoint){System.out.println("被增强的类:"+joinpoint.getTarget().getClass().getName()+ "被拦截的方法:" +joinpoint.getSignature().getName()+"参数是:"+ Arrays.toString(joinpoint.getArgs()));System.out.println("开始记录日志。。。。");}//后置增强public void afterReturning(JoinPoint joinPoint ,Object o){System.out.println("结束日志记录。。。");}//异常通知public void afterThrowing(JoinPoint joinPoint,RuntimeException e){System.out.println(joinPoint.getTarget()+"的"+joinPoint.getSignature().getName()+",报出的信息是:"+e);}//最终通知public void after(JoinPoint joinPoint){System.out.println("最终通知:"+joinPoint.getTarget()+"的"+joinPoint.getSignature().getName()+",参数是"+Arrays.toString(joinPoint.getArgs()));}//环绕通知public void afterAround(ProceedingJoinPoint pjp){System.out.println("开启事务.....");try {Object result = pjp.proceed();System.out.println("事务提交....");} catch (Throwable e) {e.printStackTrace();System.out.println("事务回滚....");}finally {System.out.println("释放SqlSession对象");}}
}
  • 在核心配置文件中添加aop配置

  • 测试
ApplicationContext ctx = new ClasspathXMLApplicationContext("applicationXXX.xml") ;
Object obj = ctx.getBean("id") ;
obj.xxx() ;
  • 结论
从实验的结果中,发现AOP灵活度非常高,当需要或不需要前置或后置通知时,只需要进行配置即可。

3.2 AOP使用场景

在业界公认的包含以下场景:
  • 日志
                会降低日志输出灵活度,没有办法进行个性化设置
  • 权限
                如果下沉到了service层,那么基本已经没有太大意义。
  • 事务管理
                由于事务管理基本上是一成不变的,所以是最适合的使用场景。

企业级应用开发(SSM) Spring相关推荐

  1. 企业级信息系统开发——初探Spring AOP

    文章目录 一.提出游吟诗人唱赞歌任务 (一)采用传统方式实现 (二)采用传统方式实现的缺点 二.采用配置方式使用AOP (一)创建本讲所需子包 (二)创建杀龙任务类 (三)创建勇敢骑士类 (四)创建游 ...

  2. Kotlin 企业级应用开发教程(Spring 5 + Spring Boot 2.0 + MyBatis)

    Kotlin 企业级应用开发教程 -- Spring 5 + Spring Boot 2.0 + MyBatis 内容简介 Kotlin编程语言是一种现代语言,它简洁,安全,实用,同时专注于与Java ...

  3. Java语言开发在线购物推荐网 购物商城推荐系统 基于用户、物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)开发框架 大数据、人工智能、机器学习项目开发

    Java语言开发在线购物推荐网 购物商城推荐系统 基于用户.物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)开发框架 大数据.人工智能.机器学习项目开发ShopRec ...

  4. Java语言开发在线音乐推荐网 音乐推荐系统 网易云音乐爬虫 基于用户、物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)框架 大数据、人工智能、机器学习项目开发

    Java语言开发在线音乐推荐网 音乐推荐系统 网易云音乐爬虫 基于用户.物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)框架 大数据.人工智能.机器学习项目开发Mus ...

  5. 使用Java+SSM(Spring+SpringMVC+Mybatis)如何开发个性化音乐推荐系统 在线音乐推荐网站 基于用户、项目的协同过滤推荐算法实现MusicRecommendSystemWeb

    使用Java+SSM(Spring+SpringMVC+Mybatis)如何开发个性化音乐推荐系统 在线音乐推荐网站 基于用户.项目的协同过滤推荐算法实现MusicRecommendSystemWeb ...

  6. 如何使用Java+SSM(Spring+SpringMVC+Mybatis)开发个性化新闻推荐系统 在线新闻推荐系统 基于用户项目协同过滤、内容、聚类、关联规则推荐算法实现WebNewsRSMEx

    如何使用Java+SSM(Spring+SpringMVC+Mybatis)开发个性化新闻推荐系统 在线新闻推荐系统 基于用户项目协同过滤.内容.聚类.关联规则推荐算法实现WebNewsRSMEx 一 ...

  7. 使用Java+SSM(Spring+SpringMVC+Mybatis)开发在线美食推荐网 美食推荐系统 美食天下美食爬虫 基于用户、物品的协同过滤推荐算法实现 大数据、人工智能、机器学习项目开发

    使用Java+SSM(Spring+SpringMVC+Mybatis)开发在线美食推荐网 美食推荐系统 美食天下美食爬虫 基于用户.物品的协同过滤推荐算法实现 大数据.人工智能.机器学习项目开发Fo ...

  8. spring boot 搭建的一个企业级快速开发脚手架

    源码地址 https://github.com/javanan/slife slife spring boot 搭建的一个企业级快速开发脚手架. 技术栈 Spring Boot MySQL Freem ...

  9. 使用Java语言开发在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户、物品的协同过滤推荐算法实现 SSM(Spring+SpringMVC+Mybatis)开发框架 机器学习、人工智能、大数据开发

    使用Java语言开发在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户.物品的协同过滤推荐算法实现 SSM(Spring+SpringMVC+Mybatis)开发框架 机器学习.人工智能.大数据开发 ...

最新文章

  1. hung-yi lee_p1_机器学习是什么
  2. MPLS LDP随堂笔记1
  3. 人群分析、人群计数 开源代码文献及数据库
  4. 微软开发x86模拟器,让Windows for ARM能运行x86应用
  5. 你真的了解 OpenJDK 吗?
  6. LinkedBlockingQueue和ArrayBlockingQueue
  7. 2017 济南综合班 Day 2
  8. typescript接口使用
  9. javascript学习之数组的使用一 push pop shift unshift 方法
  10. Java 的下载安装教程
  11. 开关电源(DC-DC)与LDO电源的区别---效率
  12. mt管理器怎么运行HTML文件,MT管理器怎么修改游戏数据 MT管理器修改内购教程
  13. TypeError: this.getOptions is not a function at Object.lessLoader less安装使用报错
  14. matlab读取wav文件
  15. html图片动态案例,10个强大的纯CSS3动画案例分享
  16. 最适合freshman的Java习题集(一)
  17. 软考知识点---12软件工程基础
  18. 发动机冷却系统的控制论文综述
  19. 吉利汽车、京东数科、盛美半导体……来了解下科创板排队的“高研值”企业...
  20. 13、案例分析-在C#中识别车牌

热门文章

  1. JoinPoint 对象
  2. golang关于数量的总结
  3. MFC中char*与CString的互相转换
  4. electron离线安装
  5. Mapstruct中类型的映射规则(二)
  6. 《Photoshop修色圣典——PPW专业照片修正流程与技巧》—第1章颜色、对比、颜色...
  7. k8s使用外部供应商代理使用ceph
  8. CentOS7防火墙相关操作
  9. 贺泓胜:3.1今日黄金白银走势分析,期货黄金白银td沪金走势及策略
  10. URLEncode HTMLEncode