Spring
Spring 是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
l 目的:解决企业应用开发的复杂性。
l 功能:使用基本的JavaBean代替EJB。
l 范围:任何Java应用。
优点:
l 低侵入式,代码污染低。
l Write Once,Run Anywhere
l DI有效降低了耦合度。
l AOP提供了通用任务的集中管理。
l ORM和DAO简化了对数据库访问。
l 高度开放性,并不强制。
好处:
l 可以有效组织中间层对象。
l 使用统一的配置文件。
l 促进良好编程习惯,减少编程代价。
l 易于单元测试。
l 使EJB成为一种备选
l 为数据存取提供了一致的框架。
Spring核心模块:
l 核心容器(Spring Core)
l 应用上下文(SpringContext)
l AOP模块(Spring AOP)
l JDBC和DAO模块(Spring DAO)
l 对象实体映射(SpringORM)
l Web模块(Spring Web)
l MVC模块(Spring Web MVC)
Spring IoC
IoC(Inversion ofControl,控制反转)是Spring的核心,贯穿始终。IoC对Spring来说,就是由Spring来负责控制对象的生命周期和对象间的关系;
把负责系统分解成相互合作的对象:
依赖注入(DI,Dependency Injection):指通过引入IoC容器,利用依赖关系注入的方式,实现对象之间的解耦。
简单理解:
IoC控制反转:说的是创建对象实例的控制权从代码控制剥离到IoC容器控制,实际就是你在xml文件控制,侧重于原理。
DI依赖注入:说的是穿件对象实例时,为这个对象注入属性值或者其他对象实例,侧重于实现。
Spring AOP
AOP:面向对切面编程,专门用于处理系统中分布于各个模块中的交叉关注点的问题,在Java EE 应用中,常常通过AOP来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP已经成为一种非常常用的解决方案
通俗理解:一个组件A,不关心其他常用的服务组件B,但是这个组件A使用组件B的时候,不是组件A自身去调用,而是通过配置等其他方式,比如Spring中可以通过xml配置文件。这样就使得A不需要知道服务组件B是怎样的,只关心自己的业务逻辑,具体A使用B的时候,配置文件去做,与具体的A组件无关。
Spring核心开发包:
Spring Core 包含基本核心工具类,也是其他组件的基本核心
Spring beans 访问配置文件,创建管理bean,控制反转、依赖注入
Spring AOP 声明性的事务管理、日志引入等
Spring Context Spring applicationContext相关特性,JNDI、校验
IoC深入理解
IoC是Spring容器的内核,AOP、声明式事务等都依赖于此功能,它涉及代码解耦、设计模式、代码优化等。
字面意思:控制、反转。
DI概念的引入:让调用类对某一接口实现类的依赖关系,由第三方注入,以移除调用类对某一接口实现的依赖
IoC的注入类型(Spring作为一个容器,通过配置文件或者注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入的工作):
构造函数注入
属性注入
接口注入
<!--实现类的实例化-->
<bean id="world" class="com.HelloWorld"/>
<!--通过上面实例的hello属性建立依赖关系-->
<bean id="person" class="com.Person">
<property name="hello" ref="world"/>
</bean>
Java反射机制:通过程序化的方式间接对Class的对象实例操作,Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息,如构造函数、属性和方法等。
public static void testRefect () throws Exception {
//获取类装载器
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
//加载Car类
Class clazz = classLoader.loadClass("com.mafei.Car");
//获取该类的构造方法
Constructor cons = clazz.getDeclaredConstructor();
//实例化该类(无参)
Car car = (Car) cons.newInstance();
//获取方法
Method setBrand = clazz.getDeclaredMethod("setBrand", String.class);
Method setColor = clazz.getDeclaredMethod("setColor", String.class);
Method setMaxSpeed = clazz.getDeclaredMethod("setMaxSpeed", String.class);
Method run = clazz.getDeclaredMethod("run");
//执行方法
setBrand.invoke(car, "劳斯莱斯");
setColor.invoke(car, "红色");
setMaxSpeed.invoke(car, "300");
run.invoke(car);
//对该类进行有参实例化
cons = clazz.getDeclaredConstructor(new Class[]{String.class, String.class, String.class});
//进行有参实例化
car = (Car) cons.newInstance("奔驰", "黑色", "350");
//执行方法
run.invoke(car);
}
Spring Resource接口,为应用提供了更强大的访问底层资源的能力,Spring使用Resource来装载各种资源(配置文件、国际化属性等),主要方法:
1, boolean exists() 判断资源是否存在
2, boolean isOpen() 判断资源是否打开
3, URL getURL() 如果底层资源可以表示成url,则返回url对象
4, File getFile() 如果底层资源可以表示成file,则返回file对象
5, InputStream getInputStream() 返回底层资源输入流
资源类型地址前缀:
1, classpath classpath:com/abyss/bean.xml
2, File file:/com/abyss/bean.xml
3, http://http://www.baidu.com/bean.xml
4, ftp ftp://www.baidu.com/bean.xml
5, 无前缀com/abyss/bean.xml
BeanFactory:是Spring框架最核心的接口,它提供了高级IoC的配置机制。它是一个类工厂,可以创建并管理各种类对象,Spring称这些创建和管理的Java对象为Bean。
ApplicationContext:建立在BeanFactory基础上,提供了更多面向应用的功能,提供了国际化支持和框架事件体系,更易于创建实际应用一般成BeanFactory为IoC容器。
初始化顺序:
1, 创建配置文件
2, 装载配置文件
3, 启动IoC容器
4, 获取Bean实例
Spring配置文件
|
Spring配置文件是用于知道Spring工厂进行Bean的生产、依赖关系注入以及Bean实例分发的“图纸”,它是一个或多个标准的XML文档,J2EE程序员必须学会并灵活应用,来准确表达自己的生产意图
Spring容器启动基本条件:
Spring的框架类包
Bean的配置信息
Bean的实现类
Bean的元数据信息:
Bean的实现类
Bean的属性信息
Bean的依赖关系
Bean的行为配置
Bean的创建方式
<?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">
<bean id="china" class="com.mafei.HelloChina"/>
<!--实现类的实例化-->
<bean id="world" class="com.mafei.HelloWorld"/>
<!--通过上面实例的hello属性建立依赖关系-->
<bean id="person" class="com.mafei.Person">
<property name="hello" ref="world"/>
</bean>
</beans>
Bean的作用域:
在配置文件中即“Scope”,指Spring容器创建的Bean对象相对于其他Bean对象的请求可见范围。
Singleton:单例化,该实例将被存在单例缓存中。(默认作用域)
Prororype:原型化。
Request:针对每一次的http请求,该实例仅在httpRequest中有效。
Session:针对httpSession,仅在httpSession中有效。
Global Session:全局Session。
Java注解
Java5版本开始,自带了三种标准注解类型:@Override、@Deprecated、@SupressWarinings。
Java元注解(注解注解的注解):
@Target 描述注解的使用范围,即描述的注解可以用在什么地方,取值:CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE
@Retention 表示需要在什么级别保存该注解信息(即描述的注解在什么范围内是有效的),用于描述注解的生命周期,取值:SOURCE,CLASS,RUNTIME
@Documented 用于描述其他类型的annotation应该被作为标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。
@Inherited标记注解,表示某个被标注的类型是被继承的。
Spring表达式语言
基本表达式、类相关表达式、集合相关表达式、其他表达式(模版表达式)
1, 创建解析器使用步骤:
2, 解析表达式
3, 构造上下文
4, 求值
public static void main(String[] args) {
//创建解析器
ExpressionParser parser = new SpelExpressionParser();
//用解析器把字符串解析为表达式
Expression expression = parser.parseExpression("('Hello'+' World').concat(#end)");
//构造上下文
EvaluationContext context = new StandardEvaluationContext();
//为end赋值
context.setVariable("end", "!");
//打印value
System.out.println(expression.getValue(context));
}