spring框架
什么是spring
Spring是一个开源的框架,Spring是2003年新起的一个轻量级的java开源框架。由 Rod Johnson在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。
框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架,Spring使用基本的JavaBean来完成以前只能由EJB完成的事情,然而,Spring的用途不仅仅限于服务器端的开发,从简单性、可测试性和耦合度的角度而言,任何java应用都可以从Spring中受益,Spring的和核心是控制反转(IOC)和面向切面(AOP)。简单来说,Spring是一个分层的javaSE/JavaEE full-stack(一站式)轻量级的开源框架。
- 轻量级 :与EJB(enterprise javabean ,企业级JavaBean)对比,依赖资源少,销毁的资源少。
- 分层 :一站式,每一层都提供的解决方案
IOC 控制反转
简单来说就是将对象的创建权利和对象的生命周期的管理过程交给了Spring框架来处理,在这个开发过程中不需要再关注对象的创建和生命周期的管理。而是在需要的时候由Spring框架提供,这个由Spring框架管理对象的创建和生命周期的机制称之为控制反转。
其中 ,在创建对象的过程中Spring可以根据配置对象的属性进行设置,这个过程称为依赖注入(DI)
AOP 面向切面编程
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方
式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个
热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑
的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高
了开发的效率。
- Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
- Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
- Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
- Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
- Target(目标对象):织入 Advice 的目标对象.。
- Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程
DI注入
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。
Spring中的注解
@Configuration
该类等价与xml中的配置beans,相当于IOC容器,它的个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean,与xml中得配置bean一样。
@Configuration注解的类必须使用context:component-scanbase-package=”XXX”/扫描。
@Bean
注解在方法上,声明当前方法的返回值为一个Bean。返回的Bean对应的类中可以定义init()方法和destroy()方法,然后在@Bean(initMethod=”init”,destroyMethod=”destroy”)定义,在构造之后执行init,在销毁之前执行destroy。
@Value
为了简化从properties中取配置,可以使用@Value,读取properties文件中的配置。
@Controller、@Service、@Repository、@Component
组合注解(组合了@Component注解),
@Controller 注解应用在MVC层(控制层),DispatcherServlet会自动扫描注解了此注解的类,然后将web请求映射到注解了@RequestMapping的方法上。
@Service 应用在service层(业务逻辑层)
@Repository 应用在dao层(数据访问层)
@Component
表示一个带注释的类是一个组件,成为Spring管理的Bean。当使用基于注解的配置和类路径扫描时,这些类会被视为自动检测的后选对像,同时@Component还是一个元注解。
@Autowired
Spring提供的工具(由Spring的依赖注入工具自动注入),默认先按byType,如果发现找到多个bean,则,又按照byName方式比对,如果还有多个,则报出异常。
@Resource
默认按byName自动注入,如果找不到在按byType,如果还是找不到则抛异常,无论按byName还是byType如果找到多个,则抛异常。
可以手动指定bean,它有2个属性分别是name和type,使用name属性,则使用byName的自动注入,而使用type属性时则使用byType自动注入。
@Transactional
声明事务 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。
@RequestMapping
用来映射web请求(访问路径和参数),可以用在类和方法上,,注解在方法上的@RequestMapping路径会继承注解在类上的路径。同时支持Serlvet的request和response作为参数,也支持对request和response的媒体类型进行配置。其中有value(路径),produces(定义返回的媒体类型和字符集),method(指定请求方式)等属性。
@Response
将返回值放在response体内,返回的是数据而不是页面。
@Request
允许request的参数在request体内,而不是直接接在地址后面。此注解放置在参数前。
@PathVariable
放在参数前,用来接收路径参数。
@RestController
组合注解,组合了@Controller和@ResponseBody,当我们只开发一个和页面交互数据的控制层的时候可以使用此注解。