ioc和AOP以及spring框架

1.ioc
Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

2.谁控制谁
传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而ioc是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是ioc容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)

ioc和AOP以及spring框架_第1张图片

3.为什么是反转?
有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;

4.ioc能做什么
1.ioc不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了ioc容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

 2.其实ioc对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在ioc/DI思想中,应用程序就变成被动的了,被动的等待ioc容器来创建并注入它所需要的资源了。

3.ioc很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。
1.什么是DI
DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。是某个容器管理对象依赖于ioc容器;“被注入对象的对象”依赖于“依赖对象”容器管理对象需要ioc容器来提供对象需要的外部资源;是ioc容器注入某个对象,也就是注入“依赖对象”是注入某个对象所需要的外部资源(包括对象、资源、常量数据)

依赖注入的三种实现方式

构造器注入,Setter方法注入,接口注入

构造器注入

Controller
public class FooController {
  
  private final FooService fooService;
  
  @Autowired
  public FooController(FooService fooService) {
      this.fooService = fooService;
  }
 
}

接口注入

public class ClassA {
private InterfaceB zzz;
public void doSomething() {
Ojbect obj=Class.forName(Config.BImplementation).newInstance();
zzz= (InterfaceB)obj;
zzz.doIt()
}

}

setter注入

@Controller
public class FooController {
  
  private FooService fooService;
  @Autowired
  public void setFooService(FooService fooService) {
      this.fooService = fooService;
  }
}

IOC和DI的关系

它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,依赖注入明确描述了被注入对象依赖IOC容器配置依赖对象

什么是AOP

ioc和AOP以及spring框架_第2张图片

在软件业,AOP为Aspect   Oriented    Programming的缩写,意味:面向切面编程.通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,AOP是OOP的延续.将一些共性的内容进行抽取,在需要用到的地方,以动态代理的方式进行插入.在不修       改源码的基础上,还能对源码进行前后增强。

4.实现原理:动态代理
1.代理模式的定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

2.代理模式包含如下角色:

subject:抽象主题角色,是一个接口。该接口是对象和它的代理共用的接口;
RealSubject:真实主题角色,是实现抽象主题接口的类;
Proxy:代理角色,内部含有对真实对象RealSubject的引用,从而可以操作真实对象。

3.静态代理

静态代理的的代理类是我们自己定义好的,在程序运行之前就已经编译完成

4.动态代理

动态代理的代理类是在程序运行时创建的,相比于静态代理,动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。

来让我们看一下上面的一个小故事和 AOP 到底有什么对应关系.
首先我们知道, 在 Spring AOP 中 Joint point 指代的是所有方法的执行点, 而 point cut 是一个描述信息, 它修饰的是 Joint point, 通过 point cut, 我们就可以确定哪些 Joint point 可以被织入 Advice. 对应到我们在上面举的例子, 我们可以做一个简单的类比, Joint point 就相当于 爪哇的小县城里的百姓,pointcut 就相当于 老王所做的指控, 即凶手是个男性, 身高约七尺五寸, 而 Advice 则是施加在符合老王所描述的嫌疑人的动作: 抓过来审问.

Joint point : 爪哇的小县城里的百姓: 因为根据定义, Joint point 是所有可能被织入 Advice 的候选的点, 在 Spring AOP中, 则可以认为所有方法执行点都是 Joint point. 而在我们上面的例子中, 命案发生在小县城中, 按理说在此县城中的所有人都有可能是嫌疑人.

Pointcut :男性, 身高约七尺五寸: 我们知道, 所有的方法(joint point) 都可以织入 Advice, 但是我们并不希望在所有方法上都织入 Advice, 而 Pointcut 的作用就是提供一组规则来匹配joinpoint, 给满足规则的 joinpoint 添加 Advice. 同理, 对于县令来说, 他再昏庸, 也知道不能把县城中的所有百姓都抓起来审问, 而是根据凶手是个男性, 身高约七尺五寸, 把符合条件的人抓起来. 在这里 凶手是个男性, 身高约七尺五寸 就是一个修饰谓语, 它限定了凶手的范围, 满足此修饰规则的百姓都是嫌疑人, 都需要抓起来审问.
spring框架

1.什么是Spring框架
spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,是一个分层的javaEE一站式轻量级开源框架

2.Spring的作用
方便解耦,简化开发,AOP编程支持,声明式事务支持,集成Junit更加方便的进行分层测试,方便集成各种优

3.核心

1、IOC(Inversion of Control):控制反转,即对象创建的问题

2、AOP(Aspect Oriented Programming):面向切面编程

spring优点

1.低侵入式设计,代码污染极低
2.独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的
承诺
3.Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦
4.Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好
的复用
5.Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问
6.Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部 

Spring注解配置


注解配置 创建对象配置

@Component

作用:用于把当前对象存入Spring 容器中
属性:value==>用于指定 bean 的 id,当不写时,默认为当前类名,首写字母改为小写
@Controller、@Service、@Repository这三个注解的作用和@Component注解是一样的,他们是Spring框架为我们提供明确的三层使用注解,使三层对象更加清晰

@Controller:一般用于表现层 @Service:一般用于业务层 @Repository:一般用于持久层

注入数据注解

@Resource

作用:直接按照 bean 的 id 注入,可以独立使用  属性:name==>用于指定 bean 的 id
@Configuration

作用:指定当前类是一个配置类 位置:在配置类的的上方
@ComponentScan  作用:用于指定通过注解指定Spring在创建容器时要扫描的包
属性:value 和 basePackages,这两个的作用是一样的,都是用于指定创建容器要扫描的包
位置:在配置类的上方
Bean作用:用于把当前方法的返回值作为bean对象存入Spring的IOC容器中
属性:name ==> 用于指定 bean的 id,当不写时,默认当前方法的名称
位置:在方法的上方
 



 

你可能感兴趣的:(spring,java,spring,boot)