文档章节

NOTE:Spring

猪刚烈
 猪刚烈
发布于 2014/10/12 11:48
字数 3836
阅读 12
收藏 0
点赞 0
评论 0

 

2007-6-15

____________________________________________________________________________________

 

1.spring容器

  spring容器就是IoC容器,用来实现反转控制的spring组件.spring中提供了两种IoC容器:BeanFactoryApplicationContext

ApplicationContextBeanFactory的一个子接口,它继承了BeanFactory接口,并提供一些更为强大的功能.通常情况下,建议使用

ApplicationContext.

  ApplicationContext还有一个独特的能力:预加载单态类.BeanFactory中所有的类都是延迟加载(lazy load)

 

2.spring,如果一个对象的字段是map类型,那么这里会一个小小的约束:那是在对该map进行配线时,它的key只能是string类型

 

2007-6-18

____________________________________________________________________________________

 

1.关于setter注入和constructor注入

两种注入方法各有用特点,应该根据实际情况选择使用那一种注入方法。

一般来说:constructor注入用于注入那些不易变的类属性:比如一个DAOconstructor注入只会执行一次,一旦注入将不再改变

而且构造函数并不多时。另个构造函数注入将使得类不易被继承,因为其子类在继承它时必须使用其父类的构造方法。

setter注入更加灵活,可以用来注入那些常常变动的(mutable)属性,但是这也可能导致一个属性被多次反复注入同一值的问题.

总之如何在setter注入和constructor注入选择要根据实际情况来确定.

 

2007-6-20

__________________________________________________________________________________________-

 

1.Most aspects are a combination of advice that defines the

aspect’s behavior and a pointcut defining where the aspect should be executed.

Spring recognizes this and offers advisors, which combine advice and pointcuts

into one object. More specifically, the PointcutAdvisor does this.

public interface PointcutAdvisor {

Pointcut getPointcut();

Advice getAdvice();

}

 

2.Spring使用术语advisor来 表示代表方面的对象,它包含一个通知和一个指定特定连接点的切入点。

Spring中,一个advisor就是一个aspect的完整的模块化表示。一般地,一个advisor包括通知和切入点。

org.springframework.aop.support.DefaultPointcutAdvisor 是最通用的advisor类它可以和MethodInterceptor BeforeAdvice或者ThrowsAdvice一起使 用

 

查看springaopalliance包可以看到:interceptor继承自advice说明:拦截器也是一种通知.

就像AfterReturningAdvice,MethodBeforeAdvice一样.

 

3.AOP适用范围

我们说AOP适用于具有[横切]性质的系统级服务.比如:权限验证,事务处理,日志书写或审计等工作.这些工作的特点就是

在业务逻辑层,我们执行很多操作都会涉及到这些操作,比如要执行某个操作,你必须先要确定当前用户是否具有执行该操作

的权限,同时,这个操作应该做为一个事务进行事务的声明和最后的提交,然后,你还得把相关的日志记录下来,我们,几乎

日绝大多数的操作都需要这些操作,那么这就是它们的所谓"横切"特性的由来(这是相对于系统层次结构的"纵切"特性而言的)

AOP中,我们把分散于程序各个部分,解决同样问题的代码片段,称为问题的切面(或方面)

 

2007-6-21

______________________________________________________________________________________________

 

1.关于spring2.0 AOP的配置问题:

spring2.0:AOP的配置提供了三种方法:一种是在spring1.2之前就使用的唯一一种配制方式,使用spring提供的

AOP特定API,并使用java的代理机制实现运行时织入一种方式,这种方式无论是是从理解上还是从使用上都很复杂和繁琐,

而它的一个最大的问题在它将依赖于springAPI.

第二种方法是使用:JAVA5注解完成(需要JAVA5AspactJ的支持)

第三种方法是使用基于Schema的配置文件配置Spring AOP(需要).

以方法二和三都需要使用到AspectJaspectjweaver.jar来帮助解析切入点相关表达式.但是它们最大的优势在于不涉及

任何springAPI.

 

目前我个人倾向于使用第三种方法,对于基于Schema的配置文件配置Spring AOP需要注意的几点包括:

1.要在配制文件的Beans标签中加入对AOP标签的支持即加入如下语句:

xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"

 

2.使用AspectJ的切入点表达式来描述切入点,通过的格式如下:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)

有“?”号的部分表示可省略的,modifers-pattern表示修饰符如publicprotected等,ret-type-pattern表示方法返回类型,declaring-type-pattern代表特定的类,name-pattern代表方法名称,param-pattern表示参数,throws-pattern表示抛出的异常。在切入点表达式中,可以使用*来代表任意字符,用..来表示任意个参数。

比如前面的示例中,execution(* springroad.demo.chap5.exampleB.Component.business*(..))就是一个基于AspectJ的切入点表达式。匹配springroad.demo.chap5.exampleB.Component类中以business开头,返回值为任意类型的方法。

 

修正一下:刚才看到spring2.0的手册,里面对第二种和第三种AOP声明风格做了详细比较,最后的结论是:@AspactJ风格的声明具有更大的优势,

并建议使用此方式!

 

2007-7-3

____________________________________________________________________________________________________________________

 

1.区分BeanFactoryFactoryBean

BeanFactory就不用多说了,但是这个FactoryBean就很有意思了.

spring中一共有两种bean:普通的bean和工厂bean(也就是FactoryBean,用来生产beanbean.)

FactoryBean是一个接口,它主要有三个方法:getObject(),getObjectType(),isSinglet()

要特别说明的是当我们使用BeanFactory来获得一个FactoryBean时有两种情况:

首先假设我们有一个FactoryBean名为地Fb,这个Bean专门用来得到一种Bean,这里假设是Date类型对象吧

现在如果我们使用BeanFactorygetBean("fb");那么我们得到的是一个表示当前时间的Date对象

而如果我们这样使用getBean("&fb"),那么我们得到才是一个Fb.

 

2007-7-4

_____________________________________________________________________________________________________________________

 

1.今天突然间想起了使用Srping API进行AOP配置中关于那段配置代理后,在程序中使用ApplicationContext获取需要加入切面的对象的

一段代码.就是下面的一段:

 

<beans>

<bean id="targetBean"

class="springroad.demo.chap5.exampleB.ComponentImpl">

</bean>

<bean id="adviceBean"

class="springroad.demo.chap5.exampleB.AdviceBean">

</bean>

<bean id="pointcutBean"

class="org.springframework.aop.support.NameMatchMethodPointcut">

<property name="mappedName" value="business*"></property>

</bean>

<bean id="aspectBean"

class="org.springframework.aop.support.DefaultPointcutAdvisor">

<property name="advice" ref="adviceBean"></property>

<property name="pointcut" ref="pointcutBean"></property>

</bean>

<bean id="component"

class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="target" ref="targetBean"></property>

<property name="interceptorNames">

<list>

<value>aspectBean</value>

</list>

</property>

</bean>

</beans>

 

具体得到一个已经做好代理的目标对象的方法是:

ApplicationContext context=new org.springframework.context.support.ClassPathXmlApplicationContext("*.xml");

Component component=(Component)context.getBean("component");

 

我之前的疑问是context.getBean得到的分明是一个ProxyFactoryBean类型,它怎么能转换成Component类型呢?

想到昨天讲到的FactoryBean我终于明白了这其中的道理:就像昨天说的一样,由于component是一个ProxyFactoryBean类型

所以当我们使用context.getBean("component")时得到的是又调用了componentgetObject()方法而得到的它的代理对象,

并不是component代理本身,只有我们这样写context.getBean("&component"),得到的才是一个ProxyFactoryBean类型的对象.

 

23/06/2008

_____________________________________________________________________________________

 

1.关于@Autowired@Resource :

If you intend to express annotation-driven injection by name, do not primarily use @Autowired -

even if is technically capable of referring to a bean name through @Qualifier values. Instead,

prefer the JSR-250 @Resource annotation which is semantically defined to identify a specific target

component by its unique name, with the declared type being irrelevant for the matching process.

As a specific consequence of this semantic difference, beans which are themselves defined as a

collection or map type cannot be injected via @Autowired since type matching is not properly

注意:@Autowired是基于类型进行匹配的,虽然通过@Qualifier也是可匹配到具体的某个bean,但是这不是合理的使用方法,如果想基于名称进行查找,从而精确匹配到某个bean,应使用@Resource      

applicable to them. Use @Resource for such beans, referring to the specific collection/map bean by

unique name.

再补充一点:@Qualifier要配合@Autowired使用,虽然能过给@Qualifier设置beanID,可能保证按名称进行配线,但是这是不是@Qualifier设计意图。@Qualifier依然是基于类型进行匹配的,它的作用是通过添加限定条件来缩小@Autowired匹配的范围!

 

2.关于Joinpoint Pointcut

初接触AOP时,往往搞不懂这两个概念,一旦明白了才发现真是很简单的概念。

首先看Pointcut,其时这一个再简单不过的概念了,只是名子“古怪”,让人搞不明白。其时Pointcut就是指那些程序进行过程中的一些“点”或者说“时刻”,比如说一个方法的执行,一个字段改变(在Spring中,PointCut只能是一个方法的执行,也就是说Spring只能拦截方法的调用。)。这些点跟AOP没什么关系,但是从AOP的角度去观察,这些“点”却是可以被“拦截”的对象!而在一个程序里joinpoint到处都是,要拦截那些joinpoint就是Pointcut的工作了。简言之,Pointcut就是一组joinpoint的集合。因此说pointcutjoinpoint之间是一对多的关系。

 

24/06/2008

  

1.关于@Qualifierfallback规则。

@Qualifier用于同@AutoWire配合缩小基于类型匹配时的获选范围。如果IOC中没有声明@Quaulifier指定的限定符时,Spring会回退到将beanID作为限定符进行匹配。记住,如果此时再匹配不到,Spring是不会回退到基于类型的匹配上(这个@Quaulifier的初衷已经背道而驰了!)此是会抛出异常!@Resource才是先基于名称进行匹配,如果没有才回退到基于类型上来。

 

26/06/2008

  

 

Spring包结构以及各个包之间引用关系说明关键字:    Spring     Spring 包结构说明:spring.jar

--------------------------------------------------------------------------------

包含有完整发布的单个jar包。他包含有除spring-mock.jar之外的所有jar。原因是,spring-mock.jar只有在开发环境中才会用到,而且仅仅是作为一个辅助测试类存在。除了spring.jarspring还包括13个独立的jar文件,他们各自包含这spring各自的组件。所以,如果你可以明确知道使用spring的哪些资源文件时,就没必要去直接引入spring.jar,但有时候spring.jar的引入也是最偷懒和最直接的方式。spring-core.jar

--------------------------------------------------------------------------------

这个jar包含spring框架基本的核心工具类,spring其他组件都要使用到这个包里的类。是其他组件的基本核心。spring-beans.jar

--------------------------------------------------------------------------------

这个jar是所有应用都要用到的,他包含访问配置文件,创建和管理bean以及进行Inversion of Control / Dependency InjectionIoC/DI)操作相关的所有类如果应用只需基本的IoC/DI支持,引入spring-core.jarspring-beans.jar就已经足够了。spring-aop.jar

--------------------------------------------------------------------------------

包含一些使用AOP特性时需要用到的一些类。在使用spring AOP特性如Declarative Transaction Management(事务管理)就需要用到这个jar文件。

spring-context.jar

--------------------------------------------------------------------------------

这个jar文件为spring提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类。JNDI所需的全部类,用来跟模板引擎集成(VelocityFreeMarkerJasperReports)的类,以及校验相关类。

spring-dao.jar

--------------------------------------------------------------------------------

包含Spring DAOSpring Transaction进行数据访问的所有类,为了使用声明性事务支持还需要在自己的应用里包含spring-aop.jarspring-hibernate.jar

--------------------------------------------------------------------------------

是对Hibernate支持的所有类。

spring-orm.jar

--------------------------------------------------------------------------------

jarspring DAO特性集合进行了扩展,使其支持iBATISJDOOJBTopLink,由于springhibernate独立成包了,因此在这里没有在支持hibernate。这个文件里大部分的类都依赖spring-dao.jar中的类。spring-remoting.jar

--------------------------------------------------------------------------------

这个包提供对EJBJMS以及远程调用(RMIHessianBurlapHttp Invoker JAX-RPC)相关的类spring-support.jar

--------------------------------------------------------------------------------

该组件提供对Cacheehcache)、JCAJMX,邮件服务(Java MailCOS Mail),计划任务SchedulingTimerQuartz)支持的类spring-web.jar

--------------------------------------------------------------------------------

如果web开发中开发,而且用到用到spring框架,那就应该引入这个包,该组件包括WebApplicationContext特性的类、strutsJSF集成类、文件上传的支持类、Filter类和大量工具辅助类。

spring-webmvc.jar

--------------------------------------------------------------------------------

该组件包含Spring MVC框架相关的所有类,包含国际化、标签、Theme、视图展现的FreeMarkerJasperReportsTilesVelocityXSLT相关类。如果使用了独立的MVC框架则该组件不再需要。

spring-mock.jar

--------------------------------------------------------------------------------

这个文件中包含Spring一整套mock类来辅助应用的测试。spring测试套件使用了大量的mock类,这样测试就更加简单了。由于可以对HttpServletRequestHttpServletResponse进行模拟,使得对web进行单元测试更加方便。包间引用关系:Spring中各个包引入之前都需要保证引入 commons-logging.jar

spring-core.jar commons-collections.jarspring-core.jar 是以下其他各个组件的基础。

 

spring-beans.jar spring-core.jar/cglib-nodep-2.1_3.jar

spring-aop.jar spring-core.jar/spring-beans.jar/cglib-nodep-2.1_3.jar/aopalliance.jar

spring-context.jar spring-core.jar/spring-beans.jar/spring-aop.jar/commons-collections.jar/aopalliance.jar

spring-dao.jar spring-core.jar/spring-beans.jar/spring-aop.jar/spring-context.jar

spring-jdbc.jar spring-core.jar/spring-beans.jar/spring-dao.jar

spring-web.jar spring-core.jar/spring-beans.jar/spring-context.jar

spring-webmvc.jar spring-core.jar/spring-beans.jar/spring-context.jar/spring-web.jar

spring-hibernate.jar spring-core.jar/spring-beans.jar/spring-aop.jar/spring-dao.jar/spring-jdbc.jar/spring-orm.jar/spring-web.jar/spring-webmvc.jar

spring-orm.jar spring-core.jar/spring-beans.jar/spring-aop.jar/spring-dao.jar/spring-jdbc.jar/spring-web.jar/spring-webmvc.jar

spring-remoting.jar spring-core.jar/spring-beans.jar/spring-aop.jar/spring-dao.jar/spring-context.jar/spring-web.jar/spring-webmvc.jar

spring-support.jar spring-core.jar/spring-beans.jar/spring-aop.jar/spring-dao.jar/spring-context.jar/spring-jdbc.jar

spring-mock.jar spring-core.jar/spring-beans.jar/spring-dao.jar/spring-context.jar/spring-jdbc.jar

 

 

2009-12-22

关于Spring的基于Proxy的AOP实现:

我们知道,在Spring中,默认的AOP实现方式是通过代理(JDK的动态代理和CGLIB),既然是基于代理,这里就有些“特殊”情况是代理做不到的:

对Protected/Private方法和构造方法无法拦截,对内部被调用的方法无法拦截!如果对上面的情况进行拦截,需要使用spring的native AspectJ weaving。

 

关于AOP实现方式的选择:

有两种方式可供选择:使用Spring的基于代理的AOP实现和使用AspectJ

显然,方式一的问题是:它只能拦截SpringIOC窗口里的Bean,像Domain Object就无法拦截!这时只能使用AspectJ.一个例子就是oobbs系统中那个ThreadPublishService,这个服务要拦截领域对象Thread的addPost方法,进而向订阅用户发送消息。这里,被拦截对象Thread不在Spring管理范围内!此时,只能通过AspectJ来实现了。

jdbc.jar

jdbc.jarjdbc.jar

 

 

2010-2-10

 

关于field注入和setter注入

过去对两种注入的区别没有太在意过,最近一个配制让我明白了这两都之间的差别:

两先,两者都是以反射的形式执行注入的,区别正在于它们的名字所直接表达的,对于field注入,值将直接注入到字段上!(不会通过setter来设值!),而对于setter注入来说,是通过执行setter方法进行注入的。也就是说有这一种情况:如果我的setter方法中还有一些其他的操作,你希望在注入时要执行这条些逻辑,这时你需要使用setter注入,如果你用了field注入,则setter中的任何操作都不会执行!

在Forum中注入ForumThreandCollection的例子中,setForumThreandCollection方法需要把注入进的collection设上forum的引用,这情况下,必须使用setter注入!

 

使用基于注解的IOC的配制要点:

1.首先记得在spring的配制文件中加入<context:annotation-config />,声明将要使用注解,否则所有注解都不会生效。

2.准确使用注解,区分setter,field注入的区别!

 

 

 

本文转载自:http://blog.csdn.net/bluishglc/article/details/4615711

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
Spring task的异步定时任务

背景 有时候,我们需要一些定时任务,帮助我们完成一些日常的操作,从而让我们从琐碎的工作解脱出来,这里使用Spring Task定时异步任务来处理。 步骤 配置命名空间 配置Spring Task Note:这里...

亚林瓜子 ⋅ 06/12 ⋅ 0

spring传统xml配置okhttp3

问题 后端服务需要使用http客户端请求其他服务支持,项目中需要将HttpClient换成OKhttp,为啥要换OKhttp?这里不讨论这两者之间的优缺点。这篇文章主要关注与Spring传统xml配置方式集成Okhtt...

亚林瓜子 ⋅ 04/19 ⋅ 0

Spring 3 MVC and JSR303 @Valid example

In Spring 3, you can enable “mvc:annotation-driven” to support JSR303 bean validation via annotation, if any JSR 303 validator framework on the classpath. Note Hibernate Vali......

凯文加内特 ⋅ 2015/10/10 ⋅ 0

Spring Boot中日志每日分割

问题 想使用Spring Boot中日志输出,这样以后遇到问题,就可以翻看日志数据,看看程序运行的过程,便于排查错误。 logback基础配置 logback-spring.xml application.properties 上面两步,主...

亚林瓜子 ⋅ 06/12 ⋅ 0

Spring Cloud Zookeeper 2.0.0 发布,更新 Curator

Spring Cloud Zookeeper 2.0.0 已发布,主要将使用的 Curator 版本更新至了 4.0.1 。 该版本还包含以下 3 个 issue: DiscoveryClient bean not found in DiscoveryClientConfigServiceBoot......

淡漠悠然 ⋅ 06/20 ⋅ 0

刨根问底:Spring Boot中HandlerInterceptor没有拦截静态资源问题

在Spring Boot中设置了HandlerInterceptor,发现对于js、css等文件都没有起作用。 定义一个HandlerInterceptor 将HandlerInterceptor匹配到所有路径 这时虽然PathPatterns设置了“/**”,但是...

大神带我来搬砖 ⋅ 05/29 ⋅ 0

spring mvc 导入外部包后,启动TOMCAT报错

初学spring mvc,想做个简单的demo——用户登录功能。 分别建立了daily-note-hibernatedao和dail-web两个项目。 daily-note-hibernatedao用于对数据库的访问及CRUD操作。 dail-web为spring mv...

彩云小斯 ⋅ 2016/03/04 ⋅ 1

Spring从MongoDB中下载文件之GridFS

问题 之前提到过以GridFS方式上传问题到MongoDB中:Spring保存文件到MongoDB之GridFS支持。现在需要从Mongodb中读取文件,应该怎么处理类? 解决 Maven 注解mongoDbFactory 获取文件流 Note...

亚林瓜子 ⋅ 06/12 ⋅ 0

Mybatis spring and mybatis and mybatis-springboot-starter

Mybatis spring and mybatis and mybatis-springboot-starter 这篇博文主要涉及到的是mybatis是怎么集成到spring已经spring boot的,有关mybatis的用法及其自身的源码 设计,我会到开另一个文...

来福马斯特 ⋅ 04/25 ⋅ 0

Spring boot的简单rest服务(非xml方式配置)

背景 简单使用spring boot配置一个rest服务,数据库主要使用mysql没有使用spring演示时候使用的h2(一种内存数据库)和lombok(通过注解的方式生成getter和setter方法,因为要在IDEA上面安装...

亚林瓜子 ⋅ 06/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部