Spring(一):
定义:
spring是一个开源框架,是于2003年兴起的一个轻量级的java开发框架,它是为了解决企业级应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅局限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心就是控制反转(IOC)和面向切面(AOP)Spring的一个最大的目的就是使JavaEE开发更加容易。同时,Spring之所以与Struts、hibernate 等单层框架不同,是因为Spring致力于提供一个统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合柔和在一起建立一个连贯的体系。所以行业也称它是一个万能胶语言,可以说Spring是一个提供了更完善开发环境的一个框架。
hibernate框架用来替代DAO层
struts2框架用来替代service层
spring框架用来替代service层,通过spring框架
EJB框架是啥?
EJB(Enterprise JavaBean)是J2EE的一部分,定义了一个应用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务和核心开发工具(sdk)
在j2EE里,Enterprise Java Beans(EJB)称为java企业Bean,是Java核心代码,分别是会话Bean(session Bean),实体Bean(Entity Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriver Bean)
为什么需要学习Spring?
1.方便解耦,简化开发:Spring就是一个大工厂,可以将所有的对象创建和依赖关系交给Spring来管理,避免硬编码所造成的过度程序耦合。
2.AOP编程的支持:Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
3.声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无需手动编程
4.方便程序的测试:Spring对Junit4支持,可以通过注解的方便测试Spring程序
5.方便集成各种优秀框架:Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:struts、hibernate、mybatis、Quart等)的直接支持
Spring框架体系结构:
核心容器(core containter)u:
1.spring-core:依赖注入IOC与DI的最基本实现
2.spring-beans:Bean工厂与bean的装配
3.spring-context:spring的context上下文即IOC容器
4.spring-expression:spring表达式语言
数据访问/集成部分(data access)
1.spring-jdbc:jdbc的支持
2.spring-orm:对象关系映射,集成orm框架
3.spring-oxm:对象xml映射
4.spring-jms :java消息服务
5.spring-tx:事务控制
【web】
1.spring -websocket:websocket protocol 是HTML5一种新的协议,它实现了浏览器与服务器全双工通信,spring支持websocket通信
2.spring-web:基础web功能,如在文件上传
3.spring-webmvc-protle:提供了在protle环境下的mvc实现
4.spring-webmvc:mvc实现
【AOP】
1.spring-aop :面向切面编程
2.spring-aspect:集成Aspectj
3.spring-instrument:提供一些类级的工具类支持和ClassLoader级的实现,用于服务器
【test】
1.spring-test:spring测试,提供junit与mock测试功能
Spring两大核心:
spring两大核心是IOC、AOP
IOC:
[inverse of Control]–控制反转
读作"反转控制",更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。
正控:若要使用某个对象,需要自己去负责对象的创建
反控:若要使用某个对象,只需要从Spring容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了spring框架
IOC如何实现?
简单来讲:IOC实现=工厂模式+反射+配置文件
我们简单说说IOC是如何实现的。想象一下如果我们自己来实现这个依赖注入的功能,我们怎么做?无外乎:
1.读取表示或者配置文件,看看JUIceMaker依赖的是哪个Source,拿到类名
2.使用反射的API,基于类名实例化对应的对象实例
3.将对象实例,通过构造函数或者setter,传递给juiceMaker
我们发现其实自己来实现也不是很难,Spring实际也就是这么做的。这么看的话,其实IOC就是一个工厂模式的升级版!当然要做一个成熟的IOC框架,还是非常多细致的工作要做,Spring 不仅提供一个已经成为业界标准的Java IOC框架,还提供了更多强大的功能,所以希望大家了解IOC更多实现细节不妨通过学习Spring的源码来加深理解!
DI:[Dependency Injection]-- 依赖注入
指Spring创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设置给该对象
实现IOC需要DI做支持
注入的方式:
set方法注入
构造方法注入
字段注入
注入类型:
值类型注入(8大基本数据类型)
引用类型注入(将依赖对象注入)
AOP:
Aspect Oriented Program 面向切面编程
补充:什么是工厂模式?
工厂模式:根据我们提供的所需的对象的描述,为我们返回所需要的 产品
1.定义产品的规范
2.产品
3.工厂
4.客户端/调用者
工厂模式案例:
1.规范:
/**
- 简单的工厂模式
- 接口,规范
- @author 直条纹先生
*/
public interface Animal {
public void eat();
public void sport();
}
2.产品
public class Cat implements Animal {
@Override
public void eat() {
System.out.println(“猫吃鱼”);
}
@Override
public void sport() {
System.out.println(“猫不爱运动,爱趴着睡觉”);
}
}
public class Dog implements Animal {
@Override
public void eat() {
System.out.println(“狗吃狗粮”);
}
@Override
public void sport() {
System.out.println(“狗爱跑步”);
}
}
3.工厂
package interf;
public class Factory {
public static final String DOG =“dog”;
public static final String CAT =“cat”;
//根据传过来的参数判断是返回DOG对象还是CAT
public Animal getAnimal(String pet){
if(DOG.equals(pet)){
return new Dog();
}else if(CAT.equals(pet)){
return new Cat();
}else{
return null;
}
}
}
4.客户端或调用者
package interf;
/**
*
- 客户端/调用者
- @author 直条纹先生
*/
public class Test {
public static void main(String[] args) {
Animal animal = null;
Factory factory = new Factory();
/animal = factory.getAnimal(“dog”);
animal.eat();
animal.sport();/
animal = factory.getAnimal(“cat”);
animal.eat();
animal.sport();
}
}
Spring入门:
1.下载spring 包
2.导包
需要导入四个核心包,如果需要日志处理,你就把日志处理的包也导入进去
3.定义一个实体类
一定要get/set方法
package com.spring.demo;
public class HelloSpring {
private String who = null;
public String getWho() {
return who;
}
public void setWho(String who) {
this.who = who;
}
public void print(){
System.out.println(“hello,”+this.getWho()+“!”);
}
}
4.创建配置文件
配置文件可放在任意位置,建议放在src下
配置文件的文件名任意,建议为applicationContext.xml
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?> Spring命名空间补充:
参考:https://www.cnblogs.com/Hermioner/p/10213570.html
命名空间:
<?xml version="1.0" encoding="UTF-8"?>5.编写junit测试类:
package Test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.demo.HelloSpring;
public class SpringTest {
@Test
public void test(){
//通过实例化ClassPathXmlApplicationContextSpring上下文对象context
ApplicationContext context= new ClassPathXmlApplicationContext(“applicationContext.xml”);
HelloSpring helloSpring = (HelloSpring)context.getBean(“helloSpring”);
//对象调用其方法
helloSpring.print();
//正向控制,通过自己New的对象
//HelloSpring helloSpring = new HelloSpring();
//反向控制,也就是控制Spring配置文件中管理javaBean对象
//反向控制,也就是控制Spring配置文件中
}
}
AOP面向切面编程:
AOP的目的’:
AOp能够将那些与业务无关,却为业务模块锁共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可扩展性和可维护性
AOP的专业术语:
1、切面(Aspect) 切面就是在一个怎样的环境中工作。它可以定义后面需要介绍的各类通知、切点和引入等内容,然后 SpringAOP会将其定义的内容织入到约定的流程中,在动态代理中可以把它理解成一个拦截器。
2、通知(Advice) 通知是切面开启后,切面的方法。他根据在代理对象真实方法调用前、后的顺序和逻辑区分。 前置通知(before):在动态代理反射原有对象方法或者执行环绕通知前执行的通知功能。 后置通知(after):在动态代理反射原有对象方法或者执行环绕通知后执行的通知功能。无论是否抛出异 常,他都会被执行。 返回通知(afterReturning):在动态代理反射原有对象方法或者执行环绕通知后正常返回(无异常)执 行的通知功能。 异常通知(afterThrowing):在动态代理反射原有对象方法或者执行环绕通知产生异常后执行的通知功 能。环绕通知(around):在动态代理中,他可以取代当前被拦截对象的方法,提供回调原有被拦截对象的方 法。
3、引入(introduction) 引入允许我们在现有的类里添加自定义的类和方法。
4、切点(Pointcut)
这是一个告诉Spring AOP在什么时候启动拦截并织入对应的流程中,因为并不是所有的开发都需要启动 AOP的,他往往通过正则表达式进行限定。
5、连接点(join point) 连接点对应的是具体需要拦截的东西,比如通过切点的正则表达式去判断那些方法是连接点,从而织入对应 的通知。
6、织入(Wearing) 织入是一个生成代理对象并将切面内容放入到流程中的过程。实际代理的方法分为静态代理和动态代理。静 态代理是在编译class文件时生成的代码逻辑,但是在Spring中并不使用这样的方式,所以我们暂时不讨 论。一种是通过ClassLoader也就是在类加载的时候生成的代码逻辑,但是它在应用程序代码运行之前就 生成了对应的逻辑。还有一种是运行期,动态生成代码的方式,这是SpringAOP所采用的方式,Spring是 以JDK和CGLIB动态代理来生成代理对象的
简单来讲就是:
切入点(Pointcut)在哪些类,哪些方法上切入(where)
通知(Advice)在方法执行的什么实际(when:方法前/方法后/方法前后)做什么(what:增强的功能)
切面(Aspect)切面=切入点+通知,通俗点就是:在什么时机,什么地方,做什么增强!
织入(Weaving)把切面加入到对象,并创建出代理对象的过程(由spring来完成)