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"