Spring

Posted ansoncong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring相关的知识,希望对你有一定的参考价值。

1. Spring的概述

Spring是分层的、JavaSE/EE一站式(full-stack)、轻量级开源框架。

  1.1 JavaEE分层

    JavaEE规范的三层结构体系:

表现层(页面数据显示、页面跳转调度),例如jsp/servlet

业务层(业务处理和功能逻辑、事务控制),例如service

持久层(数据存取和封装、和数据库打交道),例如dao

  1.2 一站式

Spring提供了JavaEE各层的解决方案:

表现层:struts1、struts2、Spring MVC

业务层:Ioc、AOP、事务控制

持久层:JdbcTemplate、HibernateTemplate、ORM框架(对象关系映射)整合

  1.3 轻量级 

Spring的出现取代了EJB的臃肿、低效、繁琐复杂、脱离现实的情况. 而且使用spring编程是非侵入式的。

 

2. Spring的体系结构

pring框架是一个分层架构,它包含一系列的功能要素并被分为大约20个模块。这些模块分为Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation和测试部分,如图:

技术分享图片

这里简单的说一下core container 模块:

1:Core和Beans模块提供了Spring最基础的功能,提供IoC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。

2:Context模块基于Core和Beans来构建,它提供了用一种框架风格的方式来访问对象,有些像JNDI注册表。Context封装包继承了beans包的功能,还增加了国际化(I18N),事件传播,资源装载,以及透明创建上下文,例如通过servlet容器,以及对大量JavaEE特性的支持,如EJB、JMX。核心接口是ApplicationContext。

3:Expression Language,表达式语言模块,提供了在运行期间查询和操作对象图的强大能力。支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从Spring 容器获取Bean,它也支持列表投影、选择和一般的列表聚合等。

其他的比如 Web模块主要是对表现层的一些框架或者技术的集成,而Test模块则提供对使用JUnit和TestNG来测试Spring组件的支持。

 

3. Spring的核心

Spring用的最多或者最核心的概念就是:

IoC(Inverse of Control 控制反转): 将对象创建权利交给Spring工厂进行管理。 

AOP(Aspect Oriented Programming 面向切面编程),基于动态代理的功能增强方式。

 

  3.1 IoC控制反转

简单的说就是引入工厂(第三者),将原来在程序中手动创建管理的依赖的对象,交给工厂来创建管理。很早以前流行的是配置xml文件,所以IoC底层就是:工厂(设计模式)+反射(机制) + 配置文件/注解。(现在基本都用注解注入Spring,xml配置文件的方式不在再总结)。

开启注解和注解bean的扫描需要在Spring核心配置文件 applicaContext.xml中配置:

<!-- 开启spring的注解功能 :让注解有效了,识别注解。可以省略,因为下面的扫描包的配置包含开启注解功能-->
<context:annotation-config/> <!-- 配置注解扫描 context:component-scan:专门扫描含有@Component注解的类,自动将其作为bean base-package:要扫描包的路径,包含子包,表示子包下的所有类定义注解都有效 注解扫描配置的时候,会自动开启注解功能 --> <context:component-scan base-package="com.xxx.spring"/>

几个比较常用的注解:

@Service用于标注业务层组件、(如Service层)

@Controller用于标注控制层组件(如struts中的action层)

@Repository用于标注数据访问组件,(如DAO层组件)。

而@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

  3.2 依赖注入DI

Dependency Injection 依赖注入,简单的说,可以将另外一个bean对象动态的注入到另外一个bean中。

简单的依赖注入,我们可以通过@Value注解来实现。

@Value("Rose")//参数的值简单类型
    private String name="Jack";

或者结合SpEL

@Value("#{server.port}")
    private String port;

复杂的依赖注入,我们可以通过@Autowired 、

@Autowired//默认按照类型注入
    private CustomerDao customerDao;

单独使用@Autowired ,表示按照类型注入,会到spring容器中查找CustomerDao的类型。

@Autowired
public void aaa(CustomerDao customerDao){
    this.customerDao = customerDao;            
}

也可以用在方法上通过形参注入。

  3.3 其他的一些注解

使用 @PostConstruct 注解, 标明初始化方法 ---相当于 init-method 指定初始化方法

使用 @PreDestroy 注解, 标明销毁方法  ----相当于 destroy-method 指定对象销毁方法

如果要执行对象的销毁方法,

         条件一: 单例Bean (在容器close时,单例Bean才会执行销毁方法 )

         条件二: 必须调用容器 close 方法

使用 @Scope注解,指定Bean的作用域(默认是 singleton 单例)

@Scope("prototype")//默认是单例(singleton),更改为多例(prototype)
public class Abc{

}

 

 

 


以上是关于Spring的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot:thymeleaf 没有正确渲染片段

What's the difference between @Component, @Repository & @Service annotations in Spring?(代码片段

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

Spring Rest 文档。片段生成时 UTF-8 中间字节无效 [重复]

解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE(转)(代码片段

一张图帮你记忆,Spring Boot 应用在启动阶段执行代码的几种方式