浅入浅出系列——Spring

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。

bean的生命周期

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值