目录
2.1 IOC: Inverse of Control(控制反转)
2.2 DI: Dependency Injection(依赖注入)
1.Spring简介
Spring框架是Java应用最广泛的框架,它成功的理念就在于IOC(Inversion of Control 控制反转)和AOP(Aspect Oriented Programming 面向切面编程)
1.1 什么是Spring:
1.Spring是一个轻量级的DI/IOC和AOP容器的开源框架
2.Spring提倡"最少侵入"的方式管理应用中的代码 这代表可以随时下载或安装Spring框架
1.2 Spring框架的优势
用两个字来说就是解耦,也可以说是提高代码复用性和方便修改增删功能,降低开发难度
下面来详细说一下Spring框架的优点:
1.低侵入/低耦合:降低组件之间的耦合性,实现各层之间的解耦
2.声明式事务管理:基于切面编程和惯例
3.方便集成其他框架:如Mybatis,Hibernate等
1.3 Spring能帮我们做什么
1.根据配置文件创建及组件对象之间的依赖关系
2.面向切面编程可帮我们无耦合的实现日志记录,统计和安全控制
3.能简化帮我们管理数据库事务
4.提供了第三方数据访问框架的无缝集成,自身提供JDBC模板方便访问数据库
5.提供了第三方Web框架的无缝集成,自身提供SpringMVC框架,方便Web层搭建
6.方便与Java EE整合,与更多技术整合(如:缓存框架)
1.4 Spring核心框架结构图
Spring Core: Spring 的核心容器,它实现了 IOC 模式,提供了 Spring 框架的基本功能。
Spring AOP: 即面向切面编程思想,把 Spring 框架直接与某个功能对接[8]。
Spring DAO: 模式思想将业务逻辑代码与数据库交互代码分离,降低两者耦合
Spring Web: 可以简化 MVC 框架的请求,使开发界面实现数据传输更加流畅。
2. Spring IOC和DI
2.1 IOC: Inverse of Control(控制反转)
1.读作控制反转比较好理解,这不是什么技术,而是一种思想,就是将在程序中手动创建对象的控制权交给Spring框架进行管理
2.正控:如果要使用某个对象,需要自己去创建对象
3.反控:如果要使用某个对象,只需要从Spring容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架
举个栗子:
控制反转是个抽象的概念,下面我们举个栗子来说明一下
在生活中,想要得到一样东西的时候,第一反应就是去找这件东西,比如想喝奶茶,在没有奶茶店的时候,最直接的做法是:养一头奶牛,种茶叶,然后等收获到茶叶和牛奶再去自己煮奶茶(比较夸张,但便于理解).值得注意的是这些都是你自己主动创造的过程,也就是一杯奶茶需要你自己创造
然而现在,由于外卖的盛行,当想要喝奶茶,只要外卖下单,通过电话和地址直接由外卖员送到
这里注意:我们并没有自己主动创造奶茶,奶茶是奶茶店创造的,而不是我们,而且完全能达到我们的要求,甚至比我们创造的还要好很多!所以IOC简单来说就是帮我们管理了创建对象的一系列事情(对象的生命周期)说到这里大家应该理解IOC了叭
总结:
传统方式: 通过new关键字主动创建一个对象
IOC方式: 对象的生命周期由Spring来管理,直接从Spring里获取一个对象,IOC是反转控制,就像控 制权从本来在自己手里,交个了Spring.
2.2 DI: Dependency Injection(依赖注入)
其实DI和IOC是同一个概念不同角度而已DI相对IOC而言,明确描述了"被注入对象依赖IOC容器配置依赖对象".接下来我们分析一下:
理解DI 的关键是:谁依赖谁?为什么要依赖?谁注入谁?注入了什么?
1.谁依赖谁:应该是应用程序依赖于IOC容器
2.为什么要依赖:应用程序需要IOC容器来提供对象需要的外部资源
3.谁注入谁:IOC容器注入应用程序的某个对象应用程序依赖的对象
4.注入了什么:注入某个对象所需要的外部资源(对象,资源,常量数据)
@Autowired注解
说明: 在对象中若需要使用属性注入,一般使用@Autowired注解
功能: 可将Spring容器中的对象自动注入到属性中
注入方式: 1.类型注入(默认): 若注入的属性是接口,则自动注入实现类
2.名称注入(key): 一般不用
重要前提: 若需要依赖注入,则对象必须交给Spring容器管理
3.Spring AOP
AOP(Aspect Oriented Program)面向切面编程,如果说IOC是Spring的核心,那么SpingAOP就是Spring最重要的功能之一了,在数据库事务中SpringAOP被广泛使用.
面向切面编程实际上是一种思想,把功能分为核心业务功能和周边功能
业务核心功能: 如登录,增加数据,删除数据都为业务核心
周边功能: 如性能统计,日志,事务管理等等
3.1 AOP的目的
AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(如事务处理,日志管理,权限控制等)封装起来,便于减少系统代码的冗余,降低模块间的耦合度,并有利于未来的拓展性和可维护性.
3.2 AOP当中的概念
1.切入点(Pointcat):在哪些类哪些方法上切入(什么地方)
2.通知(Advice):在方法执行的时机(方法前/后/前后)做什么(强化的功能)
3.切面(Aspect):切面=切入点+通知 就是:在什么时机,什么地方,做什么增强
4.织入(Weaving):把切面加入到对象,并创建代理对象的过程(有Spring完成)
5.连接点(Joint point):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point
6.目标对象(Target):织入Aspect的目标对象.
我们可以这么理解AOP,首先它不影响主要业务的流程,这里把主要业务看成纵向的,AOP它需要横向注入到代码中,用来解决代码冗余,同时提高了代码的可用性,降低耦合,方便业务的修改
继续举个栗子
比如会员的机制,登录账号时会检测账号和密码和会员的等级,然后进行不同的操作,以下基本逻辑的基本写法
同样有个问题,我虽然不用每次都copy代码了,但是,每个接口总得要调用这个方法,于是就有了切面的概念,我将方法注入到接口调用的某个地方(切点)
这就相当于面向切面的编程,把冗余的代码定义在接口里,然后横向注入到业务中
Spring中的注解
注解 | 解释 | |
Spring | @Autowired | Spring提供的工具(由Spring的依赖注入工具(BeanPostProcessor、BeanFactoryPostProcessor)自动注入。) |
Spring | @Configuration | 声明当前类是一个配置类(相当于一个Spring配置的xml文件) |
Spring | @Bean | 注解在方法上,声明当前方法的返回值为一个Bean。返回的Bean对应的类中可以定义init()方法和destroy()方法,然后在@Bean(initMethod=”init”,destroyMethod=”destroy”)定义,在构造之后执行init,在销毁之前执行destroy。 |
Spring | @Cacheable | 声明数据缓存 |
Spring | @EnableAspectJAutoProxy | 开启Spring对AspectJ的支持 |
Spring | @Value | 值得注入。经常与Sping EL表达式语言一起使用,注入普通字符,系统属性,表达式运算结果,其他Bean的属性,文件内容,网址请求内容,配置文件属性值等等 |
Spring | @PropertySource | 指定文件地址。提供了一种方便的、声明性的机制,用于向Spring的环境添加PropertySource。与@configuration类一起使用。 |
Spring | @PostConstruct | 标注在方法上,该方法在构造函数执行完成之后执行。 |
Spring | @PreDestroy | 标注在方法上,该方法在对象销毁之前执行。 |
Spring | @Profile | 表示当一个或多个指定的文件是活动的时,一个组件是有资格注册的。使用@Profile注解类或者方法,达到在不同情况下选择实例化不同的Bean。@Profile(“dev”)表示为dev时实例化。 |
Spring | @EnableAsync | 开启异步任务支持。注解在配置类上。 |
Spring | @Async | 注解在方法上标示这是一个异步方法,在类上标示这个类所有的方法都是异步方法。 |
Spring | @Conditional | 根据满足某一特定条件创建特定的Bean |
Spring | @Enable* | 通过简单的@Enable*来开启一项功能的支持。所有@Enable*注解都有一个@Import注解,@Import是用来导入配置类的,这也就意味着这些自动开启的实现其实是导入了一些自动配置的Bean(1.直接导入配置类2.依据条件选择配置类3.动态注册配置类) |
Spring | @RunWith | 这个是Junit的注解,springboot集成了junit。一般在测试类里使用:@RunWith(SpringJUnit4ClassRunner.class) — SpringJUnit4ClassRunner在JUnit环境下提供Sprng TestContext Framework的功能 |
Spring | @ContextConfiguration | 用来加载配置ApplicationContext,其中classes属性用来加载配置类:@ContextConfiguration(classes = {TestConfig.class(自定义的一个配置类)}) |
Spring | @ActiveProfiles | 用来声明活动的profile–@ActiveProfiles(“prod”(这个prod定义在配置类中)) |
Spring | @Scheduled | 注解在方法上,声明该方法是计划任务。支持多种类型的计划任务:cron,fixDelay,fixRate |
Spring | @WebAppConfiguration | 一般用在测试上,注解在类上,用来声明加载的ApplicationContext是一个WebApplicationContext。他的属性指定的是Web资源的位置,默认为src/main/webapp,我们可以修改为:@WebAppConfiguration(“src/main/resources”)。 |
Spring | @ImportResource | 虽然Spring提倡零配置,但是还是提供了对xml文件的支持,这个注解就是用来加载xml配置的。例:@ImportResource({“classpath |
SpringAOP | @Aspect | 声明一个切面(就是说这是一个额外功能) |
SpringAOP | @After | 后置建言(advice),在原方法前执行。 |
SpringAOP | @Before | 前置建言(advice),在原方法后执行。 |
SpringAOP | @Around | 环绕建言(advice),在原方法执行前执行,在原方法执行后再执行(@Around可以实现其他两种advice) |
SpringAOP | @PointCut | 声明切点,即定义拦截规则,确定有哪些方法会被切入 |
SpringAOP | @Transactional | 声明事务(一般默认配置即可满足要求,当然也可以自定义) |
以上就是我对Spring框架的理解,希望可以帮助到大家,详细的代码及深入学习后期会发