Spring详解

一、概述

(一)Spring框架的核心功能:

1、负责创建和管理所有的java对象,这些java对象被称为bean

2、管理容器中Bean之间的依赖关系,以一种"依赖注入"的方式来管理Bean之间的依赖关系。(依赖注入为Bean注入普通的属性值,也可以注入其他Bean的引用)

通俗的说,Spring框架的本质就是通过XML配置类驱动java代码,从而把耦合关系提取到配置文件中管理,实现了系统中各组件的解耦。

(二)总结需要的:

  创建spring项目两种方式:

  1.直接创建spring项目:如 另一篇文章很简易的spring的基本使用(以及spring mvc的) - 简书

 (1)bean包(setter、getter方法,以及包括其具体的实现类)(2)spring.xml(spring的配置文件,主要是配置bean实例的,指定实例之间依赖关系,可以建一个, 其中多个bean,也可以对应每个数据模型建多个xml文件,对应不同的bean)或者注解(通过反射来创建实例) (3)spring的实现类

2.创建一个Maven项目:如下图,

比起直接创建spring项目,要多一个pom.xml(自动生成)用于配置spring



二、入门:

(一)spring框架结构:

AOP:面向切面(面向方面编程)

IOC:控制反转,容器

DI:依赖注入

(注意:spring没有提供AOP方式的日志系统,我们需要使用AOP方式,借助spring与日志系统log4j实现我们自己的日志系统)

Spring通过配置文件描述Bean及Bean之间的依赖关系,并通过Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。

Spring的IOC容器,一个是完成底层工作,并且提供一些高级服务(通过BeanFactory和ApplicationContext)

配置Bean(定义了Bean的实现及依赖关系),Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载、实例化Bean,并建立bean和bean的依赖关系,最后将准备就绪的bean放到bean缓存池,供外岑的应用程序调用。


(二)入门示例:

用的是Maven项目结构来创建spring项目:

1.eclipse创建maven项目:

注意创建路径不能和其他java项目路径一致,干脆在D盘另开一个文件夹。


项目目录

2.用maven,对单个项目右键propeties更改默认设置java1.8:

3. 配置pom.xml,声明spring基本库:

配置前:

配置后:

4.这个例子中有点类似spring基础的例子,同样还是在applicationConfig.xml配置文件中配置java bean,在主类中用ApplicationContext获取这个xml。

(三)Maven中pom.xml中配置spring和数据库(oracle,mysql,sql server):



三、Spring的核心机制:依赖注入

依赖注入(DI)通常有两种:

1、设值注入:IOC容器使用成员变量的setter方法来注入被依赖对象

通过<property.../>元素驱动spring执行setter方法

推荐面向接口编程,更好使规范和实现分离,提供更好的解耦。无论DAO组件或者业务逻辑组件,都应该先定义一个接口,定义该组件应该实现的功能,但具体实现由实现类提供。

A调用B,B调用C...这其实就是依赖关系。但spring是以松耦合的方式来管理这种调用关系。

配置文件:配置Bean实例,通常指定id、class、ref属性

需要:接口类、实现类、spring的配置文件xxx.xml(配置Bean,指定实例之间的依赖关系)、spring容器的实现类

2、构造注入:IOC容器使用构造器来注入被依赖对象,通过构造方法

在配置文件中使用元素指定构造器的参数,通过<constructor-arg.../>元素驱动spring执行带参数的构造器。


四、使用spring容器:(一般使用ApplicationContext作为spring容器,所以spring容器也称为spring上下文)

(一)Spring的两个核心接口:BeanFactory和ApplicationContext

(区别:BeanFactory等到程序需要Bean实例是才创建bean;ApplicationContext在创建容器实例时就预初始化所有singleton Bean)

1、BeanFactory:IOC容器,是Spring框架的基础设施,面向spring本身,提供了高级IOC的配置机制。负责配置、创建、管理Bean,但很少用BeanFactory实例来作Spring的容器。

(主要方法:初始化配置Bean,再通过getBean()获取bean实例),初始化时必须为其提供一种日志框架,Log4J)

包含:Object getBean(Sring id)、

          T getBean(String name,Class requiredType)

           getType()方法


2、ApplicationContext:是BeanFactory的子接口,用于创建beanFactory的实例。一般用在spring的实现类中,作为用于访问容器中的bean常用接口(Spring容器,应用上下文,面向使用spring框架的开发者)常用!!!!

其实现类:

(1)ClassPathXmlApplicationContext类:从类路径加载配置文件(较稳定,常使用)

【ApplicationContext context =new ClassPathXmlApplicationContext(“xxx.xml”);

Person p=context.getBean("person",Person.CLass)】

(2)FileSystemXmlApplicationContext类:从文件系统装载配置文件

【ApplicationContext context =new FileSystemXmlApplicationContextxml(“xxx.xml”);】

(3)AnnotationConfigApplicationContext类

(4)WebXmlApplicationContext:定义了一个WEB应用的所有bean。 


(二)spring获取bean对象的方法:在ApplicationContext接口的实现类中使用

(1)Object getBean(Sring id)由容器中Bean的id获取指定bean

(2)T getBean(String name,Class requiredType)由容器中Beanid获取


五、Spring容器中的Bean:

1、bean的基本定义和别名:

根元素:<beans>,其中可以包含多个<bean.../>子元素,每个子元素定义一个Bean,每个Bean又对应Spring容器里的一个JAVA实例。

定义Bean一般要指定2个属性:id、class,还有name(可设置多个)

而元素<alias../>可指定别名:有两个属性:name和alias

2、容器中bean的作用域:6个(p569)

常用:singleton(只产生一个实例,默认,一旦创建成功可以重复使用)、prototype(每次都产生一个新的bean实例,从内存申请角度应尽量避免设置)

web应用中的:request、session、application、websocket(这四个只在web应用中生效,所以必须要在web.xml中增加额外配置,如listener配置

<listener>

<listener-class>org.springframework.web.content.request.RequestContextListener</listener-class>

</listener>

因为是在web应用中的,所以一般是在jsp中获取,在jsp中用java代码获取spring容器:WebApplicationContext  

也可直接使用springMVC框架。

3、配置依赖:

配置<bean>元素,相当于创建一个java实例;

在<bean>元素中配置<property>子元素,相当于bean类中的属性,每包含一个<property>子元素,spring则为该bean实例调用一次setter方法。

并在实现类中运用反射实现。

<property>中的属性:

(1)value:设置普通属性值

<property name="属性名"  value="属性值"/>

 (2)引用容器中其他bean:<ref.../>

(3)  自动装配属性:autowire、default-autowire

其可接收如下值:no、byName(根据setter方法名与bean的id进行匹配,spring容器会根据该bean的setter方法名寻找容器中id为同盟的bean,将其作为调用该setter方法的参数;找不到则不进行任何注入)、byType(同理,但这是根据setter方法的参数类型与bean的类型进行匹配,若有多个匹配,容器会无法判断,从而抛出异常;找不到则不进行任何注入)、constructor(类似byType,但找不到则抛出异常)、autodetect(根据bean内部结构决定使用constructor或byType策略, 首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。)

(4)注入嵌套bean:把<bean>配置成<property.../>或<costructor-args.../>的子元素

总结:spring配置文件,根据传入参数的参数类型不同,配置文件不同

①基本类型,在value写值;②其他类时:用ref的方式;注入嵌套;自动装配 

③注入集合值:map、list、set、properties(key、value只能说字符串)

六、spring中配置bean的xml(applicationConfig.xml):

基于xml文件配置,三种方式注入bean属性:

举例:一个java类,有name和type属性

1.正常方式:在一个“value”标签注入值,并附有“property”标签结束。

2.快捷方式:注入值“value”属性。

3."p"模式:通过使用“p”模式作为注入值到一个属性。

并且,

七、类注解的配置方式

在实体类:

@configuration在类前注解:表示是一个配置信息提供类

@Bean(name=“xxx”):定义一个bean

@Value:修饰,设定值

@SuppressWarnings("serial"):实现序列化接口,对实体类进行标注

则实例化Bean,启动IOC容器并装配Bean如下:

ApplicationContext ctx=new AnnotationConfigApplicationContext(Beans.class)


bean实现类:

@Component(基本注解。标注基本类)或其他衍型类,如

@Repository:用于对DAO实现类进行标注:@Repository对应数据访问层Bean

@Repository(value="userDao")注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。


业务层:

@Service:用于对service业务层实现类进行标注,声明spring要创建的bean


控制层:

@Controller:对controller实现类进行标注,说明action的名字

在成员变量或方法入参处标注@Autowird(按类型匹配自动注入),或者配合使用@Qualifer(按名称匹配方式注入)

@Scope注解:@Scope("prototype")表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scope 是单例模式

@RequestMapping:说明action的路径,用于类上或者方法上,在类上可以不用,但在方法上必须使用

@Responsebody 注解:表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。 


另外:@Autowired的用法和作用:它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作

这个注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。

这样你在userService里面要做一个userDao的setter/getter方法。

但如果你用了@Autowired的话,你只需要在UserService的实现类中声明即可。

@Autowired

private IUserDao userdao;

Spring@Autowired注解与自动装配


八、创建bean的三种方式:

1、通过构造器创建bean实例:在<bean.../>元素中添加<constructor-arg.../>子元素,配置构造器参数

2、静态工厂方法创建(P589)

3、实例工厂方法创建(P591)



九、web.xml中配置字符编码过滤器

十、session作用域和request作用域类似:request作用域的bean对于每次http请求有效,而session作用域的Bean则对于每次http session有效

在web.xml中增加Listener配置,程序可以在spring配置文件中使用request/session作用域 scope="request"

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

推荐阅读更多精彩内容