美文网首页
Spring详解

Spring详解

作者: 取名废同学 | 来源:发表于2018-07-17 15:34 被阅读0次

    一、概述

    (一)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"

    相关文章

      网友评论

          本文标题:Spring详解

          本文链接:https://www.haomeiwen.com/subject/xyrwpftx.html