Spring基础

们经常说的Spring其实指的是Spring Framework(spring 框架)。

Spring框架的核心就是IoC(控制反转)(或者DI 依赖注入,一个意思,将类之间的依赖关系交给容器管理,由容器实现耦合类的注入,解耦依赖关系,即将控制权由程序反转给容器)和AOP(面向切面编程,反射+动态代理)。

Spring5中一共21个jar,官网下载后包括二进制jar、源码jar、Javadoc的jar三种。

核心容器:核心容器由spring-core,spring-beans,spring-context,spring-context-support和spring-expression(SpEL,Spring表达式语言,Spring Expression Language)等模块组成,它们的细节如下:

spring-core模块提供了框架的基本组成部分,包括 IoC 和依赖注入功能。

spring-beans模块提供 BeanFactory,工厂模式的微妙实现,它移除了编码式单例的需要,并且可以把配置和依赖从实际编码逻辑中解耦。

context模块建立在由corebeans模块的基础上建立起来的,它以一种类似于JNDI注册的方式访问对象。Context模块继承自Bean模块,并且添加了国际化(比如,使用资源束)、事件传播、资源加载和透明地创建上下文(比如,通过Servelet容器)等功能。Context模块也支持Java EE的功能,比如EJB、JMX和远程调用等。ApplicationContext接口是Context模块的焦点。spring-context-support提供了对第三方库集成到Spring上下文的支持,比如缓存(EhCache, Guava, JCache)、邮件(JavaMail)、调度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等。

spring-expression模块提供了强大的表达式语言,用于在运行时查询和操作对象图。它是JSP2.1规范中定义的统一表达式语言的扩展,支持set和get属性值、属性赋值、方法调用、访问数组集合及索引的内容、逻辑算术运算、命名变量、通过名字从Spring IoC容器检索对象,还支持列表的投影、选择以及聚合等。

数据访问/集成:数据访问/集成层包括 JDBC,ORM,OXM,JMS 和事务处理模块,它们的细节如下:(注:JDBC=Java Data Base Connectivity,ORM=Object Relational Mapping,OXM=Object XML Mapping,JMS=Java Message Service)

JDBC 模块提供了JDBC抽象层,它消除了冗长的JDBC编码和对数据库供应商特定错误代码的解析。

ORM 模块提供了对流行的对象关系映射API的集成,包括JPA、JDO和Hibernate等。通过此模块可以让这些ORM框架和spring的其它功能整合,比如前面提及的事务管理。

OXM 模块提供了对OXM实现的支持,比如JAXB、Castor、XML Beans、JiBX、XStream等。

JMS 模块包含生产(produce)和消费(consume)消息的功能。从Spring 4.1开始,集成了spring-messaging模块。。

事务模块为实现特殊接口类及所有的 POJO 支持编程式和声明式事务管理。(注:编程式事务需要自己写beginTransaction()、commit()、rollback()等事务管理方法,声明式事务是通过注解或配置由spring自动处理,编程式事务粒度更细)

Web:Web 层由 Web,Web-MVC,Web-Socket 和 Web-Portlet 组成,它们的细节如下:

Web 模块提供面向web的基本功能和面向web的应用上下文,比如多部分(multipart)文件上传功能、使用Servlet监听器初始化IoC容器等。它还包括HTTP客户端以及Spring远程调用中与web相关的部分。。

Web-MVC 模块为web应用提供了模型视图控制(MVC)和REST Web服务的实现。Spring的MVC框架可以使领域模型代码和web表单完全地分离,且可以与Spring框架的其它所有功能进行集成。

Web-Socket 模块为 WebSocket-based 提供了支持,而且在 web 应用程序中提供了客户端和服务器端之间通信的两种方式。

Web-Portlet 模块提供了用于Portlet环境的MVC实现,并反映了spring-webmvc模块的功能。

其他:还有其他一些重要的模块,像 AOP,Aspects,Instrumentation,Web 和测试模块,它们的细节如下:

AOP 模块提供了面向方面的编程实现,允许你定义方法拦截器和切入点对代码进行干净地解耦,从而使实现功能的代码彻底的解耦出来。使用源码级的元数据,可以用类似于.Net属性的方式合并行为信息到代码中。

Aspects 模块提供了与 AspectJ 的集成,这是一个功能强大且成熟的面向切面编程(AOP)框架。

Instrumentation 模块在一定的应用服务器中提供了类 instrumentation 的支持和类加载器的实现。

Messaging 模块为 STOMP 提供了支持作为在应用程序中 WebSocket 子协议的使用。它也支持一个注解编程模型,它是为了选路和处理来自 WebSocket 客户端的 STOMP 信息。

测试模块支持对具有 JUnit 或 TestNG 框架的 Spring 组件的测试。

Spring架构


获取Spring容器

Spring IoC容器需要通过Bean工厂来实现,在Spring框架中,他们都可代表Spring容器,Spring容器是生成Bean实例的工厂,并且管理容器中的Bean。主要有两个工厂接口:


BeanFactory接口(功能简单)

ApplicationContext接口(功能强大,继承了BeanFactory接口,大多数情况使用)

在使用BeanFactory接口时,我们一般都是使用这个实现类:org.springframework.beans.factory.xml.XmlBeanFactory。

//加载Spring的资源文件Resource resource=newClassPathResource("applicationContext.xml");//创建IOC容器对象【IOC容器=工厂类+applicationContext.xml】BeanFactory beanFactory=newXmlBeanFactory(resource);

ApplicationContext作为Spring容器会更加方便。它的实现类有:

ClassPathXmlApplicationContext

FileSystemXmlApplicationContext

AnnotationConfigApplicationContext

WebApplicationContext(web)

// 得到IOC容器对象ApplicationContextac=newClassPathXmlApplicationContext("applicationContext.xml");System.out.println(ac);

Spring三种配置方式

1、使用XML文件显式配置

<bean id="userDao" class="cn.lovepi.***.userDao"/>

2、使用JavaConfig来显式配置

Java配置通过@Configuration和@Bean来实现

@Configuration声明当前类是一个配置类,相当于一个spring配置的xml文件,这意味着这个类里可能有0个或者多个@Bean注解。

@Bean注解在方法上,声明当前方法的返回值为一个Bean。

3、注解配置(隐式的bean发现机制和自动装配)

@Component 放在一个类前边,他可以被Spring识别,Spring容器会自动将POJO转换为容器管理的Bean.他和XML配置是等效的<bean id = "UserDao"  class= "com.test...."> 

下面有几个和这个等效,但是有微小差别:

@Repository :用于Dao层实现类进行标注,数据库相关的操作。

@Service:   用于Service层实现类进行标注。

@Controller: 用于对Controller实现类进行标注。

@RestController??


自动化装配Bean:

(自动装配@Autowired + 组件扫描@ComponentScan)//统统注解

<context:componet-scan base-package=""/>//通过xml配置自动扫描

@Autowired一般可通过构造方法注入,set方法参数注入,接口注入。

//  1、定义了一个Bean

@Component

public class LoadSystemData {

    //2、注入baseDao

    @Autowired

    private BaseDAO baseDAO;

 在1处将LoadSystemData 标注为一个Bean,在2处通过@Autowired注入到baseDao的Bean。@Autowired默认是按照类型匹配的方式,在容器查找匹配的Bean,当有且仅又一个匹配的时候,Spring将其注入到@Autowired的标注变量中。使用@Autowired的required的属性

如果容器中没有标注一个和标注变量类型匹配的时候,Spring容器将会报NoSuchBeanDefinitionException的异常。如果希望Spring容器即使找不到匹配的Bean完成注入也不要抛出异常,那么可以使用@Autowired(required=false)进行标注。

有的时候按类型注入得时候,Spring容器里边可能有多个对象,那么使用下边的方法

     使用@Qualifier指定注入Bean的名称

@Qualifier("userDao"),这时,假设容器有两个类型为UserDao的Bean,一个名字为userDao,另一个名为otherUserDao,那么则会注入名字为userDao的Bean


@Resource  @Inject  @Autowired区别

@Resource 是按照名称进行注入的  使用@Autowired@Qualifier("userDao")即可完成这一操作

@Inject 是按照类型进行注入的  但是没有(required=false)这个属性

@Autowired开发中还是很常用的

总结:


Bean的实现类来源于三方类库、比如DataSource、JdbcTemplate等,无法在类中进行标注注入,通过xml方式比较好;命名空间的配置,如aop、context,只能采用xml进行配置

Bean的实现类是基于当前项目开发的,使用注解方式比较好

基于java类配置的,一般用于实例化 Bean类比较复杂的,控制Bean初始化的整体逻辑,在日常的开发中我们主要是使用XML配置和注解配置方式向结合的开发方式,一般不推荐使用基于Java类的配置方式。


Bean的作用域


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容

  • 参考W3C Spring教程 Spring致力于J2EE应用的各种解决方案,而不仅仅专注于某一层解决方案。可以说S...
    王侦阅读 1,151评论 0 6
  • 如下是整篇文章的结构,所需阅读时间大约20min Spring简介 Spring框架由Rod Johnson开发,...
    李序锴阅读 885评论 0 15
  • Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB...
    OSET我要编程阅读 2,701评论 0 3
  • 今晚,吴校长又一次在机场的候机厅给我们上课。 可能连吴校长自己也说不出,有多少次,在嘈杂的候机厅,在飞驰的汽车上,...
    拾光散人阅读 969评论 6 33
  • 如果有人更爱你,那一定是父母, 没有哪种爱能胜过父母对子女的爱, 也没有哪种舍得超过舍得自己的生命, 更没有哪种哪...
    村长s1573阅读 175评论 0 1