目录
spring框架概述
spring介绍
spring是分层的一站式的轻量级应用框架,以控制反转(IOC)和面向切面编程(AOP)为内核。提供了Spring MVC、Spring JDBC以及业务层事物管理等众多的企业应用技术。
spring优点
- 方便解耦,简化开发
通过Spring提供的IOC容器,可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度耦合 - AOP编程支持
通过spring提供的AOP功能,用户可以方便的进行面向切面编程,完成一些对象实现非常复杂的功能 - 申明式事物支持
通过spring的声明式事物灵活地进行事物管理,提高开发效率和质量 - 方便的程序测试
可以用非容器依赖的编程方式进行几乎所有的测试工作。 - 方便集成各种优秀的框架
Spring不排斥各种优秀的框架,并提供对各种游戏框架的支持 - 降低Java EE API的使用难度
Spring为很多难用的java EE API(如JDBC、Java Mali、远程调用)提供了一个简单的封装,通过Spring的简单封装,大大降低了这些JavaEE API的使用难度
spring体系结构
spring由很多模块组成,IOC、AOP、测试框架、web及远程操作、数据访问和集成。
spring—控制反转(IOC)
控制反转概念
应用本身不负责依赖对象的创建以及维护,依赖对象的创建和维护是由外部容器负责。这样控制权就由应用转移到了外部容器。控制权的转移就是所谓的反转。控制权转移带来的好处就是降低了业务对象之间的依赖程度
控制反转实现方式
ioc的重点是在系统运行中,动态的向某个对象提供它所需要的其他对象,实现方式有两种:依赖注入(DI)和依赖查找(DL),spring中的核心机制就是依赖注入(DI)
依赖注入(DI)
组装对象的一种方式,容器全权负责组件的装备,对象无需知道依赖来自何处或者依赖的实现方式。依赖对象通常只能通过接口了解所注入的对象,降低耦合度。
注入方式:
1、构造器注入
@Controller
public class TestController {
private final TestService testService;
//构造器注入:将注入对象,以参数的方式传入构造器中。
@Autowired
public FooController(TestService testService) {
this.testService= testService;
}
//简单的使用方式 ,
public List<Test> listTest() {
return testService.list();
}
}
2、属性注入
@Controller
public class TestController {
@Autowired
private final TestService testService;
//使用方式同上
}
3、setter方法注入
@Controller
public class TestController {
privateTestService testService;
@Autowired
public void setTestService(TestService testService){
this.testService= testService;
}
}
最常见的注入方式是属性注入。使用方便快捷,但是spring推荐的使用方式是构造器注入。
构造器注入的优点:
1、保证依赖不可变(final关键字)
2、保证依赖不为空(构造器传入参数)
3、保证调用者可以获得完全实例化的依赖对象
4、避免了循环依赖(容器启动时,就会提示产生了循环依赖)
依赖查找(DL)
组装对象通过容器的API来查找依赖,这种方式虽然也降低了对象间的依赖,但也使用了容器的API,导致我们无法在容器以外使用对象。
详细介绍:https://blog.csdn.net/beijiguangyong/article/details/43347351
循环依赖
循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错。
一般情况下有三种情况会发生循环依赖的情况:构造器的循环依赖、单例模式下的setter循环依赖、非单例循环依赖。
1、构造器的循环依赖
在容器启动时,就会产生异常提示我们产生了循环依赖。
解决办法:把对象实例化的时机交给pring去判断,也就是使用属性注入的方式。
2、单例模式下的setter循环依赖
这种情况下的循环依赖spring已经替我们解决了。
解决办法:spring有一个三级缓存,在第一步对象创建完成后,就会将自己暴露在缓冲中。当需要对象进行依赖时,就直接在缓存里面获取。
3、非单例循环依赖
对于多例作用域bean, Spring 容器无法完成依赖注入,因为Spring 容器不进行缓存多例作用域的bean ,因此无法提前暴露一个创建中的bean 。
spring—Beans
Spring beans是被spring管理的java对象。被spring ioc容器初始化,装配以及管理。
装载方式
注解方式进行装载,@Component, @Controller, @Repository, @Service等方式
@Component:通用的注解,可标注任意类为 Spring 组件。
@Controller:这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中。
@Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图。
@Repository:这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处,未经检查的异常可以转换为 Spring DataAccessException。
bean作用域
ico容器中的bean有五种,其中单例(singleton )和原型(prototype)比较常见,另外三种和http请求有关,分别是request、session、global-session。