Spring框架(浅谈)

目录

1.Spring简介

1.1 什么是Spring:

1.2 Spring框架的优势

1.3 Spring能帮我们做什么

1.4 Spring核心框架结构图

2. Spring IOC和DI        

2.1 IOC: Inverse of Control(控制反转)

2.2  DI: Dependency Injection(依赖注入)

3.Spring AOP

3.1 AOP的目的

3.2 AOP当中的概念

Spring中的注解


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@AutowiredSpring提供的工具(由Spring的依赖注入工具(BeanPostProcessorBeanFactoryPostProcessor)自动注入。)
Spring@Configuration声明当前类是一个配置类(相当于一个Spring配置的xml文件)
Spring@Bean注解在方法上,声明当前方法的返回值为一个Bean。返回的Bean对应的类中可以定义init()方法和destroy()方法,然后在@Bean(initMethod=”init”,destroyMethod=”destroy”)定义,在构造之后执行init,在销毁之前执行destroy
Spring@Cacheable声明数据缓存
Spring@EnableAspectJAutoProxy开启SpringAspectJ的支持
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) — SpringJUnit4ClassRunnerJUnit环境下提供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框架的理解,希望可以帮助到大家,详细的代码及深入学习后期会发

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猿学码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值