Spring 个人理解

Spring的IoC能够被分解为两种子类型,分别为依赖查找和依赖注入

依赖注入分为:构造器依赖注入和Setting依赖注入

Spring中当你需要访问对象的集合,可以使用在Bean中注入一个对象的集合,可以选择<List>,<Map>,<Set>,<Props>只允许传入String的值

Spring的实例化模式分为:单列模式和非单利模式,单利模式中的所有Bean默认都是被创建为单例实例,而当要满足每个依赖和每次调用getBean()而创建该bean的实例,实现

这些对你的程序的代码没有任何的侵入,可以选择非单例模式,像创建一个对象需要拥有它私有的状态,或者用于多线程,就可以使用非单例模式。

Spring中的自动装配你的bean,autowire

Spring中bean继承的概念,可以在申明bean的时候添加一个属性parent,用来指向他的父类,此时这个bean默认就包含其父类的某些属性值。

Spring中标签bean中的init-method和类中实现InitializingBean接口的用处差不多,都是实现对某个bean的初始化调用。与之对应的destroy-method和destroy()则是在bean销毁

时执行某一方法。

BeanFactory的destroySingletons方法和多线程的使用

BeanNameAware同于获取当前这个bean的beanName,BeanFactoryAware接口使你的bean可以取得配置他们的BeanFactory的引用,这个类的主要为了让bean可以通过

getBean()以编程方式访问其他bean。

Lookup Method injection(查找方法注入),即需要处理两个生命周期不同的bean时,当bean具有相同的生命周期,特别是他们都是singleton时,不要使用查找方法注入。

Method Replacement(方法替换),使用<replace-method>标签

PropertyEditorBean有七个属性,每个属性对应一种内建的PropertyEditor,ByteArrayPropertyEditor, ClassEdit, FileEdit,LocalEditor, PropertiesEditor,

StringArrayPropertyEditor, URLEditor,我们也可以自定义一个PropertyEditor

ApplicationContext是对BeanFactory的扩展,ApplicationContext的三种实现是FileSystemXmlApplicationContext可以载入位于文件系统的任何一处的配置文件,使用

ClassPathXmlApplicationContext可以载入位于classpath里的配置,如果打算把配置文件和一组类打包成一个Jar文件,这个类就派上用场,XmlWebApplicationContext仅供

web应用环境中使用,借助ContextLoaderListener或ContextLoaderServlet,针对web应用你可以自己加载ApplicationContext配置,

bean实现BeanFactoryAware接口之后就能取得BeanFactory的引用,只要实现ApplicationContextAware,bean就能取得ApplicationContext的引用。

bean标签中的lazy-init属性设为false,就等于是告知ApplicationContext,你打算预先创建好这个bean

利用MessageSource实现国际化,Spring中的Resources访问资源,ctx.getResource(http://或file:///而classpath:协议为spring专有,表示ResourceLoader在classpath下找

资源)。通常建议使用getInputStream()方法。

Spring的AOP面向切面的编程,分为静态和动态横切,前者在编译时加入到程序中去,如果要修改横切,就必须修改代码重新编译,在动态AOP,横切是在运行时动态加入到

程序中的,这样,我们就无需重新编译代码就可以修改横切的使用,Spring的AOP只实现了AspectJ的部分功能。AOP代理分为JDK动态代理和CGLIB代理

Spring Aop核心概念:

联接点(Jointpoint) 一个典型的联接点是方法调用   

通知(Advice)   在某个特定的联接点处运行的代码称为"通知"

切入点(Pointcut)  一个典型的切入点就是对某一个类的所有方法调用的集合,通常会通过组建复杂的切入点来控制通知什么时候被执行,

方面(Aspect) 通知和切入点的组合叫做方面,方面定义了一段程序中应该包括的逻辑,以及何时应该执行该逻辑

织入(Target) 如果一个对象的执行过程受到某个AOP的修改,那么他就叫做一个目标对象,目标对象也常称为被通知对象。

引入(Introduction) 通过引入,我们可以在一个对象中加入新的方法和属性,以改变他的结构,这样即使该对象没有实现某一个接口,我们也可以修改它,使之实现该接口。

AOP里的唯一限制是不能通知final类,因为final类不能被扩展,所以无法生成他的代理。

Spring五种通知:前置通知(获取该方法,以及对该方法的参数进行操作,不能影响方法本身),后置通知(可以访问调用的目标方法,以及该方法参数和返回值),

包围通知(这个时候我们甚至可以另写自己的逻辑而完全不调用目标方法),抛出通知(只有在目标方法异常或者特定的异常时,才会执行,我们可以访问抛出异常的方法,目标方

法以及参数),引入(spring将引入看成一个特殊的拦截器,使用它可以定义通知引入的方法的实现)

前置通知可以用来检测用户是否登入,如果没有登入则可以抛出异常,不执行后面的联接点的方法。

后置通知,不能修改目标方法的返回值,但是可以抛出异常,这样调用方只能看到异常,而看不到返回值,使用时当返回的数值不是你想要的就可以抛出一个异常信息

包围通知,功能上和前置通知加后置通知类似,除了一个区别,就是可以修改返回值,可以阻止目标方法执行,可以将目标方法完全换成新的代码,包围通知其实就是模仿

MethodInterceptor接口的拦截器,

抛出通知,

Spring里的通知者和切入点

ProxyFactory.advice()方法为代理设定通知,该方法会在后台委派给addAdvisor()方法,而后者创建一个DefaultPointcutAdvisor实例并将切入点设为"所有方法调用",这样目标

的所有方法都会被通知了,例如用AOP做日志时这样做就是我们需要的,如果某个通知只适用于特定的也就是目标亲和度很高,此时就要在通知中写入一些检查,而那种

亲和度很低的类型我们应该使用切入点。

切入点接口pointcut中定义了两个方法,getClassFilter(获得类过滤器)和getMethodMather(获得方法匹配器),如果要自定义一个切入点的话,就需要实现一个ClassFilter接口

和一个MethodMather接口,一般不需要这样做,因为spring提供了一些Pointcut的实现,已有的切入点实现包括:

ComposablePointcut 可组合切入点

ControlFlowPointcut 流程切入点,匹配一个类的某一个方法下或者所有方法下发生的全部方法调用

DynamicMethodMatcherPointcut动态方法匹配切入点

JdkRegexpMethodPointcut JDK正则表达式切入点

NameMatchMethodPointcut 名称匹配器方法切入点

Per15RegexpMethodPointcut Perl 5 正则表达式切入点

StaticMethodMatherPointcut 静态方法匹配器切入点

DefaultPointcutAdvisor是PointcutAdvisor接口的一个实现(一共四个),DefaultPointcutAdvisor用来结合一个Pointcut和一个Advice通知的一个简单的PointcutAdvisor

切入点的两种方法,一种就是分开创建切入点和通知者,随后用DefaultPointcutAdvisor把通知和切入点加到代理里去。另一种是将pointcut封装到我们自己的Advisor

实现中,这个类既实现Pointcut又实现了PointcutAdvisor,而PointcutAdvisor.getPointcut()方法简单的返回this,例如StaticMethodMatcherPointcutAdvisor

Spring之引入的概念:使用引入可以动态的在现有对象中加入新的功能,例如在现有对象上引入任何接口的实现,Spring文档中列举了两个不那么典型的引入用法:

锁定对象和篡改检测

锁定对象:我们创建一个接口,它定义了锁定和解锁对象要用的方法,这样它的内部状态就不能修改了,如果实现此接口,那么会产生很多的重复代码,那么实现重构

一个抽象基类,那么就会用掉唯一的一次继承的机会,此时我们可以定义一个类来实现这个接口,由于引入不过是方法拦截器的一个引申而已,所以他能拦截目标对象上

的任何方法,随之可以在任何对setter方法的调用前检查锁定状态。

引入只能用在类这一等级上,所以使用引入不能使用切入点,引入是为类增加新的接口实现,而切入点定义一个通知涉及的哪些方法,创建引入需要实现IntroductionInterceptor

,他实现了MethodInterceptor接口,这个接口有一个invoke()方法,这个方法我们提供引入接口的实现,还有就是DelegatingIntroductionInterceptor.。

我们往往创建一个DefaultIntroductionAdvisor的子类负责新建引入通知。

篡改检测:用户检查一个对象是否被修改,如果没有则完全没有必要向数据库发出一个update指令,减轻数据库的负荷。实例:

1.定义一个接口, 2 创建一个类实现这个接口并且继承DelegatingIntroductionInterceptor,重写invoke方法判断对象是否被修改,方法最后一定要调用super.invoke(),

3.创建通知者,定义一个类继承DefaultIntroductionAdvisor,接着创建步骤2的一个实例,4.创建一个普通的bean用于测试,5 进行测试篡改检测代码。

引入允许我们动态的扩展对象实现的接口集。

ProxyFactoryBean,它实现了FactoryBean,Proxy是声明性的设置AOP的核心类,他可以设置目标Bean,同时也提供了一组通知和通知者,所有这些最终组成一个AOP

代理,ProxyFactoryBean实现引入,为自己的混入体自定义一个Advisor类,类似之前的IsModifiedMixin引入配置的一个例子。

自动代理:包括三种,

BeanNameAutoProxyCreateor,名称自动代理生成器,该类允许我们指明一组bean的名称以及实施在他们上的一组通知和通知者,Spring会自动用指定的通知代理这些bean,可

以对bean使用通配符,这样就能匹配有命名规则的bean了

DefaultAdvisorAutoProxyCreateor,他自动用所有可行的通知者代理ApplicationContext中的所有bean。

AspectJ与Spring衔接:使用Spring来配置AspectJ方面,使用Spring的ApplicationContext方法一致的处理Spring管理bean和AspectJ方面。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值